[Libreoffice-commits] online.git: gtk/mobile.cpp kit/Kit.cpp

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Oct 17 20:30:50 UTC 2018


 gtk/mobile.cpp |   35 ++++++++++++++++++++++++-----------
 kit/Kit.cpp    |   12 +++++++-----
 2 files changed, 31 insertions(+), 16 deletions(-)

New commits:
commit fc2023723e9a9e9cb2afc9436ce5db652d390464
Author:     Tor Lillqvist <tml at collabora.com>
AuthorDate: Wed Oct 17 23:25:28 2018 +0300
Commit:     Tor Lillqvist <tml at collabora.com>
CommitDate: Wed Oct 17 23:30:26 2018 +0300

    Attempt to fix the thread problems in the GTK+ testbed app
    
    Use g_idle_add() to make the webkit_web_view_run_javascript() call run
    on the GTK+ thread. Correspondingly, need to use a separate
    short-lived thread to do the fakeSocketWrite() calls from
    handle_lool_message(), so that the GTK+ main loop is ready to run the
    added lambda. Or something like that.
    
    Now it gets a bit further, doesn't crash, but just sudddenly exits
    before showing the document even.

diff --git a/gtk/mobile.cpp b/gtk/mobile.cpp
index b28e9129b..760d62c10 100644
--- a/gtk/mobile.cpp
+++ b/gtk/mobile.cpp
@@ -113,7 +113,12 @@ static void send2JS(const std::vector<char>& buffer)
     LOG_TRC_NOFILE( "Evaluating JavaScript: " << subjs);
 
     char *jscopy = strdup(js.c_str());
-    webkit_web_view_run_javascript(webView, jscopy, NULL, send2JS_ready_callback, jscopy);
+    g_idle_add([](gpointer data)
+               {
+                   char *jscopy = (char*) data;
+                   webkit_web_view_run_javascript(webView, jscopy, NULL, send2JS_ready_callback, jscopy);
+                   return FALSE;
+               }, jscopy);
 }
 
 static void handle_debug_message(WebKitUserContentManager *manager,
@@ -201,11 +206,15 @@ static void handle_lool_message(WebKitUserContentManager *manager,
             // WebSocket.
             LOG_TRC_NOFILE("Actually sending to Online:" << fileURL);
 
-            struct pollfd pollfd;
-            pollfd.fd = fakeClientFd;
-            pollfd.events = POLLOUT;
-            fakeSocketPoll(&pollfd, 1, -1);
-            fakeSocketWrite(fakeClientFd, fileURL.c_str(), fileURL.size());
+            // Must do this in a thread, too, so that we can return to the GTK+ main loop
+            std::thread([]
+                        {
+                            struct pollfd pollfd;
+                            pollfd.fd = fakeClientFd;
+                            pollfd.events = POLLOUT;
+                            fakeSocketPoll(&pollfd, 1, -1);
+                            fakeSocketWrite(fakeClientFd, fileURL.c_str(), fileURL.size());
+                        }).detach();
         }
         else if (strcmp(string_value, "BYE") == 0)
         {
@@ -218,11 +227,15 @@ static void handle_lool_message(WebKitUserContentManager *manager,
         }
         else
         {
-            struct pollfd pollfd;
-            pollfd.fd = fakeClientFd;
-            pollfd.events = POLLOUT;
-            fakeSocketPoll(&pollfd, 1, -1);
-            fakeSocketWrite(fakeClientFd, string_value, strlen(string_value));
+            // As above
+            std::thread([&]
+                        {
+                            struct pollfd pollfd;
+                            pollfd.fd = fakeClientFd;
+                            pollfd.events = POLLOUT;
+                            fakeSocketPoll(&pollfd, 1, -1);
+                            fakeSocketWrite(fakeClientFd, string_value, strlen(string_value));
+                        }).detach();
         }
         g_free(string_value);
     }
diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index 10e1cb48b..abd4eabfe 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -2454,14 +2454,16 @@ void lokit_main(
 
 #else // MOBILEAPP
 
+#ifdef __linux
+        LibreOfficeKit *kit = lok_init_2(LO_PATH "/program", LO_PATH "/user");
+#else
         LibreOfficeKit *kit = lok_init_2(nullptr, nullptr);
+#endif
+
+        assert(kit);
 
         std::shared_ptr<lok::Office> loKit = std::make_shared<lok::Office>(kit);
-        if (!loKit)
-        {
-            LOG_FTL("LibreOfficeKit initialization failed. Exiting.");
-            std::_Exit(Application::EXIT_SOFTWARE);
-        }
+        assert(loKit);
 
         LOOLWSD::LOKitVersion = loKit->getVersionInfo();
 


More information about the Libreoffice-commits mailing list