(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:
parent
cd4e51eacf
commit
2aaf59651e
@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
All changes to this project will be documented in this file.
|
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
|
## [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
|
(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
|
||||||
|
@ -60,6 +60,16 @@ namespace ix
|
|||||||
|
|
||||||
std::pair<bool, std::string> SocketServer::listen()
|
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)
|
if (_addressFamily != AF_INET && _addressFamily != AF_INET6)
|
||||||
{
|
{
|
||||||
std::string errMsg("SocketServer::listen() AF_INET and AF_INET6 are currently "
|
std::string errMsg("SocketServer::listen() AF_INET and AF_INET6 are currently "
|
||||||
@ -195,7 +205,12 @@ namespace ix
|
|||||||
if (_thread.joinable())
|
if (_thread.joinable())
|
||||||
{
|
{
|
||||||
_stop = true;
|
_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();
|
_thread.join();
|
||||||
_stop = false;
|
_stop = false;
|
||||||
}
|
}
|
||||||
@ -260,7 +275,12 @@ namespace ix
|
|||||||
if (_stop) return;
|
if (_stop) return;
|
||||||
|
|
||||||
// Use poll to check whether a new connection is in progress
|
// 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;
|
bool readyToRead = true;
|
||||||
PollResultType pollResult =
|
PollResultType pollResult =
|
||||||
Socket::poll(readyToRead, timeoutMs, _serverFd, _acceptSelectInterrupt);
|
Socket::poll(readyToRead, timeoutMs, _serverFd, _acceptSelectInterrupt);
|
||||||
|
@ -6,4 +6,4 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define IX_WEBSOCKET_VERSION "10.2.3"
|
#define IX_WEBSOCKET_VERSION "10.2.4"
|
||||||
|
Loading…
Reference in New Issue
Block a user