[Libreoffice-commits] online.git: Branch 'private/hcvcastro/forking' - loolwsd/LOOLBroker.cpp loolwsd/LOOLKit.cpp
Michael Meeks
michael.meeks at collabora.com
Mon Aug 17 09:03:19 PDT 2015
loolwsd/LOOLBroker.cpp | 38 ++++++++++++++------
loolwsd/LOOLKit.cpp | 89 +++++++++++++++++++++++++++++--------------------
2 files changed, 79 insertions(+), 48 deletions(-)
New commits:
commit d855d3b63614631b9fe2d65dfd0b4234c6d80850
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Mon Aug 17 17:12:45 2015 +0100
Make LOOLKit re-usable more easily.
diff --git a/loolwsd/LOOLBroker.cpp b/loolwsd/LOOLBroker.cpp
index b245376..70ac266 100644
--- a/loolwsd/LOOLBroker.cpp
+++ b/loolwsd/LOOLBroker.cpp
@@ -34,6 +34,13 @@
#include "Util.hpp"
+// First include the grist of the helper process - ideally
+// we can avoid execve and share lots of memory here. We
+// can't link to a non-PIC translation unit though, so
+// include to share.
+#define LOOKIT_NO_MAIN 1
+#include "LOOLKit.cpp"
+
#define INTERVAL_PROBES 10
#define MAINTENANCE_INTERVAL 1
@@ -215,13 +222,18 @@ static std::map<Poco::Process::PID, Poco::UInt64> _childProcesses;
static int prefixcmp(const char *str, const char *prefix)
{
- for (; ; str++, prefix++)
- if (!*prefix)
- return 0;
- else if (*str != *prefix)
- return (unsigned char)*prefix - (unsigned char)*str;
+ for (; ; str++, prefix++)
+ if (!*prefix)
+ return 0;
+ else if (*str != *prefix)
+ return (unsigned char)*prefix - (unsigned char)*str;
}
+/// Initializes LibreOfficeKit for cross-fork re-use.
+static bool globalPreinit()
+{
+ return false;
+}
static int createLibreOfficeKit(std::string loSubPath, Poco::UInt64 childID)
{
@@ -266,12 +278,11 @@ int main(int argc, char** argv)
while (argc > 0)
{
- char *cmd = argv[0];
- char *eq = NULL;
- if (strstr(cmd, "loolbroker"))
+ char *cmd = argv[0];
+ char *eq = NULL;
+ if (strstr(cmd, "loolbroker"))
{
-
- }
+ }
if (!prefixcmp(cmd, "--losubpath="))
{
eq = strchrnul(cmd, '=');
@@ -303,8 +314,8 @@ int main(int argc, char** argv)
_numPreSpawnedChildren = std::stoi(std::string(++eq));
}
- argv++;
- argc--;
+ argv++;
+ argc--;
}
if (loSubPath.empty())
@@ -337,6 +348,9 @@ int main(int argc, char** argv)
exit(1);
}
+
+ globalPreinit();
+
std::unique_lock<std::mutex> rngLock(_rngMutex);
Poco::UInt64 _childId = (((Poco::UInt64)_rng.next()) << 32) | _rng.next() | 1;
rngLock.unlock();
diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp
index e47ca4d..8315440 100644
--- a/loolwsd/LOOLKit.cpp
+++ b/loolwsd/LOOLKit.cpp
@@ -7,12 +7,15 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
+/*
+ * NB. this file is compiled both standalone, and as part of the LOOLBroker.
+ */
+
#include <sys/prctl.h>
#include <memory>
#include <iostream>
-#include <Poco/NamedMutex.h>
#include <Poco/Util/Application.h>
#include <Poco/Net/WebSocket.h>
#include <Poco/Net/HTTPClientSession.h>
@@ -89,42 +92,10 @@ static int prefixcmp(const char *str, const char *prefix)
const int MASTER_PORT_NUMBER = 9981;
const std::string CHILD_URI = "/loolws/child/";
-int main(int argc, char** argv)
+void run_lok_main(const std::string &loSubPath, Poco::UInt64 _childId)
{
- std::string loSubPath;
- Poco::UInt64 _childId = 0;
-
- while (argc > 0)
- {
- char *cmd = argv[0];
- char *eq = NULL;
- if (!prefixcmp(cmd, "--losubpath="))
- {
- eq = strchrnul(cmd, '=');
- if (*eq)
- loSubPath = std::string(++eq);
- }
- else if (!prefixcmp(cmd, "--child="))
- {
- eq = strchrnul(cmd, '=');
- if (*eq)
- _childId = std::stoll(std::string(++eq));
- }
- argv++;
- argc--;
- }
-
- if (loSubPath.empty())
- {
- std::cout << Util::logPrefix() << "--losubpath is empty" << std::endl;
- exit(1);
- }
-
- if ( !_childId )
- {
- std::cout << Util::logPrefix() << "--child is 0" << std::endl;
- exit(1);
- }
+ assert (_childId != 0);
+ assert (!loSubPath.empty());
try
{
@@ -211,7 +182,53 @@ int main(int argc, char** argv)
}
std::cout << Util::logPrefix() << "loolkit finished OK!" << std::endl;
+}
+
+#ifdef LOOLKIT_NO_MAIN
+
+/// Simple argument parsing wrapper / helper for the above.
+int main(int argc, char** argv)
+{
+ std::string loSubPath;
+ Poco::UInt64 _childId = 0;
+
+ while (argc > 0)
+ {
+ char *cmd = argv[0];
+ char *eq = NULL;
+ if (!prefixcmp(cmd, "--losubpath="))
+ {
+ eq = strchrnul(cmd, '=');
+ if (*eq)
+ loSubPath = std::string(++eq);
+ }
+ else if (!prefixcmp(cmd, "--child="))
+ {
+ eq = strchrnul(cmd, '=');
+ if (*eq)
+ _childId = std::stoll(std::string(++eq));
+ }
+ argv++;
+ argc--;
+ }
+
+ if (loSubPath.empty())
+ {
+ std::cout << Util::logPrefix() << "--losubpath is empty" << std::endl;
+ exit(1);
+ }
+
+ if ( !_childId )
+ {
+ std::cout << Util::logPrefix() << "--child is 0" << std::endl;
+ exit(1);
+ }
+
+ run_lok_main(loSubPath, _childId);
+
return 0;
}
+#endif
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list