[Libreoffice-commits] online.git: loolwsd/MessageQueue.cpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Fri Nov 25 03:40:41 UTC 2016


 loolwsd/MessageQueue.cpp |   24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

New commits:
commit f7ee76cbde9634499dfc8f7ccbd7149040741ed8
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Wed Nov 23 00:21:53 2016 -0500

    loolwsd: simplify duplicate message detection
    
    Change-Id: I54b9d7905a429c35c60062b51203db56d639b6b5
    Reviewed-on: https://gerrit.libreoffice.org/31119
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loolwsd/MessageQueue.cpp b/loolwsd/MessageQueue.cpp
index 1a6ce84..db9d223 100644
--- a/loolwsd/MessageQueue.cpp
+++ b/loolwsd/MessageQueue.cpp
@@ -154,23 +154,23 @@ void TileQueue::removeDuplicate(const std::string& tileMsg)
 {
     assert(LOOLProtocol::getFirstToken(tileMsg) == "tile");
 
-    // FIXME: This looks rather fragile; but OTOH if I understand correctly this doesn't handle
-    // input from clients, but strings we have created ourselves here in C++ code, so probably we
-    // can be sure that the "ver" parameter is always in such a location that this does what we
-    // mean.
-    // FIXME: also the ver=... is only for debugging from what I can see, so
-    // double-check if we can actually avoid the 'ver' everywhere in the non-debug
-    // builds
-    const std::string newMsg = tileMsg.substr(0, tileMsg.find(" ver"));
+    // Ver is always provided at this point and it is necessary to
+    // return back to clients the last rendered version of a tile
+    // in case there are new invalidations and requests while rendering.
+    // Here we compare duplicates without 'ver' since that's irrelevant.
+    auto newMsgPos = tileMsg.find(" ver");
+    if (newMsgPos == std::string::npos)
+    {
+        newMsgPos = tileMsg.size() - 1;
+    }
 
     for (size_t i = 0; i < _queue.size(); ++i)
     {
         auto& it = _queue[i];
-        const std::string old(it.data(), it.size());
-        const std::string oldMsg = old.substr(0, old.find(" ver"));
-        if (newMsg == oldMsg)
+        if (it.size() > newMsgPos &&
+            strncmp(tileMsg.data(), it.data(), newMsgPos) == 0)
         {
-            LOG_DBG("Remove duplicate message: " << old << " -> " << tileMsg);
+            LOG_TRC("Remove duplicate message: " << std::string(it.data(), it.size()) << " -> " << tileMsg);
             _queue.erase(_queue.begin() + i);
             break;
         }


More information about the Libreoffice-commits mailing list