1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
6 #include "base/i2-base.hpp"
7 #include "base/socket.hpp"
8 #include "base/stream.hpp"
9 #include <boost/thread/condition_variable.hpp>
20 * Socket event interface
24 class SocketEvents : public Stream
27 DECLARE_PTR_TYPEDEFS(SocketEvents);
31 virtual void OnEvent(int revents);
35 void ChangeEvents(int events);
37 bool IsHandlingEvents() const;
39 void *GetEnginePrivate() const;
40 void SetEnginePrivate(void *priv);
43 SocketEvents(const Socket::Ptr& socket);
49 void *m_EnginePrivate;
53 static void InitializeEngine();
55 void WakeUpThread(bool wait = false);
59 friend class SocketEventEnginePoll;
60 friend class SocketEventEngineEpoll;
63 #define SOCKET_IOTHREADS 8
65 struct SocketEventDescriptor
68 SocketEvents::Ptr EventInterface;
71 struct EventDescription
74 SocketEventDescriptor Descriptor;
77 class SocketEventEngine
82 void WakeUpThread(int sid, bool wait);
84 boost::mutex& GetMutex(int tid);
87 virtual void InitializeThread(int tid) = 0;
88 virtual void ThreadProc(int tid) = 0;
89 virtual void Register(SocketEvents *se) = 0;
90 virtual void Unregister(SocketEvents *se) = 0;
91 virtual void ChangeEvents(SocketEvents *se, int events) = 0;
93 std::thread m_Threads[SOCKET_IOTHREADS];
94 SOCKET m_EventFDs[SOCKET_IOTHREADS][2];
95 bool m_FDChanged[SOCKET_IOTHREADS];
96 boost::mutex m_EventMutex[SOCKET_IOTHREADS];
97 boost::condition_variable m_CV[SOCKET_IOTHREADS];
98 std::map<SOCKET, SocketEventDescriptor> m_Sockets[SOCKET_IOTHREADS];
100 friend class SocketEvents;
103 class SocketEventEnginePoll final : public SocketEventEngine
106 void Register(SocketEvents *se) override;
107 void Unregister(SocketEvents *se) override;
108 void ChangeEvents(SocketEvents *se, int events) override;
111 void InitializeThread(int tid) override;
112 void ThreadProc(int tid) override;
116 class SocketEventEngineEpoll : public SocketEventEngine
119 virtual void Register(SocketEvents *se);
120 virtual void Unregister(SocketEvents *se);
121 virtual void ChangeEvents(SocketEvents *se, int events);
124 virtual void InitializeThread(int tid);
125 virtual void ThreadProc(int tid);
128 SOCKET m_PollFDs[SOCKET_IOTHREADS];
130 static int PollToEpoll(int events);
131 static int EpollToPoll(int events);
133 #endif /* __linux__ */
137 #endif /* SOCKETEVENTS_H */