[Libreoffice-commits] online.git: Branch 'private/Ashod/nonblocking' - net/socket.hpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Sat Feb 18 21:18:14 UTC 2017


 net/socket.hpp |   61 ++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 37 insertions(+), 24 deletions(-)

New commits:
commit 0fc77d002b7c076fc3ece7ebd249170f6c20b85f
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sat Feb 18 15:27:27 2017 -0500

    nb: move handleIncomingMessage to BufferingSocket
    
    Change-Id: Iddcac9a9ca51f060e32b8f2600518e4a7cea98d2
    Reviewed-on: https://gerrit.libreoffice.org/34413
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/net/socket.hpp b/net/socket.hpp
index 780c390..f350c0b 100644
--- a/net/socket.hpp
+++ b/net/socket.hpp
@@ -299,7 +299,14 @@ public:
 
         // FIXME: need to close input, but not output (?)
         if (events & POLLIN)
+        {
+            const size_t oldSize = _inBuffer.size();
             closeSocket = !readIncomingData();
+            if (oldSize != _inBuffer.size())
+            {
+                handleIncomingMessage();
+            }
+        }
 
         if (events & POLLOUT)
             writeOutgoingData();
@@ -323,10 +330,6 @@ public:
         return (_outBuffer.empty() ? POLLIN : POLLIN | POLLOUT);
     }
 
-    /// Override to handle read data.
-    /// Called after successful socket reads.
-    virtual void handleIncomingMessage() = 0;
-
 protected:
     BufferingSocket(const int fd) :
         Socket(fd)
@@ -335,6 +338,11 @@ protected:
 
     std::vector< char > _inBuffer;
     std::vector< char > _outBuffer;
+
+private:
+    /// Override to handle read data.
+    /// Called after successful socket reads.
+    virtual void handleIncomingMessage() = 0;
 };
 
 /// A plain, non-blocking, data streaming socket.
@@ -345,7 +353,6 @@ public:
     {
         ssize_t len;
         char buf[4096];
-        bool gotNewData = false;
         do
         {
             // Drain the read buffer.
@@ -355,20 +362,16 @@ public:
                 len = ::read(getFD(), buf, sizeof(buf));
             }
             while (len < 0 && errno == EINTR);
+
             if (len > 0)
             {
                 assert (len < ssize_t(sizeof(buf)));
                 _inBuffer.insert(_inBuffer.end(), &buf[0], &buf[len]);
-                gotNewData = true;
+                continue;
             }
             // else poll will handle errors.
         }
-        while (len > 0);
-
-        if (gotNewData)
-        {
-            handleIncomingMessage();
-        }
+        while (false);
 
         return len != 0; // zero is eof / clean socket close.
     }
@@ -429,19 +432,25 @@ public:
         char buf[4096];
         do
         {
-            len = SSL_read(_ssl, buf, sizeof(buf));
+            // Drain the read buffer.
+            // TODO: Cap the buffer size, lest we grow beyond control.
+            do
+            {
+                len = SSL_read(_ssl, buf, sizeof(buf));
+            }
+            while (len < 0 && errno == EINTR);
+
+            if (len > 0)
+            {
+                assert (len < ssize_t(sizeof(buf)));
+                _inBuffer.insert(_inBuffer.end(), &buf[0], &buf[len]);
+                continue;
+            }
+            // else poll will handle errors.
         }
-        while (len < 0 && errno == EINTR);
+        while (false);
 
         len = handleSslState(len);
-        if (len > 0)
-        {
-            // We have more data, let the application consume it, if possible.
-            assert (len < ssize_t(sizeof(buf)));
-            _inBuffer.insert(_inBuffer.end(), &buf[0], &buf[len]);
-            handleIncomingMessage();
-        }
-        // else poll will handle errors.
 
         return len != 0; // zero is eof / clean socket close.
     }
@@ -479,14 +488,18 @@ public:
         }
         while (len < 0 && errno == EINTR);
 
-        len = handleSslState(len);
         if (len > 0)
         {
             // We've sent some data, remove from the buffer.
             _outBuffer.erase(_outBuffer.begin(),
                              _outBuffer.begin() + len);
         }
-        // else poll will handle errors
+        else
+        {
+            // Update the SSL state, poll will
+            // handle any fatal socket errors.
+            handleSslState(len);
+        }
     }
 
     int getPollEvents() override


More information about the Libreoffice-commits mailing list