[Libreoffice-commits] online.git: loolwsd/LOOLSession.cpp loolwsd/LOOLWSD.cpp loolwsd/LOOLWSD.hpp
Henry Castro
hcastro at collabora.com
Fri Jul 17 11:05:18 PDT 2015
loolwsd/LOOLSession.cpp | 2 +
loolwsd/LOOLWSD.cpp | 83 +++++++++++++++++++++++++++++++++---------------
loolwsd/LOOLWSD.hpp | 2 +
3 files changed, 62 insertions(+), 25 deletions(-)
New commits:
commit 99ca81a944b12a90ebdd744965b18850bae7baf8
Author: Henry Castro <hcastro at collabora.com>
Date: Fri Jul 17 14:02:25 2015 -0400
loolwsd: move server socket to parent process
diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp
index 75f1fdc..502010a 100644
--- a/loolwsd/LOOLSession.cpp
+++ b/loolwsd/LOOLSession.cpp
@@ -492,6 +492,8 @@ void MasterProcessSession::dispatchChild()
_availableChildSessions.erase(childSession);
std::cout << Util::logPrefix() << "_availableChildSessions size=" << _availableChildSessions.size() << std::endl;
+ if (_availableChildSessions.size() == 0)
+ LOOLWSD::_sharedForkChild.begin()[0] = 1;
lock.unlock();
// Assume a valid URI
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index e5be693..595f955 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -507,6 +507,7 @@ std::string LOOLWSD::jail;
std::mutex LOOLWSD::_rngMutex;
Random LOOLWSD::_rng;
static NamedMutex namedMutexLOOL("loolwsd");
+Poco::SharedMemory LOOLWSD::_sharedForkChild("loolwsd", sizeof(bool), Poco::SharedMemory::AM_WRITE);
int LOOLWSD::_numPreSpawnedChildren = 10;
#if ENABLE_DEBUG
@@ -811,6 +812,7 @@ void LOOLWSD::componentMain()
{
try
{
+
// initialisation
//_childId = Process::id();
@@ -997,30 +999,8 @@ void LOOLWSD::desktopMain()
Thread::sleep(std::stoul(std::getenv("SLEEPFORDEBUGGER")) * 1000);
}
- namedMutexLOOL.lock();
-
startupComponent(_numPreSpawnedChildren);
- // Start a server listening on the port for clients
- ServerSocket svs(portNumber, _numPreSpawnedChildren*10);
- ThreadPool threadPool(_numPreSpawnedChildren*2, _numPreSpawnedChildren*5);
- HTTPServer srv(new RequestHandlerFactory(), threadPool, svs, new HTTPServerParams);
-
- srv.start();
-
- // And one on the port for child processes
- SocketAddress addr2("127.0.0.1", MASTER_PORT_NUMBER);
- ServerSocket svs2(addr2, _numPreSpawnedChildren);
- ThreadPool threadPool2(_numPreSpawnedChildren*2, _numPreSpawnedChildren*5);
- HTTPServer srv2(new RequestHandlerFactory(), threadPool2, svs2, new HTTPServerParams);
-
- srv2.start();
-
- namedMutexLOOL.unlock();
-
- /* Pause for a second */
- sleep(1);
-
while (MasterProcessSession::_childProcesses.size() > 0)
{
int status;
@@ -1055,8 +1035,9 @@ void LOOLWSD::desktopMain()
else if (pid < 0)
std::cout << Util::logPrefix() << "Child error: " << strerror(errno);
- if (MasterProcessSession::getAvailableChildSessions() == 0 && MasterProcessSession::getPendingPreSpawnedChildren() == 0 )
+ if ( _sharedForkChild.begin()[0] )
{
+ _sharedForkChild.begin()[0] = 0;
std::cout << Util::logPrefix() << "No availabe child session, fork new one" << std::endl;
if (createComponent() < 0 )
break;
@@ -1110,6 +1091,8 @@ void LOOLWSD::loolMain()
_childId = (((Poco::UInt64)_rng.next()) << 32) | _rng.next() | 1;
rngLock.unlock();
+ namedMutexLOOL.lock();
+
startupDesktop(1);
#ifdef __linux
@@ -1118,12 +1101,62 @@ void LOOLWSD::loolMain()
dropCapability();
#endif
+ // Start a server listening on the port for clients
+ ServerSocket svs(portNumber, _numPreSpawnedChildren*10);
+ ThreadPool threadPool(_numPreSpawnedChildren*2, _numPreSpawnedChildren*5);
+ HTTPServer srv(new RequestHandlerFactory(), threadPool, svs, new HTTPServerParams);
+
+ srv.start();
+
+ // And one on the port for child processes
+ SocketAddress addr2("127.0.0.1", MASTER_PORT_NUMBER);
+ ServerSocket svs2(addr2, _numPreSpawnedChildren);
+ ThreadPool threadPool2(_numPreSpawnedChildren*2, _numPreSpawnedChildren*5);
+ HTTPServer srv2(new RequestHandlerFactory(), threadPool2, svs2, new HTTPServerParams);
+
+ srv2.start();
+
+ namedMutexLOOL.unlock();
+
Thread threadFile;
FileTransferHandler svrFile;
threadFile.start(svrFile);
- int status;
- waitpid(-1, &status, 0);
+ while (MasterProcessSession::_childProcesses.size() > 0)
+ {
+ int status;
+ pid_t pid = waitpid(-1, &status, WUNTRACED | WNOHANG);
+ if (pid > 0)
+ {
+ if ( MasterProcessSession::_childProcesses.find(pid) != MasterProcessSession::_childProcesses.end() )
+ {
+ if ((WIFEXITED(status) || WIFSIGNALED(status) || WTERMSIG(status) ) )
+ {
+ std::cout << Util::logPrefix() << "One of our known child processes died :" << std::to_string(pid) << std::endl;
+ MasterProcessSession::_childProcesses.erase(pid);
+ }
+
+ if ( WCOREDUMP(status) )
+ std::cout << Util::logPrefix() << "The child produced a core dump." << std::endl;
+
+ if ( WIFSTOPPED(status) )
+ std::cout << Util::logPrefix() << "The child process was stopped by delivery of a signal." << std::endl;
+
+ if ( WSTOPSIG(status) )
+ std::cout << Util::logPrefix() << "The child process was stopped." << std::endl;
+
+ if ( WIFCONTINUED(status) )
+ std::cout << Util::logPrefix() << "The child process was resumed." << std::endl;
+ }
+ else
+ {
+ std::cout << Util::logPrefix() << "None of our known child processes died :" << std::to_string(pid) << std::endl;
+ }
+ }
+ else if (pid < 0)
+ std::cout << Util::logPrefix() << "Child error: " << strerror(errno);
+
+ }
// Terminate child processes
for (auto i : MasterProcessSession::_childProcesses)
diff --git a/loolwsd/LOOLWSD.hpp b/loolwsd/LOOLWSD.hpp
index bccb98f..51e05ad 100644
--- a/loolwsd/LOOLWSD.hpp
+++ b/loolwsd/LOOLWSD.hpp
@@ -19,6 +19,7 @@
#include <Poco/Random.h>
#include <Poco/Path.h>
#include <Poco/Util/ServerApplication.h>
+#include <Poco/SharedMemory.h>
class LOOLWSD: public Poco::Util::ServerApplication
{
@@ -35,6 +36,7 @@ public:
static std::string childRoot;
static std::string loSubPath;
static std::string jail;
+ static Poco::SharedMemory _sharedForkChild;
static const int DEFAULT_CLIENT_PORT_NUMBER = 9980;
static const int MASTER_PORT_NUMBER = 9981;
More information about the Libreoffice-commits
mailing list