(socket server) in the loop accepting connections, call select without a timeout on unix to avoid busy looping, and only wake up when a new connection happens

This commit is contained in:
Benjamin Sergeant 2020-08-15 18:32:59 -07:00
parent cd4e51eacf
commit 2aaf59651e
3 changed files with 27 additions and 3 deletions

View File

@ -2,6 +2,10 @@
All changes to this project will be documented in this file.
## [10.2.4] - 2020-08-15
(socket server) in the loop accepting connections, call select without a timeout on unix to avoid busy looping, and only wake up when a new connection happens
## [10.2.3] - 2020-08-15
(socket server) instead of busy looping with a sleep, only wake up the GC thread when a new thread will have to be joined, (we know that thanks to the ConnectionState OnSetTerminated callback

View File

@ -60,6 +60,16 @@ namespace ix
std::pair<bool, std::string> SocketServer::listen()
{
std::string acceptSelectInterruptInitErrorMsg;
if (!_acceptSelectInterrupt->init(acceptSelectInterruptInitErrorMsg))
{
std::stringstream ss;
ss << "SocketServer::listen() error in SelectInterrupt::init: "
<< acceptSelectInterruptInitErrorMsg;
return std::make_pair(false, ss.str());
}
if (_addressFamily != AF_INET && _addressFamily != AF_INET6)
{
std::string errMsg("SocketServer::listen() AF_INET and AF_INET6 are currently "
@ -195,7 +205,12 @@ namespace ix
if (_thread.joinable())
{
_stop = true;
_acceptSelectInterrupt->notify(SelectInterrupt::kCloseRequest); // Wake up select
// Wake up select
if (!_acceptSelectInterrupt->notify(SelectInterrupt::kCloseRequest))
{
logError("SocketServer::stop: Cannot wake up from select");
}
_thread.join();
_stop = false;
}
@ -260,7 +275,12 @@ namespace ix
if (_stop) return;
// Use poll to check whether a new connection is in progress
int timeoutMs = 10;
int timeoutMs = -1;
#ifdef _WIN32
// select cannot be interrupted on Windows so we need to pass a small timeout
timeoutMs = 10;
#endif
bool readyToRead = true;
PollResultType pollResult =
Socket::poll(readyToRead, timeoutMs, _serverFd, _acceptSelectInterrupt);

View File

@ -6,4 +6,4 @@
#pragma once
#define IX_WEBSOCKET_VERSION "10.2.3"
#define IX_WEBSOCKET_VERSION "10.2.4"