]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/socketengine_epoll.cpp
userrec::UpdateNickHash(), userrec::ForceNickChange(), userrec::FullConnect()
[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 #include "helperfuncs.h"
25
26 EPollEngine::EPollEngine()
27 {
28         EngineHandle = epoll_create(MAX_DESCRIPTORS);
29
30         if (EngineHandle == -1)
31         {
32                 log(SPARSE,"ERROR: Could not initialize socket engine. Your kernel probably does not have the proper features.");
33                 log(SPARSE,"ERROR: this is a fatal error, exiting now.");
34                 printf("ERROR: Could not initialize socket engine. Your kernel probably does not have the proper features.");
35                 printf("ERROR: this is a fatal error, exiting now.");
36                 Exit(0);
37         }
38         CurrentSetSize = 0;
39 }
40
41 EPollEngine::~EPollEngine()
42 {
43         close(EngineHandle);
44 }
45
46 bool EPollEngine::AddFd(int fd, bool readable, char type)
47 {
48         if ((fd < 0) || (fd > MAX_DESCRIPTORS))
49         {
50                 log(DEFAULT,"ERROR: FD of %d added above max of %d",fd,MAX_DESCRIPTORS);
51                 return false;
52         }
53         if (GetRemainingFds() <= 1)
54         {
55                 log(DEFAULT,"ERROR: System out of file descriptors!");
56                 return false;
57         }
58         if (ref[fd])
59                 return false;
60
61         ref[fd] = type;
62
63         if (readable)
64         {
65                 log(DEBUG,"Set readbit");
66                 ref[fd] |= X_READBIT;
67         }
68         log(DEBUG,"Add socket %d",fd);
69
70         struct epoll_event ev;
71         memset(&ev,0,sizeof(struct epoll_event));
72         log(DEBUG,"epoll: Add socket to events, ep=%d socket=%d",EngineHandle,fd);
73         readable ? ev.events = EPOLLIN : ev.events = EPOLLOUT;
74         ev.data.fd = fd;
75         int i = epoll_ctl(EngineHandle, EPOLL_CTL_ADD, fd, &ev);
76         if (i < 0)
77         {
78                 log(DEBUG,"epoll: List insertion failure!");
79                 return false;
80         }
81
82         CurrentSetSize++;
83         return true;
84 }
85
86 bool EPollEngine::DelFd(int fd)
87 {
88         log(DEBUG,"EPollEngine::DelFd(%d)",fd);
89
90         if ((fd < 0) || (fd > MAX_DESCRIPTORS))
91                 return false;
92
93         struct epoll_event ev;
94         memset(&ev,0,sizeof(struct epoll_event));
95         ref[fd] && X_READBIT ? ev.events = EPOLLIN : ev.events = EPOLLOUT;
96         ev.data.fd = fd;
97         int i = epoll_ctl(EngineHandle, EPOLL_CTL_DEL, fd, &ev);
98         if (i < 0)
99         {
100                 log(DEBUG,"epoll: List deletion failure!");
101                 return false;
102         }
103
104         CurrentSetSize--;
105         ref[fd] = 0;
106         return true;
107 }
108
109 int EPollEngine::GetMaxFds()
110 {
111         return MAX_DESCRIPTORS;
112 }
113
114 int EPollEngine::GetRemainingFds()
115 {
116         return MAX_DESCRIPTORS - CurrentSetSize;
117 }
118
119 int EPollEngine::Wait(int* fdlist)
120 {
121         int result = 0;
122
123         int i = epoll_wait(EngineHandle, events, MAX_DESCRIPTORS, 50);
124         for (int j = 0; j < i; j++)
125                 fdlist[result++] = events[j].data.fd;
126
127         return result;
128 }
129
130 std::string EPollEngine::GetName()
131 {
132         return "epoll";
133 }