2 #if defined(__FreeBSD__) || defined(__OpenBSD__)
7 #define _DEFAULT_SOURCE
10 #include <sys/event.h>
36 KernelEventMechanism::KernelEventMechanism() : initialized(false),_psd(nullptr) {
55 if (psd->kqChangeListCurrent + 2 >= psd->kqChangeListMax) {
56 psd->kqChangeList[0].resize(psd->kqChangeListMax << 1);
57 psd->kqChangeList[1].resize(psd->kqChangeListMax << 1);
61 auto& ke = psd->kqChangeList[psd->kqChangeListBuffer][psd->kqChangeListCurrent++];
63 ke.filter = EVFILT_READ;
67 ke.udata = (
void*)cookie;
69 auto& ke = psd->kqChangeList[psd->kqChangeListBuffer][psd->kqChangeListCurrent++];
71 ke.filter = EVFILT_READ;
75 ke.udata = (
void*)cookie;
79 auto& ke = psd->kqChangeList[psd->kqChangeListBuffer][psd->kqChangeListCurrent++];
81 ke.filter = EVFILT_WRITE;
85 ke.udata = (
void*)cookie;
87 auto& ke = psd->kqChangeList[psd->kqChangeListBuffer][psd->kqChangeListCurrent++];
89 ke.filter = EVFILT_WRITE;
93 ke.udata = (
void*)cookie;
96 psd->kqMutex.unlock();
108 if (psd->kqChangeListCurrent + 2 >= psd->kqChangeListMax) {
109 psd->kqChangeList[0].resize(psd->kqChangeListMax << 1);
110 psd->kqChangeList[1].resize(psd->kqChangeListMax << 1);
114 auto& ke = psd->kqChangeList[psd->kqChangeListBuffer][psd->kqChangeListCurrent++];
116 ke.filter = EVFILT_READ;
117 ke.flags = EV_DELETE;
124 auto& ke = psd->kqChangeList[psd->kqChangeListBuffer][psd->kqChangeListCurrent++];
126 ke.filter = EVFILT_WRITE;
127 ke.flags = EV_DELETE;
133 psd->kqMutex.unlock();
146 psd->kqChangeListCurrent = 0;
147 psd->kqChangeList[0].resize(psd->kqChangeListMax);
148 psd->kqChangeList[1].resize(psd->kqChangeListMax);
151 psd->kqEventListMax = maxSockets * 2;
152 psd->kqEventList.resize(psd->kqEventListMax);
158 std::string msg =
"Could not create kqueue: ";
159 msg+= strerror(errno);
188 const struct timespec timeout = {0, 1L * 1000L * 1000L};
191 while (
true ==
true) {
196 auto kqChangeListFilledBuffer = psd->kqChangeListBuffer;
197 auto kqChangeListFilledCurrent = psd->kqChangeListCurrent;
200 psd->kqChangeListBuffer = (psd->kqChangeListBuffer + 1) % 2;
203 psd->kqChangeListCurrent = 0;
206 psd->kqMutex.unlock();
211 psd->kqChangeList[kqChangeListFilledBuffer].data(),
212 kqChangeListFilledCurrent,
213 psd->kqEventList.data(),
220 if (errno == EINTR) {
223 std::string msg =
"kevent failed: ";
224 msg+= strerror(errno);
242 cookie = (
void*)ke.udata;
Interface to kernel event mechanismns.
void shutdownKernelEventMechanism()
Shutdowns the kernel event mechanism.
void removeSocket(NetworkSocket *socket)
Removes a socket.
void setSocketInterest(NetworkSocket *socket, const NIOInterest lastInterest, const NIOInterest interest, const void *cookie)
Sets a non blocked socket io interest.
int doKernelEventMechanism()
Do the kernel event mechanism.
~KernelEventMechanism()
destructor
void initKernelEventMechanism(const unsigned int maxSockets)
Initializes the kernel event mechanism.
void decodeKernelEvent(const unsigned int index, NIOInterest &interest, void *&cookie)
Decodes a kernel event.
Kernel event mechanism exception class.
Base class of network sockets.
void lock()
Locks the mutex, additionally mutex locks will block until other locks have been unlocked.
const NIOInterest NIO_INTEREST_NONE
const NIOInterest NIO_INTEREST_READ
uint8_t NIOInterest
type definition for network IO interest
const NIOInterest NIO_INTEREST_WRITE