{
Utility::SetThreadName("SocketIO");
- for (;;) {
- pollfd *pfds;
- int pfdcount;
-
- typedef std::map<SOCKET, SocketEventDescriptor>::value_type SocketDesc;
+ pollfd *pfds = NULL;
+ int pfdcount;
+ for (;;) {
{
boost::mutex::scoped_lock lock(l_SocketIOMutex);
- pfdcount = l_SocketIOSockets.size();
- pfds = new pollfd[pfdcount];
+ if (pfds == NULL) {
+ typedef std::map<SOCKET, SocketEventDescriptor>::value_type SocketDesc;
+
+ pfdcount = l_SocketIOSockets.size();
+ pfds = new pollfd[pfdcount];
- int i = 0;
+ int i = 0;
- BOOST_FOREACH(const SocketDesc& desc, l_SocketIOSockets) {
- pfds[i].fd = desc.first;
- pfds[i].events = desc.second.Events;
- pfds[i].revents = 0;
+ BOOST_FOREACH(const SocketDesc& desc, l_SocketIOSockets) {
+ pfds[i].fd = desc.first;
+ pfds[i].events = desc.second.Events;
+ pfds[i].revents = 0;
- i++;
+ i++;
+ }
+
+ l_SocketIOFDChanged = false;
+ l_SocketIOCV.notify_all();
}
}
boost::mutex::scoped_lock lock(l_SocketIOMutex);
if (l_SocketIOFDChanged) {
- l_SocketIOFDChanged = false;
- l_SocketIOCV.notify_all();
delete [] pfds;
+ pfds = NULL;
continue;
}
}
Log(LogCritical, "SocketEvents", "Exception of unknown type thrown in socket I/O handler.");
}
}
-
- delete [] pfds;
}
}
void SocketEvents::Register(Object *lifesupportObject)
{
- boost::mutex::scoped_lock lock(l_SocketIOMutex);
+ {
+ boost::mutex::scoped_lock lock(l_SocketIOMutex);
- VERIFY(m_FD != INVALID_SOCKET);
+ VERIFY(m_FD != INVALID_SOCKET);
- SocketEventDescriptor desc;
- desc.Events = 0;
- desc.EventInterface = this;
- desc.LifesupportObject = lifesupportObject;
+ SocketEventDescriptor desc;
+ desc.Events = 0;
+ desc.EventInterface = this;
+ desc.LifesupportObject = lifesupportObject;
- VERIFY(l_SocketIOSockets.find(m_FD) == l_SocketIOSockets.end());
+ VERIFY(l_SocketIOSockets.find(m_FD) == l_SocketIOSockets.end());
- l_SocketIOSockets[m_FD] = desc;
+ l_SocketIOSockets[m_FD] = desc;
- m_Events = true;
+ m_Events = true;
+ }
- /* There's no need to wake up the I/O thread here. */
+ WakeUpThread(true);
}
void SocketEvents::Unregister(void)