#include <boost/foreach.hpp>
#include <map>
-#ifndef _WIN32
-# include <poll.h>
-#endif /* _WIN32 */
-
using namespace icinga;
struct SocketEventDescriptor
static boost::condition_variable l_SocketIOCV;
static bool l_SocketIOFDChanged;
static std::map<SOCKET, SocketEventDescriptor> l_SocketIOSockets;
+static std::map<SOCKET, int> l_SocketIOEventChanges;
void SocketEvents::InitializeThread(void)
{
boost::mutex::scoped_lock lock(l_SocketIOMutex);
if (l_SocketIOFDChanged) {
+ Log(LogWarning, "SocketEvents", "Updated event FDs");
+
pfds.resize(l_SocketIOSockets.size());
descriptors.resize(l_SocketIOSockets.size());
typedef std::map<SOCKET, SocketEventDescriptor>::value_type kv_pair;
BOOST_FOREACH(const kv_pair& desc, l_SocketIOSockets) {
+ if (desc.second.EventInterface)
+ desc.second.EventInterface->m_PFD = &pfds[i];
+
pfds[i].fd = desc.first;
pfds[i].events = desc.second.Events;
- pfds[i].revents = 0;
descriptors[i] = desc.second;
i++;
* Constructor for the SocketEvents class.
*/
SocketEvents::SocketEvents(const Socket::Ptr& socket, Object *lifesupportObject)
- : m_FD(socket->GetFD())
+ : m_FD(socket->GetFD()), m_PFD(NULL)
{
boost::call_once(l_SocketIOOnceFlag, &SocketEvents::InitializeThread);
return;
it->second.Events = events;
- l_SocketIOFDChanged = true;
+
+ if (m_PFD && boost::this_thread::get_id() == l_SocketIOThread.get_id())
+ m_PFD->events = events;
+ else
+ l_SocketIOFDChanged = true;
}
WakeUpThread();