Avoid updating the file descriptor list for poll() unless we really need to

refs #11014
This commit is contained in:
Gunnar Beutner 2016-01-28 07:19:32 +01:00
parent 85c962a587
commit 77abfed873

View File

@ -73,15 +73,16 @@ void SocketEvents::ThreadProc(void)
{
Utility::SetThreadName("SocketIO");
for (;;) {
pollfd *pfds;
pollfd *pfds = NULL;
int pfdcount;
typedef std::map<SOCKET, SocketEventDescriptor>::value_type SocketDesc;
for (;;) {
{
boost::mutex::scoped_lock lock(l_SocketIOMutex);
if (pfds == NULL) {
typedef std::map<SOCKET, SocketEventDescriptor>::value_type SocketDesc;
pfdcount = l_SocketIOSockets.size();
pfds = new pollfd[pfdcount];
@ -94,6 +95,10 @@ void SocketEvents::ThreadProc(void)
i++;
}
l_SocketIOFDChanged = false;
l_SocketIOCV.notify_all();
}
}
#ifdef _WIN32
@ -106,9 +111,8 @@ void SocketEvents::ThreadProc(void)
boost::mutex::scoped_lock lock(l_SocketIOMutex);
if (l_SocketIOFDChanged) {
l_SocketIOFDChanged = false;
l_SocketIOCV.notify_all();
delete [] pfds;
pfds = NULL;
continue;
}
}
@ -153,8 +157,6 @@ void SocketEvents::ThreadProc(void)
Log(LogCritical, "SocketEvents", "Exception of unknown type thrown in socket I/O handler.");
}
}
delete [] pfds;
}
}
@ -195,6 +197,7 @@ SocketEvents::~SocketEvents(void)
}
void SocketEvents::Register(Object *lifesupportObject)
{
{
boost::mutex::scoped_lock lock(l_SocketIOMutex);
@ -210,8 +213,9 @@ void SocketEvents::Register(Object *lifesupportObject)
l_SocketIOSockets[m_FD] = desc;
m_Events = true;
}
/* There's no need to wake up the I/O thread here. */
WakeUpThread(true);
}
void SocketEvents::Unregister(void)