X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsocketengine.cpp;h=886e2b0d0fb8b22e5be3adfa371ec89e027bda31;hb=db07867e945deb72ce103f796e20104a27c5f68a;hp=3e0b3814d6ee901d5c849ffc4eeb5311d5542483;hpb=024f972eb1ffc67bb32b2f083955199cbd6ecdde;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/socketengine.cpp b/src/socketengine.cpp index 3e0b3814d..886e2b0d0 100644 --- a/src/socketengine.cpp +++ b/src/socketengine.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * Inspire is copyright (C) 2002-2005 ChatSpike-Dev. + * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. * E-mail: * * @@ -19,7 +19,6 @@ #include "inspircd.h" #ifdef USE_EPOLL #include -#define EP_DELAY 5 #endif #ifdef USE_KQUEUE #include @@ -29,18 +28,30 @@ #include #include #include "socketengine.h" +#include "helperfuncs.h" -char ref[65535]; +char ref[MAX_DESCRIPTORS]; SocketEngine::SocketEngine() { log(DEBUG,"SocketEngine::SocketEngine()"); #ifdef USE_EPOLL - EngineHandle = epoll_create(65535); + EngineHandle = epoll_create(MAX_DESCRIPTORS); #endif #ifdef USE_KQUEUE EngineHandle = kqueue(); #endif +#ifdef USE_SELECT + EngineHandle = 0; +#endif + 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."); + 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."); + Exit(0); + } CurrentSetSize = 0; } @@ -57,7 +68,7 @@ SocketEngine::~SocketEngine() char SocketEngine::GetType(int fd) { - if ((fd < 0) || (fd > 65535)) + if ((fd < 0) || (fd > MAX_DESCRIPTORS)) return X_EMPTY_SLOT; /* Mask off the top bit used for 'read/write' state */ return (ref[fd] & ~0x80); @@ -65,8 +76,16 @@ char SocketEngine::GetType(int fd) bool SocketEngine::AddFd(int fd, bool readable, char type) { - if ((fd < 0) || (fd > 65535)) + if ((fd < 0) || (fd > MAX_DESCRIPTORS)) + { + 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!"); + return false; + } #ifdef USE_SELECT fds[fd] = fd; #endif @@ -79,8 +98,9 @@ bool SocketEngine::AddFd(int fd, bool readable, char type) log(DEBUG,"Add socket %d",fd); #ifdef USE_EPOLL struct epoll_event ev; + memset(&ev,0,sizeof(struct epoll_event)); log(DEBUG,"epoll: Add socket to events, ep=%d socket=%d",EngineHandle,fd); - readable ? ev.events = EPOLLIN | EPOLLET : ev.events = EPOLLOUT | EPOLLET; + readable ? ev.events = EPOLLIN : ev.events = EPOLLOUT; ev.data.fd = fd; int i = epoll_ctl(EngineHandle, EPOLL_CTL_ADD, fd, &ev); if (i < 0) @@ -104,11 +124,18 @@ bool SocketEngine::AddFd(int fd, bool readable, char type) return true; } +bool SocketEngine::HasFd(int fd) +{ + if ((fd < 0) || (fd > MAX_DESCRIPTORS)) + return false; + return (ref[fd] != 0); +} + bool SocketEngine::DelFd(int fd) { log(DEBUG,"SocketEngine::DelFd(%d)",fd); - if ((fd < 0) || (fd > 65535)) + if ((fd < 0) || (fd > MAX_DESCRIPTORS)) return false; #ifdef USE_SELECT @@ -131,7 +158,8 @@ bool SocketEngine::DelFd(int fd) #endif #ifdef USE_EPOLL struct epoll_event ev; - ref[fd] && X_READBIT ? ev.events = EPOLLIN | EPOLLET : ev.events = EPOLLOUT | EPOLLET; + memset(&ev,0,sizeof(struct epoll_event)); + ref[fd] && X_READBIT ? ev.events = EPOLLIN : ev.events = EPOLLOUT; ev.data.fd = fd; int i = epoll_ctl(EngineHandle, EPOLL_CTL_DEL, fd, &ev); if (i < 0) @@ -192,7 +220,7 @@ int SocketEngine::Wait(int* fdlist) } tval.tv_sec = 0; - tval.tv_usec = 100L; + tval.tv_usec = 50L; sresult = select(FD_SETSIZE, &rfdset, &wfdset, NULL, &tval); if (sresult > 0) { @@ -204,14 +232,14 @@ int SocketEngine::Wait(int* fdlist) } #endif #ifdef USE_KQUEUE - ts.tv_nsec = 10000L; + ts.tv_nsec = 5000L; ts.tv_sec = 0; - int i = kevent(EngineHandle, NULL, 0, &ke_list[0], 65535, &ts); + 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; #endif #ifdef USE_EPOLL - int i = epoll_wait(EngineHandle, events, 65535, 100); + int i = epoll_wait(EngineHandle, events, MAX_DESCRIPTORS, 50); for (int j = 0; j < i; j++) fdlist[result++] = events[j].data.fd; #endif