From 11092027cdf4bc1323675e0f1c00983c438f6af2 Mon Sep 17 00:00:00 2001 From: Benjamin Sergeant Date: Tue, 12 Mar 2019 21:49:26 -0700 Subject: [PATCH] flush send buffer on the background thread --- ixwebsocket/IXSocket.cpp | 8 ++------ ixwebsocket/IXWebSocketTransport.cpp | 10 +++++----- test/IXSocketTest.cpp | 8 +++++++- test/run.py | 1 + 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/ixwebsocket/IXSocket.cpp b/ixwebsocket/IXSocket.cpp index f721dfd5..d97c405a 100644 --- a/ixwebsocket/IXSocket.cpp +++ b/ixwebsocket/IXSocket.cpp @@ -79,9 +79,8 @@ namespace ix timeout.tv_sec = timeoutSecs; timeout.tv_usec = 1000 * timeoutMs; - // int sockfd = _sockfd; - // int nfds = (std::max)(sockfd, _eventfd.getFd()); - + // Compute the highest fd. + // FIXME / cleanup std::vector fds = { _sockfd, _eventfd.getFd(), _fildes[0] }; int nfds = -1; for (auto fd : fds) @@ -108,9 +107,6 @@ namespace ix void Socket::wakeUpFromPoll() { - // this will wake up the thread blocked on select, only needed on Linux - // _eventfd.notify(); - uint64_t value = 0; write(_fildes[1], &value, sizeof(value)); } diff --git a/ixwebsocket/IXWebSocketTransport.cpp b/ixwebsocket/IXWebSocketTransport.cpp index 070bd4f6..7a2577af 100644 --- a/ixwebsocket/IXWebSocketTransport.cpp +++ b/ixwebsocket/IXWebSocketTransport.cpp @@ -187,6 +187,10 @@ namespace ix return; } + // Make sure we send all the buffered data + // there can be a lot of it for large messages. + while (!isSendBufferEmpty() && !_requestInitCancellation) sendOnSocket(); + while (true) { ssize_t ret = _socket->recv((char*)&_readbuf[0], _readbuf.size()); @@ -586,11 +590,7 @@ namespace ix } } - // Make sure we send all the buffered data ; there can be a lot of it - // for large messages. - // TODO / this will block the sending thread ; we need to eval whether - // this is the right fix - while (!isSendBufferEmpty()) sendOnSocket(); + _socket->wakeUpFromPoll(); return WebSocketSendInfo(true, compressionError, payloadSize, wireSize); } diff --git a/test/IXSocketTest.cpp b/test/IXSocketTest.cpp index a024d999..0c409705 100644 --- a/test/IXSocketTest.cpp +++ b/test/IXSocketTest.cpp @@ -66,7 +66,13 @@ TEST_CASE("socket", "[socket]") std::shared_ptr socket(new Socket); std::string host("www.google.com"); int port = 80; - std::string request("GET / HTTP/1.1\r\n\r\n"); + + std::stringstream ss; + ss << "GET / HTTP/1.1\r\n"; + ss << "Host: " << host << "\r\n"; + ss << "\r\n"; + std::string request(ss.str()); + int expectedStatus = 200; int timeoutSecs = 3; diff --git a/test/run.py b/test/run.py index 5a4cd8e6..79fdacea 100644 --- a/test/run.py +++ b/test/run.py @@ -78,6 +78,7 @@ shutil.copy(os.path.join( 'zlib.dll'), '.') lldb = "lldb --batch -o 'run' -k 'thread backtrace all' -k 'quit 1'" +lldb = "" # Disabled for now testCommand = '{} {} {}'.format(lldb, testBinary, os.getenv('TEST', '')) ret = os.system(testCommand) assert ret == 0, 'Test command failed'