flush send buffer on the background thread
This commit is contained in:
		| @@ -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<int> 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)); | ||||
|     } | ||||
|   | ||||
| @@ -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); | ||||
|     } | ||||
|   | ||||
| @@ -66,7 +66,13 @@ TEST_CASE("socket", "[socket]") | ||||
|         std::shared_ptr<Socket> 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; | ||||
|  | ||||
|   | ||||
| @@ -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' | ||||
|   | ||||
		Reference in New Issue
	
	Block a user