net/socket.hpp | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-)
New commits: commit ddb0ea6a9d641488fd5a939fb4e0d2f69ae54da2 Author: Ashod Nakashian <[email protected]> Date: Sat Feb 18 13:48:44 2017 -0500 nb: drain the read buffer before dispatching Draining the buffer is the correct appraoch to avoid accumulating data in the kernel unnecessarily. But it also reduces the overhead of reparsing the incoming data for message boundaries. The client that is to parse the data should parse as many messages as possible and remove them from the socket buffer. Finally, we probably need to cap the maximum buffer size to avoid bloating. However this heavily depends on the application's max message size, assuming there is no separate buffer beyond that of the socket to accumulate the messages in. Change-Id: I49c4eccebd474cd07ca84f3f4eae33bc717ed1f2 Reviewed-on: https://gerrit.libreoffice.org/34411 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/net/socket.hpp b/net/socket.hpp index 0eec7f0..780c390 100644 --- a/net/socket.hpp +++ b/net/socket.hpp @@ -345,16 +345,30 @@ public: { ssize_t len; char buf[4096]; - do { - len = ::read(getFD(), buf, sizeof(buf)); - } while (len < 0 && errno == EINTR); - if (len > 0) + bool gotNewData = false; + do + { + // Drain the read buffer. + // TODO: Cap the buffer size, lest we grow beyond control. + do + { + 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; + } + // else poll will handle errors. + } + while (len > 0); + + if (gotNewData) { - 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. } _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
