]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/socketengine_epoll.cpp
* Seperate out socket engines into derived classes of SocketEngine.
[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         ref[fd] = type;
59         if (readable)
60         {
61                 log(DEBUG,"Set readbit");
62                 ref[fd] |= X_READBIT;
63         }
64         log(DEBUG,"Add socket %d",fd);
65
66         struct epoll_event ev;
67         memset(&ev,0,sizeof(struct epoll_event));
68         log(DEBUG,"epoll: Add socket to events, ep=%d socket=%d",EngineHandle,fd);
69         readable ? ev.events = EPOLLIN : ev.events = EPOLLOUT;
70         ev.data.fd = fd;
71         int i = epoll_ctl(EngineHandle, EPOLL_CTL_ADD, fd, &ev);
72         if (i < 0)
73         {
74                 log(DEBUG,"epoll: List insertion failure!");
75                 return false;
76         }
77
78         CurrentSetSize++;
79         return true;
80 }
81
82 bool EPollEngine::DelFd(int fd)
83 {
84         log(DEBUG,"EPollEngine::DelFd(%d)",fd);
85
86         if ((fd < 0) || (fd > MAX_DESCRIPTORS))
87                 return false;
88
89         struct epoll_event ev;
90         memset(&ev,0,sizeof(struct epoll_event));
91         ref[fd] && X_READBIT ? ev.events = EPOLLIN : ev.events = EPOLLOUT;
92         ev.data.fd = fd;
93         int i = epoll_ctl(EngineHandle, EPOLL_CTL_DEL, fd, &ev);
94         if (i < 0)
95         {
96                 log(DEBUG,"epoll: List deletion failure!");
97                 return false;
98         }
99
100         CurrentSetSize--;
101         ref[fd] = 0;
102         return true;
103 }
104
105 int EPollEngine::GetMaxFds()
106 {
107         return MAX_DESCRIPTORS;
108 }
109
110 int EPollEngine::GetRemainingFds()
111 {
112         return MAX_DESCRIPTORS - CurrentSetSize;
113 }
114
115 int EPollEngine::Wait(int* fdlist)
116 {
117         int result = 0;
118
119         int i = epoll_wait(EngineHandle, events, MAX_DESCRIPTORS, 50);
120         for (int j = 0; j < i; j++)
121                 fdlist[result++] = events[j].data.fd;
122
123         return result;
124 }
125
126 std::string EPollEngine::GetName()
127 {
128         return "epoll";
129 }