KQueueEngine::KQueueEngine(InspIRCd* Instance) : SocketEngine(Instance)
{
+ this->RecoverFromFork();
+}
+
+void KQueueEngine::RecoverFromFork()
+{
+ /*
+ * The only bad thing about kqueue is that its fd cant survive a fork and is not inherited.
+ * BUM HATS.
+ *
+ */
EngineHandle = kqueue();
if (EngineHandle == -1)
{
KQueueEngine::~KQueueEngine()
{
- close(EngineHandle);
+ this->Close(EngineHandle);
}
bool KQueueEngine::AddFd(EventHandler* eh)
if (ref[fd])
return false;
- ref[fd] = eh;
-
struct kevent ke;
EV_SET(&ke, fd, eh->Readable() ? EVFILT_READ : EVFILT_WRITE, EV_ADD, 0, 0, NULL);
int i = kevent(EngineHandle, &ke, 1, 0, 0, NULL);
if (i == -1)
+ {
return false;
+ }
+ ref[fd] = eh;
CurrentSetSize++;
ServerInstance->Log(DEBUG,"New file descriptor: %d", fd);
int j = kevent(EngineHandle, &ke, 1, 0, 0, NULL);
- if ((j < 0) && (i < 0) && !force)
- return false;
-
CurrentSetSize--;
ref[fd] = NULL;
+ if ((j < 0) && (i < 0) && !force)
+ return false;
+
ServerInstance->Log(DEBUG,"Remove file descriptor: %d", fd);
return true;
}