]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/socketengine_epoll.cpp
Just to mess with om's head, remove helperfuncs.h from everywhere
[user/henk/code/inspircd.git] / src / socketengine_epoll.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
6  *                       E-mail:
7  *                <brain@chatspike.net>
8  *                <Craig@chatspike.net>
9  *
10  * Written by Craig Edwards, Craig McLure, and others.
11  * This program is free but copyrighted software; see
12  *            the file COPYING for details.
13  *
14  * ---------------------------------------------------
15  */
16
17 #include "inspircd_config.h"
18 #include "globals.h"
19 #include "inspircd.h"
20 #include <sys/epoll.h>
21 #include <vector>
22 #include <string>
23 #include "socketengine_epoll.h"
24
25 #include "inspircd.h"
26
27 EPollEngine::EPollEngine(InspIRCd* Instance) : SocketEngine(Instance)
28 {
29         EngineHandle = epoll_create(MAX_DESCRIPTORS);
30
31         if (EngineHandle == -1)
32         {
33                 ServerInstance->Log(SPARSE,"ERROR: Could not initialize socket engine. Your kernel probably does not have the proper features.");
34                 ServerInstance->Log(SPARSE,"ERROR: this is a fatal error, exiting now.");
35                 printf("ERROR: Could not initialize socket engine. Your kernel probably does not have the proper features.");
36                 printf("ERROR: this is a fatal error, exiting now.");
37                 InspIRCd::Exit(ERROR);
38         }
39         CurrentSetSize = 0;
40 }
41
42 EPollEngine::~EPollEngine()
43 {
44         close(EngineHandle);
45 }
46
47 bool EPollEngine::AddFd(int fd, bool readable, char type)
48 {
49         if ((fd < 0) || (fd > MAX_DESCRIPTORS))
50         {
51                 ServerInstance->Log(DEFAULT,"ERROR: FD of %d added above max of %d",fd,MAX_DESCRIPTORS);
52                 return false;
53         }
54         if (GetRemainingFds() <= 1)
55         {
56                 ServerInstance->Log(DEFAULT,"ERROR: System out of file descriptors!");
57                 return false;
58         }
59         if (ref[fd])
60                 return false;
61
62         ref[fd] = type;
63
64         if (readable)
65         {
66                 ServerInstance->Log(DEBUG,"Set readbit");
67                 ref[fd] |= X_READBIT;
68         }
69         ServerInstance->Log(DEBUG,"Add socket %d",fd);
70
71         struct epoll_event ev;
72         memset(&ev,0,sizeof(struct epoll_event));
73         ServerInstance->Log(DEBUG,"epoll: Add socket to events, ep=%d socket=%d",EngineHandle,fd);
74         readable ? ev.events = EPOLLIN : ev.events = EPOLLOUT;
75         ev.data.fd = fd;
76         int i = epoll_ctl(EngineHandle, EPOLL_CTL_ADD, fd, &ev);
77         if (i < 0)
78         {
79                 ServerInstance->Log(DEBUG,"epoll: List insertion failure!");
80                 return false;
81         }
82
83         CurrentSetSize++;
84         return true;
85 }
86
87 bool EPollEngine::DelFd(int fd)
88 {
89         ServerInstance->Log(DEBUG,"EPollEngine::DelFd(%d)",fd);
90
91         if ((fd < 0) || (fd > MAX_DESCRIPTORS))
92                 return false;
93
94         struct epoll_event ev;
95         memset(&ev,0,sizeof(struct epoll_event));
96         ref[fd] && X_READBIT ? ev.events = EPOLLIN : ev.events = EPOLLOUT;
97         ev.data.fd = fd;
98         int i = epoll_ctl(EngineHandle, EPOLL_CTL_DEL, fd, &ev);
99         if (i < 0)
100         {
101                 ServerInstance->Log(DEBUG,"epoll: List deletion failure!");
102                 return false;
103         }
104
105         CurrentSetSize--;
106         ref[fd] = 0;
107         return true;
108 }
109
110 int EPollEngine::GetMaxFds()
111 {
112         return MAX_DESCRIPTORS;
113 }
114
115 int EPollEngine::GetRemainingFds()
116 {
117         return MAX_DESCRIPTORS - CurrentSetSize;
118 }
119
120 int EPollEngine::Wait(int* fdlist)
121 {
122         int result = 0;
123
124         int i = epoll_wait(EngineHandle, events, MAX_DESCRIPTORS, 50);
125         for (int j = 0; j < i; j++)
126                 fdlist[result++] = events[j].data.fd;
127
128         return result;
129 }
130
131 std::string EPollEngine::GetName()
132 {
133         return "epoll";
134 }