[Libreoffice-commits] online.git: net/Socket.hpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Wed Apr 5 04:47:50 UTC 2017


 net/Socket.hpp |    9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

New commits:
commit 463f26f417958d55270118f3aeac279ce689f2bc
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Wed Apr 5 00:26:31 2017 -0400

    wsd: mark detached sockets to have no owner
    
    The DocBroker might not get a chance to
    take ownership of a socket (which is done
    via callbacks that are invoked in the poll loop)
    if it (or WSD) is flagged for termination.
    
    In that case, DocBroker doesn't take ownership
    but ultimately needs to disconnect the socket.
    
    By detaching ownership we signal that any thread
    can rightly take ownership and thus avoid spurious
    warning or assertions.
    
    Change-Id: Idb192bfaac05c5c86809cb21876f3926a080b775
    Reviewed-on: https://gerrit.libreoffice.org/36117
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/net/Socket.hpp b/net/Socket.hpp
index f0a9975c..4fa51dce 100644
--- a/net/Socket.hpp
+++ b/net/Socket.hpp
@@ -198,7 +198,8 @@ public:
     virtual bool isCorrectThread()
     {
 #if ENABLE_DEBUG
-        const bool sameThread = std::this_thread::get_id() == _owner;
+        // 0 owner means detached and can be invoked by any thread.
+        const bool sameThread = (_owner == std::thread::id(0) || std::this_thread::get_id() == _owner);
         if (!sameThread)
             LOG_WRN("#" << _fd << " Invoked from foreign thread. Expected: 0x" << std::hex <<
                     _owner << " but called from 0x" << std::this_thread::get_id() << " (" <<
@@ -294,12 +295,13 @@ public:
     /// Are we running in either shutdown, or the polling thread.
     bool isCorrectThread() const
     {
-        if (std::this_thread::get_id() != _owner)
+        // 0 owner means detached and can be invoked by any thread.
+        if (_owner != std::thread::id(0) && std::this_thread::get_id() != _owner)
             LOG_WRN("Incorrect thread affinity for " << _name << ". Expected: 0x" << std::hex <<
                     _owner << " (" << std::dec << Util::getThreadId() << ") but called from 0x" <<
                     std::hex << std::this_thread::get_id() << std::dec << ", stop: " << _stop);
 
-        return _stop || std::this_thread::get_id() == _owner;
+        return _stop || _owner == std::thread::id(0) || std::this_thread::get_id() == _owner;
     }
 
     /// Poll the sockets for available data to read or buffer to write.
@@ -392,6 +394,7 @@ public:
             {
                 LOG_DBG("Removing socket #" << _pollFds[i].fd << " (of " <<
                         _pollSockets.size() << ") from " << _name);
+                _pollSockets[i]->setThreadOwner(std::thread::id(0));
                 _pollSockets.erase(_pollSockets.begin() + i);
             }
         }


More information about the Libreoffice-commits mailing list