loolwsd/LOOLBroker.cpp | 23 ------------- loolwsd/LOOLKit.cpp | 82 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 78 insertions(+), 27 deletions(-)
New commits: commit db1d1ff935890117ab4b8c4a3002511a88c870dd Author: Henry Castro <hcas...@collabora.com> Date: Mon Dec 28 23:18:49 2015 -0400 loolwsd: loolkit handle signals diff --git a/loolwsd/LOOLBroker.cpp b/loolwsd/LOOLBroker.cpp index 624d536..e2dc541 100644 --- a/loolwsd/LOOLBroker.cpp +++ b/loolwsd/LOOLBroker.cpp @@ -62,7 +62,6 @@ const std::string FIFO_BROKER = "/tmp/loolbroker.fifo"; const std::string BROKER_SUFIX = ".fifo"; const std::string BROKER_PREFIX = "/tmp/lokit"; -static volatile bool TerminationFlag = false; static int readerChild = -1; static int readerBroker = -1; @@ -76,28 +75,6 @@ static std::map<std::string, Process::PID> _cacheURL; namespace { - void handleSignal(int aSignal) - { - Log::info() << "Signal received: " << strsignal(aSignal) << Log::end; - TerminationFlag = true; - } - - void setSignals(bool isIgnored) - { -#ifdef __linux - struct sigaction aSigAction; - - sigemptyset(&aSigAction.sa_mask); - aSigAction.sa_flags = 0; - aSigAction.sa_handler = (isIgnored ? SIG_IGN : handleSignal); - - sigaction(SIGTERM, &aSigAction, NULL); - sigaction(SIGINT, &aSigAction, NULL); - sigaction(SIGQUIT, &aSigAction, NULL); - sigaction(SIGHUP, &aSigAction, NULL); -#endif - } - ThreadLocal<std::string> sourceForLinkOrCopy; ThreadLocal<Path> destinationForLinkOrCopy; diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index 6b9acce..f3b25a0 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -60,6 +60,66 @@ using Poco::FastMutex; const std::string CHILD_URI = "/loolws/child/"; const std::string LOKIT_BROKER = "/tmp/loolbroker.fifo"; +#ifndef LOOLKIT_NO_MAIN +// handle the signals when we are not using shared pages, execv() system call +static volatile bool TerminationFlag = false; + +namespace +{ + void handleSignal(int aSignal) + { + Log::info() << "Signal received: " << strsignal(aSignal) << Log::end; + TerminationFlag = true; + } + + void setSignals(bool isIgnored) + { +#ifdef __linux + struct sigaction aSigAction; + + sigemptyset(&aSigAction.sa_mask); + aSigAction.sa_flags = 0; + aSigAction.sa_handler = (isIgnored ? SIG_IGN : handleSignal); + + sigaction(SIGTERM, &aSigAction, NULL); + sigaction(SIGINT, &aSigAction, NULL); + sigaction(SIGQUIT, &aSigAction, NULL); + sigaction(SIGHUP, &aSigAction, NULL); +#endif + } +} + +#else +// handle the signals when we are using shared pages, fork() system call +static volatile bool TerminationFlag = false; + +namespace +{ + void handleSignal(int aSignal) + { + Log::info() << "Signal received: " << strsignal(aSignal) << Log::end; + TerminationFlag = true; + } + + void setSignals(bool isIgnored) + { +#ifdef __linux + struct sigaction aSigAction; + + sigemptyset(&aSigAction.sa_mask); + aSigAction.sa_flags = 0; + aSigAction.sa_handler = (isIgnored ? SIG_IGN : handleSignal); + + sigaction(SIGTERM, &aSigAction, NULL); + sigaction(SIGINT, &aSigAction, NULL); + sigaction(SIGQUIT, &aSigAction, NULL); + sigaction(SIGHUP, &aSigAction, NULL); +#endif + } +} + +#endif + // This thread handles callbacks from the // lokit instance. class CallBackWorker: public Runnable @@ -241,7 +301,7 @@ public: #endif Log::debug("Thread [" + thread_name + "] started."); - while ( true ) + while (!TerminationFlag) { Notification::Ptr aNotification(_queue.waitDequeueNotification()); if (aNotification) @@ -359,6 +419,11 @@ public: return _thread.isRunning(); } + void join() + { + _thread.join(); + } + LibreOfficeKitDocument * getLOKitDocument() { return (_session ? _session->_loKitDocument : nullptr); @@ -439,7 +504,6 @@ public: ~Connection() { Log::info("Closing connection in child: " + _childId + ", thread: " + _sessionId); - //_thread.stop(); } private: @@ -455,7 +519,7 @@ void run_lok_main(const std::string &loSubPath, const std::string& childId, cons { struct pollfd aPoll; ssize_t nBytes = -1; - char aBuffer[1024*2]; + char aBuffer[1024]; char* pStart = nullptr; char* pEnd = nullptr; @@ -469,6 +533,7 @@ void run_lok_main(const std::string &loSubPath, const std::string& childId, cons #ifdef __linux if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(thread_name.c_str()), 0, 0, 0) != 0) Log::error("Cannot set thread name to " + thread_name + "."); + setSignals(false); #endif Log::debug("Thread [" + thread_name + "] started."); @@ -512,7 +577,7 @@ void run_lok_main(const std::string &loSubPath, const std::string& childId, cons std::string aResponse; std::string aMessage; - while (true) + while (!TerminationFlag) { if ( pStart == pEnd ) { @@ -637,6 +702,8 @@ void run_lok_main(const std::string &loSubPath, const std::string& childId, cons } } + close(readerBroker); + close(writerBroker); } catch (const Exception& exc) { @@ -649,6 +716,13 @@ void run_lok_main(const std::string &loSubPath, const std::string& childId, cons Log::error(std::string("Exception: ") + exc.what()); } + // wait until loolwsd close all websockets + for (auto aIterator : _connections) + { + if (aIterator.second->isRunning()) + aIterator.second->join(); + } + // Get the document to destroy later. auto loKitDocument = _connections.size() > 0 ? _connections.begin()->second->getLOKitDocument() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits