net/Socket.cpp | 2 ++ wsd/DocumentBroker.cpp | 8 +++++++- wsd/DocumentBroker.hpp | 4 ++++ wsd/LOOLWSD.cpp | 7 +++---- 4 files changed, 16 insertions(+), 5 deletions(-)
New commits: commit ce0dffdc12f22fdae9d937cfbcb58df032b126d9 Author: Michael Meeks <michael.me...@collabora.com> Date: Mon Mar 20 17:18:41 2017 +0000 Use callback API to implement alertAllUsers safely and simply. diff --git a/net/Socket.cpp b/net/Socket.cpp index 0e5d6eab..008070e3 100644 --- a/net/Socket.cpp +++ b/net/Socket.cpp @@ -171,6 +171,8 @@ void SocketPoll::dumpState(std::ostream& os) // FIXME: NOT thread-safe! _pollSockets is modified from the polling thread! os << " Poll [" << _pollSockets.size() << "] - wakeup r: " << _wakeup[0] << " w: " << _wakeup[1] << "\n"; + if (_newCallbacks.size() > 0) + os << "\tcallbacks: " << _newCallbacks.size() << "\n"; os << "\tfd\tevents\trsize\twsize\n"; for (auto &i : _pollSockets) i->dumpState(os); diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp index cfdec34a..936fee9a 100644 --- a/wsd/DocumentBroker.cpp +++ b/wsd/DocumentBroker.cpp @@ -863,6 +863,12 @@ size_t DocumentBroker::removeSessionInternal(const std::string& id) return _sessions.size(); } + +void DocumentBroker::addCallback(SocketPoll::CallbackFn fn) +{ + _poll->addCallback(fn); +} + void DocumentBroker::addSocketToPoll(const std::shared_ptr<Socket>& socket) { _poll->insertNewSocket(socket); @@ -870,7 +876,7 @@ void DocumentBroker::addSocketToPoll(const std::shared_ptr<Socket>& socket) void DocumentBroker::alertAllUsers(const std::string& msg) { - Util::assertIsLocked(_mutex); + assert(isCorrectThread()); auto payload = std::make_shared<Message>(msg, Message::Dir::Out); diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp index d3b87b8b..526f873d 100644 --- a/wsd/DocumentBroker.hpp +++ b/wsd/DocumentBroker.hpp @@ -270,6 +270,10 @@ public: /// Removes a session by ID. Returns the new number of sessions. size_t removeSession(const std::string& id, bool destroyIfLast = false); + /// Add a callback to be invoked in our polling thread. + void addCallback(SocketPoll::CallbackFn fn); + + /// Transfer this socket into our polling thread / loop. void addSocketToPoll(const std::shared_ptr<Socket>& socket); void alertAllUsers(const std::string& msg); diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp index b93098c6..120671e8 100644 --- a/wsd/LOOLWSD.cpp +++ b/wsd/LOOLWSD.cpp @@ -215,11 +215,10 @@ void alertAllUsersInternal(const std::string& msg) LOG_INF("Alerting all users: [" << msg << "]"); - //FIXME loolnb: due to thread-affinity of sockets we can't send from here. - // for (auto& brokerIt : DocBrokers) + for (auto& brokerIt : DocBrokers) { - // auto lock = brokerIt.second->getLock(); - // brokerIt.second->alertAllUsers(msg); + std::shared_ptr<DocumentBroker> docBroker = brokerIt.second; + docBroker->addCallback([msg, docBroker](){ docBroker->alertAllUsers(msg); }); } } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits