summaryrefslogtreecommitdiff
path: root/src/socketengines/socketengine_epoll.cpp
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2008-04-02 17:08:09 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2008-04-02 17:08:09 +0000
commit2db77cda56947d4ee0f913c8082f6607855ca713 (patch)
treef7f83c80f62adc4e3eb0f9f3b680229466c4352e /src/socketengines/socketengine_epoll.cpp
parentd9d33e7246baf59241d083eb2c253e729390d205 (diff)
Automatic detection and allocation of max fds. No longer needs recompile to change, just adjust it in your kernel or whatever and restart insp.
Please note that select and iocp socket engines do not support detection and are always set to FD_SETSIZE and 10240 descriptors respectively. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@9263 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/socketengines/socketengine_epoll.cpp')
-rw-r--r--src/socketengines/socketengine_epoll.cpp35
1 files changed, 29 insertions, 6 deletions
diff --git a/src/socketengines/socketengine_epoll.cpp b/src/socketengines/socketengine_epoll.cpp
index 1a0c5d53e..a749208d1 100644
--- a/src/socketengines/socketengine_epoll.cpp
+++ b/src/socketengines/socketengine_epoll.cpp
@@ -15,10 +15,11 @@
#include "exitcodes.h"
#include <sys/epoll.h>
#include "socketengines/socketengine_epoll.h"
+#include <ulimit.h>
EPollEngine::EPollEngine(InspIRCd* Instance) : SocketEngine(Instance)
{
- EngineHandle = epoll_create(MAX_DESCRIPTORS);
+ EngineHandle = epoll_create(GetMaxFds());
if (EngineHandle == -1)
{
@@ -29,17 +30,24 @@ EPollEngine::EPollEngine(InspIRCd* Instance) : SocketEngine(Instance)
ServerInstance->Exit(EXIT_STATUS_SOCKETENGINE);
}
CurrentSetSize = 0;
+
+ ref = new EventHandler* [GetMaxFds()];
+ events = new struct epoll_event[GetMaxFds()];
+
+ memset(ref, 0, GetMaxFds() * sizeof(EventHandler*));
}
EPollEngine::~EPollEngine()
{
this->Close(EngineHandle);
+ delete[] ref;
+ delete[] events;
}
bool EPollEngine::AddFd(EventHandler* eh)
{
int fd = eh->GetFd();
- if ((fd < 0) || (fd > MAX_DESCRIPTORS))
+ if ((fd < 0) || (fd > GetMaxFds() - 1))
{
ServerInstance->Logs->Log("SOCKET",DEBUG,"Out of range FD");
return false;
@@ -83,7 +91,7 @@ void EPollEngine::WantWrite(EventHandler* eh)
bool EPollEngine::DelFd(EventHandler* eh, bool force)
{
int fd = eh->GetFd();
- if ((fd < 0) || (fd > MAX_DESCRIPTORS))
+ if ((fd < 0) || (fd > GetMaxFds() - 1))
return false;
struct epoll_event ev;
@@ -107,19 +115,34 @@ bool EPollEngine::DelFd(EventHandler* eh, bool force)
int EPollEngine::GetMaxFds()
{
- return MAX_DESCRIPTORS;
+ if (MAX_DESCRIPTORS)
+ return MAX_DESCRIPTORS;
+
+ int max = ulimit(4, 0);
+ if (max > 0)
+ {
+ MAX_DESCRIPTORS = max;
+ return max;
+ }
+ else
+ {
+ ServerInstance->Logs->Log("SOCKET", DEFAULT, "ERROR: Can't determine maximum number of open sockets!");
+ printf("ERROR: Can't determine maximum number of open sockets!\n");
+ ServerInstance->Exit(EXIT_STATUS_SOCKETENGINE);
+ }
+ return 0;
}
int EPollEngine::GetRemainingFds()
{
- return MAX_DESCRIPTORS - CurrentSetSize;
+ return GetMaxFds() - CurrentSetSize;
}
int EPollEngine::DispatchEvents()
{
socklen_t codesize;
int errcode;
- int i = epoll_wait(EngineHandle, events, MAX_DESCRIPTORS, 1000);
+ int i = epoll_wait(EngineHandle, events, GetMaxFds() - 1, 1000);
TotalEvents += i;