[Libreoffice-commits] online.git: kit/Kit.cpp net/Socket.hpp

Tor Lillqvist (via logerrit) logerrit at kemper.freedesktop.org
Tue Jul 14 14:56:40 UTC 2020


 kit/Kit.cpp    |   49 +++++++++++++++++++++----------------------------
 net/Socket.hpp |    1 +
 2 files changed, 22 insertions(+), 28 deletions(-)

New commits:
commit 07bf5984305955725c1cfe0d5cada0b46d42dbc6
Author:     Tor Lillqvist <tml at collabora.com>
AuthorDate: Tue Jul 14 17:06:11 2020 +0300
Commit:     Tor Lillqvist <tml at collabora.com>
CommitDate: Tue Jul 14 16:56:20 2020 +0200

    Make objects and threads go away more reliably in the iOS app
    
    We probably used to have circular references that made KitSocketPoll
    and KitWebSocketHandler objects hang around forever, or something.
    (Not a problem in web-based Online where kit processes have a
    restricted lifetime.)
    
    Change-Id: Ia6eebc51f4a4a8fb4f69a2c83a0131de921ea1d6
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/98744
    Tested-by: Jenkins
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Tor Lillqvist <tml at collabora.com>

diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index f10493e50..284e552f3 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -1623,19 +1623,7 @@ class KitSocketPoll final : public SocketPoll
 public:
     ~KitSocketPoll()
     {
-#ifdef IOS
-        std::unique_lock<std::mutex> lock(KSPollsMutex);
-        std::shared_ptr<KitSocketPoll> p;
-        auto i = KSPolls.begin();
-        for (; i != KSPolls.end(); ++i)
-        {
-            p = i->lock();
-            if (p && p.get() == this)
-                break;
-        }
-        assert(i != KSPolls.end());
-        KSPolls.erase(i);
-#endif
+        // Just to make it easier to set a breakpoint
     }
 
     static std::shared_ptr<KitSocketPoll> create()
@@ -1645,7 +1633,6 @@ public:
 #ifdef IOS
         std::unique_lock<std::mutex> lock(KSPollsMutex);
         KSPolls.push_back(result);
-        // KSPollsCV.notify_one();
 #endif
         return result;
     }
@@ -1762,6 +1749,11 @@ public:
     {
     }
 
+    ~KitWebSocketHandler()
+    {
+        // Just to make it easier to set a breakpoint
+    }
+
 protected:
     void handleMessage(const std::vector<char>& data) override
     {
@@ -1881,10 +1873,13 @@ protected:
         SigUtil::setTerminationFlag();
 #endif
 #ifdef IOS
-        std::unique_lock<std::mutex> lock(_ksPoll->terminationMutex);
-        _ksPoll->terminationFlag = true;
-        _ksPoll->terminationCV.notify_all();
+        {
+            std::unique_lock<std::mutex> lock(_ksPoll->terminationMutex);
+            _ksPoll->terminationFlag = true;
+            _ksPoll->terminationCV.notify_all();
+        }
 #endif
+        _ksPoll.reset();
     }
 };
 
@@ -1903,22 +1898,20 @@ int pollCallback(void* pData, int timeoutUs)
         return reinterpret_cast<KitSocketPoll*>(pData)->kitPoll(timeoutUs);
 #else
     std::unique_lock<std::mutex> lock(KitSocketPoll::KSPollsMutex);
-    if (KitSocketPoll::KSPolls.size() == 0)
+    std::vector<std::shared_ptr<KitSocketPoll>> v;
+    for (const auto &i : KitSocketPoll::KSPolls)
+    {
+        auto p = i.lock();
+        if (p)
+            v.push_back(p);
+    }
+    lock.unlock();
+    if (v.size() == 0)
     {
-        // KitSocketPoll::KSPollsCV.wait(lock);
-        lock.unlock();
         std::this_thread::sleep_for(std::chrono::microseconds(timeoutUs));
     }
     else
     {
-        std::vector<std::shared_ptr<KitSocketPoll>> v;
-        for (const auto &i : KitSocketPoll::KSPolls)
-        {
-            auto p = i.lock();
-            if (p)
-                v.push_back(p);
-        }
-        lock.unlock();
         for (const auto &p : v)
             p->kitPoll(timeoutUs);
     }
diff --git a/net/Socket.hpp b/net/Socket.hpp
index 9ee336950..84b4bfafd 100644
--- a/net/Socket.hpp
+++ b/net/Socket.hpp
@@ -799,6 +799,7 @@ public:
         {
             assertCorrectThread();
             _socketHandler->onDisconnect();
+            _socketHandler.reset();
         }
 
         if (!_shutdownSignalled)


More information about the Libreoffice-commits mailing list