X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsocketengine.cpp;h=886e2b0d0fb8b22e5be3adfa371ec89e027bda31;hb=db07867e945deb72ce103f796e20104a27c5f68a;hp=ec34bf74e6c1c1fa81fc0daf98a2678bc22fbc86;hpb=1383dba43e463f292aea094d01f62f355946049d;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/socketengine.cpp b/src/socketengine.cpp index ec34bf74e..886e2b0d0 100644 --- a/src/socketengine.cpp +++ b/src/socketengine.cpp @@ -28,6 +28,7 @@ #include #include #include "socketengine.h" +#include "helperfuncs.h" char ref[MAX_DESCRIPTORS]; @@ -40,6 +41,17 @@ SocketEngine::SocketEngine() #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; } @@ -86,6 +98,7 @@ 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 : ev.events = EPOLLOUT; ev.data.fd = fd; @@ -111,6 +124,13 @@ 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); @@ -138,6 +158,7 @@ bool SocketEngine::DelFd(int fd) #endif #ifdef USE_EPOLL struct epoll_event ev; + 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); @@ -199,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) { @@ -211,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], 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, MAX_DESCRIPTORS, 100); + int i = epoll_wait(EngineHandle, events, MAX_DESCRIPTORS, 50); for (int j = 0; j < i; j++) fdlist[result++] = events[j].data.fd; #endif