[Libreoffice-commits] online.git: Branch 'private/Ashod/nonblocking' - net/socket.hpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Mon Feb 20 04:37:40 UTC 2017
net/socket.hpp | 27 +++++++++++++++++----------
1 file changed, 17 insertions(+), 10 deletions(-)
New commits:
commit dca41f199451956d5f89535cb1042aceee5df79b
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Sun Feb 19 14:47:25 2017 -0500
nb: improved poll handler
We now always read new data, because
SSL might need to process internal buffers,
and call the app message handler as long
as it keeps consuming data.
Finally, we write when we have data
to flush, even if we didn't get POLLOUT
event, because SSL might need to do
handshake, which is handled by the write
handler.
Change-Id: I909333c3a0492b0830044d51ae478ac5981b1d90
Reviewed-on: https://gerrit.libreoffice.org/34448
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 5f63818..cea6fac 100644
--- a/net/socket.hpp
+++ b/net/socket.hpp
@@ -293,24 +293,31 @@ private:
class BufferingSocket : public Socket
{
public:
+
+ /// Called when a polling event is received.
+ /// @events is the mask of events that triggered the wake.
HandleResult handlePoll(const int events) override
{
+ // FIXME: need to close input, but not output (?)
bool closeSocket = false;
- // FIXME: need to close input, but not output (?)
- if (events & POLLIN)
+ // Always try to read.
+ closeSocket = !readIncomingData();
+
+ // If we have data, allow the app to consume.
+ size_t oldSize = 0;
+ while (!_inBuffer.empty() && oldSize != _inBuffer.size())
{
- size_t oldSize = _inBuffer.size();
- closeSocket = !readIncomingData();
- while (oldSize != _inBuffer.size())
- {
- oldSize = _inBuffer.size();
- handleIncomingMessage();
- }
+ oldSize = _inBuffer.size();
+ handleIncomingMessage();
}
- if (events & POLLOUT)
+ // SSL might want to do handshake,
+ // even if we have no data to write.
+ if ((events & POLLOUT) || !_outBuffer.empty())
+ {
writeOutgoingData();
+ }
if (events & (POLLHUP | POLLERR | POLLNVAL))
closeSocket = true;
More information about the Libreoffice-commits
mailing list