X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsocketengine_kqueue.cpp;h=008de44ca91174a45dff20aa651fc9c2070b46ad;hb=547ee1342e8b07bcdf46bc81343d1a1f7a2998e5;hp=3287ea7800fdbab7e03a1f6733e56c6786ee2669;hpb=23a4885701cba4a87a5ae027257fb4207c917572;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/socketengine_kqueue.cpp b/src/socketengine_kqueue.cpp index 3287ea780..008de44ca 100644 --- a/src/socketengine_kqueue.cpp +++ b/src/socketengine_kqueue.cpp @@ -14,24 +14,20 @@ * --------------------------------------------------- */ -#include "inspircd_config.h" -#include "globals.h" #include "inspircd.h" #include #include #include -#include -#include #include "socketengine_kqueue.h" -#include "helperfuncs.h" -KQueueEngine::KQueueEngine() + +KQueueEngine::KQueueEngine(InspIRCd* Instance) : SocketEngine(Instance) { EngineHandle = kqueue(); if (EngineHandle == -1) { - log(SPARSE,"ERROR: Could not initialize socket engine. Your kernel probably does not have the proper features."); - log(SPARSE,"ERROR: this is a fatal error, exiting now."); + ServerInstance->Log(SPARSE,"ERROR: Could not initialize socket engine. Your kernel probably does not have the proper features."); + ServerInstance->Log(SPARSE,"ERROR: this is a fatal error, exiting now."); printf("ERROR: Could not initialize socket engine. Your kernel probably does not have the proper features."); printf("ERROR: this is a fatal error, exiting now."); InspIRCd::Exit(ERROR); @@ -41,41 +37,37 @@ KQueueEngine::KQueueEngine() KQueueEngine::~KQueueEngine() { - log(DEBUG,"KQueueEngine::~KQueueEngine()"); + ServerInstance->Log(DEBUG,"KQueueEngine::~KQueueEngine()"); close(EngineHandle); } -bool KQueueEngine::AddFd(int fd, bool readable, char type) +bool KQueueEngine::AddFd(EventHandler* eh) { + int fd = eh->GetFd(); if ((fd < 0) || (fd > MAX_DESCRIPTORS)) { - log(DEFAULT,"ERROR: FD of %d added above max of %d",fd,MAX_DESCRIPTORS); + ServerInstance->Log(DEFAULT,"ERROR: FD of %d added above max of %d",fd,MAX_DESCRIPTORS); return false; } if (GetRemainingFds() <= 1) { - log(DEFAULT,"ERROR: System out of file descriptors!"); + ServerInstance->Log(DEFAULT,"ERROR: System out of file descriptors!"); return false; } if (ref[fd]) return false; - ref[fd] = type; - if (readable) - { - log(DEBUG,"Set readbit"); - ref[fd] |= X_READBIT; - } - log(DEBUG,"Add socket %d",fd); + ref[fd] = eh; + ServerInstance->Log(DEBUG,"Add socket %d",fd); struct kevent ke; - log(DEBUG,"kqueue: Add socket to events, kq=%d socket=%d",EngineHandle,fd); - EV_SET(&ke, fd, readable ? EVFILT_READ : EVFILT_WRITE, EV_ADD, 0, 0, NULL); + ServerInstance->Log(DEBUG,"kqueue: Add socket to events, kq=%d socket=%d",EngineHandle,fd); + 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) { - log(DEBUG,"kqueue: List insertion failure!"); + ServerInstance->Log(DEBUG,"kqueue: List insertion failure!"); return false; } @@ -83,24 +75,26 @@ bool KQueueEngine::AddFd(int fd, bool readable, char type) return true; } -bool KQueueEngine::DelFd(int fd) +bool KQueueEngine::DelFd(EventHandler* eh) { - log(DEBUG,"KQueueEngine::DelFd(%d)",fd); + int fd = eh->GetFd(); + + ServerInstance->Log(DEBUG,"KQueueEngine::DelFd(%d)",fd); if ((fd < 0) || (fd > MAX_DESCRIPTORS)) return false; struct kevent ke; - EV_SET(&ke, fd, ref[fd] & X_READBIT ? EVFILT_READ : EVFILT_WRITE, EV_DELETE, 0, 0, NULL); + EV_SET(&ke, fd, eh->Readable() ? EVFILT_READ : EVFILT_WRITE, EV_DELETE, 0, 0, NULL); int i = kevent(EngineHandle, &ke, 1, 0, 0, NULL); if (i == -1) { - log(DEBUG,"kqueue: Failed to remove socket from queue!"); + ServerInstance->Log(DEBUG,"kqueue: Failed to remove socket from queue!"); return false; } CurrentSetSize--; - ref[fd] = 0; + ref[fd] = NULL; return true; } @@ -114,17 +108,18 @@ int KQueueEngine::GetRemainingFds() return MAX_DESCRIPTORS - CurrentSetSize; } -int KQueueEngine::Wait(int* fdlist) +int KQueueEngine::DispatchEvents() { - int result = 0; - ts.tv_nsec = 5000L; ts.tv_sec = 0; int i = kevent(EngineHandle, NULL, 0, &ke_list[0], MAX_DESCRIPTORS, &ts); for (int j = 0; j < i; j++) - fdlist[result++] = ke_list[j].ident; + { + ServerInstance->Log(DEBUG,"Handle %s event on fd %d",ref[ke_list[j].ident]->Readable() ? "read" : "write", ref[ke_list[j].ident]->GetFd()); + ref[ke_list[j].ident]->HandleEvent(ref[ke_list[j].ident]->Readable() ? EVENT_READ : EVENT_WRITE); + } - return result; + return i; } std::string KQueueEngine::GetName()