]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - docs/module-doc/classSocketEngine.html
Fixed binary images in this dir that cvs2svn stored as ascii
[user/henk/code/inspircd.git] / docs / module-doc / classSocketEngine.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
3 <title>InspIRCd: SocketEngine Class Reference</title>
4 <link href="inspircd.doxygen.css" rel="stylesheet" type="text/css">
5 </head><body>
6 <!-- Generated by Doxygen 1.4.4-20050815 -->
7 <div class="qindex"><a class="qindex" href="main.html">Main&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a></div>
8 <h1>SocketEngine Class Reference</h1><!-- doxytag: class="SocketEngine" -->The actual socketengine class presents the same interface on all operating systems, but its private members and internal behaviour should be treated as blackboxed, and vary from system to system and upon the config settings chosen by the server admin.  
9 <a href="#_details">More...</a>
10 <p>
11 <code>#include &lt;<a class="el" href="socketengine_8h-source.html">socketengine.h</a>&gt;</code>
12 <p>
13 Collaboration diagram for SocketEngine:<p><center><img src="classSocketEngine__coll__graph.gif" border="0" usemap="#SocketEngine__coll__map" alt="Collaboration graph"></center>
14 <center><font size="2">[<a target="top" href="graph_legend.html">legend</a>]</font></center><a href="classSocketEngine-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
15 <tr><td></td></tr>
16 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
17 <tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#SocketEngine_28_29">SocketEngine</a> ()</td></tr>
18
19 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructor The constructor transparently initializes the socket engine which the ircd is using.  <a href="#SocketEngine_28_29"></a><br></td></tr>
20 <tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#_7ESocketEngine_28_29">~SocketEngine</a> ()</td></tr>
21
22 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destructor The destructor transparently tidies up any resources used by the socket engine.  <a href="#_7ESocketEngine_28_29"></a><br></td></tr>
23 <tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#AddFd_28int_20fd_2C_20bool_20readable_2C_20char_20type_29">AddFd</a> (int fd, bool readable, char type)</td></tr>
24
25 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Add a file descriptor to the engine Use AddFd to add a file descriptor to the engine and have the socket engine monitor it.  <a href="#AddFd_28int_20fd_2C_20bool_20readable_2C_20char_20type_29"></a><br></td></tr>
26 <tr><td class="memItemLeft" nowrap align="right" valign="top">char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#GetType_28int_20fd_29">GetType</a> (int fd)</td></tr>
27
28 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the type value for this file descriptor This function masks off the X_READBIT value so that the type of the socket can be obtained.  <a href="#GetType_28int_20fd_29"></a><br></td></tr>
29 <tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#DelFd_28int_20fd_29">DelFd</a> (int fd)</td></tr>
30
31 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Delete a file descriptor f rom the engine This function call deletes a file descriptor from the engine, returning true if it succeeded and false if it failed.  <a href="#DelFd_28int_20fd_29"></a><br></td></tr>
32 <tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#Wait_28std_3A_3Avector_3C_20int_20_3E_20_26fdlist_29">Wait</a> (std::vector&lt; int &gt; &amp;fdlist)</td></tr>
33
34 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Waits for an event.  <a href="#Wait_28std_3A_3Avector_3C_20int_20_3E_20_26fdlist_29"></a><br></td></tr>
35 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="namespaceirc.html#string">std::string</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#GetName_28_29">GetName</a> ()</td></tr>
36
37 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the socket engines name This returns the name of the engine for use in /VERSION responses.  <a href="#GetName_28_29"></a><br></td></tr>
38 <tr><td colspan="2"><br><h2>Private Attributes</h2></td></tr>
39 <tr><td class="memItemLeft" nowrap align="right" valign="top">std::vector&lt; int &gt;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#fds">fds</a></td></tr>
40
41 <tr><td class="memItemLeft" nowrap align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#EngineHandle">EngineHandle</a></td></tr>
42
43 <tr><td class="memItemLeft" nowrap align="right" valign="top">kevent&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#ke_5Flist_5B_36_35_35_33_35_5D">ke_list</a> [65535]</td></tr>
44
45 <tr><td class="memItemLeft" nowrap align="right" valign="top">timespec&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#ts">ts</a></td></tr>
46
47 </table>
48 <hr><a name="_details"></a><h2>Detailed Description</h2>
49 The actual socketengine class presents the same interface on all operating systems, but its private members and internal behaviour should be treated as blackboxed, and vary from system to system and upon the config settings chosen by the server admin. 
50 <p>
51 The current version supports select, epoll and kqueue.
52 <p>
53
54 <p>
55 Definition at line <a class="el" href="socketengine_8h-source.html#l00066">66</a> of file <a class="el" href="socketengine_8h-source.html">socketengine.h</a>.<hr><h2>Constructor &amp; Destructor Documentation</h2>
56 <a class="anchor" name="SocketEngine_28_29"></a><!-- doxytag: member="SocketEngine::SocketEngine" ref="SocketEngine_28_29" args="()" --><p>
57 <table class="mdTable" cellpadding="2" cellspacing="0">
58   <tr>
59     <td class="mdRow">
60       <table cellpadding="0" cellspacing="0" border="0">
61         <tr>
62           <td class="md" nowrap valign="top">SocketEngine::SocketEngine           </td>
63           <td class="md" valign="top">(&nbsp;</td>
64           <td class="mdname1" valign="top" nowrap>          </td>
65           <td class="md" valign="top">&nbsp;)&nbsp;</td>
66           <td class="md" nowrap></td>
67         </tr>
68       </table>
69     </td>
70   </tr>
71 </table>
72 <table cellspacing="5" cellpadding="0" border="0">
73   <tr>
74     <td>
75       &nbsp;
76     </td>
77     <td>
78
79 <p>
80 Constructor The constructor transparently initializes the socket engine which the ircd is using. 
81 <p>
82 Please note that if there is a catastrophic failure (for example, you try and enable epoll on a 2.4 linux kernel) then this function may bail back to the shell.
83 <p>
84 Definition at line <a class="el" href="socketengine_8cpp-source.html#l00035">35</a> of file <a class="el" href="socketengine_8cpp-source.html">socketengine.cpp</a>.
85 <p>
86 References <a class="el" href="inspircd__io_8h-source.html#l00029">DEBUG</a>, <a class="el" href="socketengine_8h-source.html#l00069">EngineHandle</a>, and <a class="el" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log()</a>.<div class="fragment"><pre class="fragment"><a name="l00036"></a>00036 {
87 <a name="l00037"></a>00037         <a class="code" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log</a>(<a class="code" href="inspircd__io_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"SocketEngine::SocketEngine()"</span>);
88 <a name="l00038"></a>00038 <span class="preprocessor">#ifdef USE_EPOLL</span>
89 <a name="l00039"></a>00039 <span class="preprocessor"></span>        <a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a> = epoll_create(65535);
90 <a name="l00040"></a>00040 <span class="preprocessor">#endif</span>
91 <a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_KQUEUE</span>
92 <a name="l00042"></a>00042 <span class="preprocessor"></span>        <a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a> = kqueue();
93 <a name="l00043"></a>00043 <span class="preprocessor">#endif</span>
94 <a name="l00044"></a>00044 <span class="preprocessor"></span>}
95 </pre></div>
96 <p>
97     </td>
98   </tr>
99 </table>
100 <a class="anchor" name="_7ESocketEngine_28_29"></a><!-- doxytag: member="SocketEngine::~SocketEngine" ref="_7ESocketEngine_28_29" args="()" --><p>
101 <table class="mdTable" cellpadding="2" cellspacing="0">
102   <tr>
103     <td class="mdRow">
104       <table cellpadding="0" cellspacing="0" border="0">
105         <tr>
106           <td class="md" nowrap valign="top">SocketEngine::~SocketEngine           </td>
107           <td class="md" valign="top">(&nbsp;</td>
108           <td class="mdname1" valign="top" nowrap>          </td>
109           <td class="md" valign="top">&nbsp;)&nbsp;</td>
110           <td class="md" nowrap></td>
111         </tr>
112       </table>
113     </td>
114   </tr>
115 </table>
116 <table cellspacing="5" cellpadding="0" border="0">
117   <tr>
118     <td>
119       &nbsp;
120     </td>
121     <td>
122
123 <p>
124 Destructor The destructor transparently tidies up any resources used by the socket engine. 
125 <p>
126
127 <p>
128 Definition at line <a class="el" href="socketengine_8cpp-source.html#l00046">46</a> of file <a class="el" href="socketengine_8cpp-source.html">socketengine.cpp</a>.
129 <p>
130 References <a class="el" href="inspircd__io_8h-source.html#l00029">DEBUG</a>, <a class="el" href="socketengine_8h-source.html#l00069">EngineHandle</a>, and <a class="el" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log()</a>.<div class="fragment"><pre class="fragment"><a name="l00047"></a>00047 {
131 <a name="l00048"></a>00048         <a class="code" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log</a>(<a class="code" href="inspircd__io_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"SocketEngine::~SocketEngine()"</span>);
132 <a name="l00049"></a>00049 <span class="preprocessor">#ifdef USE_EPOLL</span>
133 <a name="l00050"></a>00050 <span class="preprocessor"></span>        close(<a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a>);
134 <a name="l00051"></a>00051 <span class="preprocessor">#endif</span>
135 <a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_KQUEUE</span>
136 <a name="l00053"></a>00053 <span class="preprocessor"></span>        close(<a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a>);
137 <a name="l00054"></a>00054 <span class="preprocessor">#endif</span>
138 <a name="l00055"></a>00055 <span class="preprocessor"></span>}
139 </pre></div>
140 <p>
141     </td>
142   </tr>
143 </table>
144 <hr><h2>Member Function Documentation</h2>
145 <a class="anchor" name="AddFd_28int_20fd_2C_20bool_20readable_2C_20char_20type_29"></a><!-- doxytag: member="SocketEngine::AddFd" ref="AddFd_28int_20fd_2C_20bool_20readable_2C_20char_20type_29" args="(int fd, bool readable, char type)" --><p>
146 <table class="mdTable" cellpadding="2" cellspacing="0">
147   <tr>
148     <td class="mdRow">
149       <table cellpadding="0" cellspacing="0" border="0">
150         <tr>
151           <td class="md" nowrap valign="top">bool SocketEngine::AddFd           </td>
152           <td class="md" valign="top">(&nbsp;</td>
153           <td class="md" nowrap valign="top">int&nbsp;</td>
154           <td class="mdname" nowrap> <em>fd</em>, </td>
155         </tr>
156         <tr>
157           <td class="md" nowrap align="right"></td>
158           <td class="md"></td>
159           <td class="md" nowrap>bool&nbsp;</td>
160           <td class="mdname" nowrap> <em>readable</em>, </td>
161         </tr>
162         <tr>
163           <td class="md" nowrap align="right"></td>
164           <td class="md"></td>
165           <td class="md" nowrap>char&nbsp;</td>
166           <td class="mdname" nowrap> <em>type</em></td>
167         </tr>
168         <tr>
169           <td class="md"></td>
170           <td class="md">)&nbsp;</td>
171           <td class="md" colspan="2"></td>
172         </tr>
173       </table>
174     </td>
175   </tr>
176 </table>
177 <table cellspacing="5" cellpadding="0" border="0">
178   <tr>
179     <td>
180       &nbsp;
181     </td>
182     <td>
183
184 <p>
185 Add a file descriptor to the engine Use AddFd to add a file descriptor to the engine and have the socket engine monitor it. 
186 <p>
187 You must provide a type (see the consts in <a class="el" href="socketengine_8h.html">socketengine.h</a>) and a boolean flag to indicate wether to watch this fd for read or write events (there is currently no need for support of both).
188 <p>
189 Definition at line <a class="el" href="socketengine_8cpp-source.html#l00065">65</a> of file <a class="el" href="socketengine_8cpp-source.html">socketengine.cpp</a>.
190 <p>
191 References <a class="el" href="inspircd__io_8h-source.html#l00029">DEBUG</a>, <a class="el" href="socketengine_8h-source.html#l00069">EngineHandle</a>, <a class="el" href="socketengine_8h-source.html#l00068">fds</a>, <a class="el" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log()</a>, <a class="el" href="socketengine_8cpp-source.html#l00033">ref</a>, and <a class="el" href="socketengine_8h-source.html#l00055">X_READBIT</a>.
192 <p>
193 Referenced by <a class="el" href="users_8cpp-source.html#l00524">AddClient()</a>, <a class="el" href="socket_8cpp-source.html#l00050">InspSocket::InspSocket()</a>, and <a class="el" href="socket_8cpp-source.html#l00216">InspSocket::Poll()</a>.<div class="fragment"><pre class="fragment"><a name="l00066"></a>00066 {
194 <a name="l00067"></a>00067         <span class="keywordflow">if</span> ((fd &lt; 0) || (fd &gt; 65535))
195 <a name="l00068"></a>00068                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
196 <a name="l00069"></a>00069         this-&gt;<a class="code" href="classSocketEngine.html#fds">fds</a>.push_back(fd);
197 <a name="l00070"></a>00070         <a class="code" href="socketengine_8cpp.html#ref_5B_36_35_35_33_35_5D">ref</a>[fd] = type;
198 <a name="l00071"></a>00071         <span class="keywordflow">if</span> (readable)
199 <a name="l00072"></a>00072         {
200 <a name="l00073"></a>00073                 <a class="code" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log</a>(<a class="code" href="inspircd__io_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"Set readbit"</span>);
201 <a name="l00074"></a>00074                 <a class="code" href="socketengine_8cpp.html#ref_5B_36_35_35_33_35_5D">ref</a>[fd] |= <a class="code" href="socketengine_8h.html#X_5FREADBIT">X_READBIT</a>;
202 <a name="l00075"></a>00075         }
203 <a name="l00076"></a>00076         <a class="code" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log</a>(<a class="code" href="inspircd__io_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"Add socket %d"</span>,fd);
204 <a name="l00077"></a>00077 <span class="preprocessor">#ifdef USE_EPOLL</span>
205 <a name="l00078"></a>00078 <span class="preprocessor"></span>        <span class="keyword">struct </span>epoll_event ev;
206 <a name="l00079"></a>00079         <a class="code" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log</a>(<a class="code" href="inspircd__io_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"epoll: Add socket to events, ep=%d socket=%d"</span>,<a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a>,fd);
207 <a name="l00080"></a>00080         readable ? ev.events = EPOLLIN | EPOLLET : ev.events = EPOLLOUT | EPOLLET;
208 <a name="l00081"></a>00081         ev.data.fd = fd;
209 <a name="l00082"></a>00082         <span class="keywordtype">int</span> i = epoll_ctl(<a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a>, EPOLL_CTL_ADD, fd, &amp;ev);
210 <a name="l00083"></a>00083         <span class="keywordflow">if</span> (i &lt; 0)
211 <a name="l00084"></a>00084         {
212 <a name="l00085"></a>00085                 <a class="code" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log</a>(<a class="code" href="inspircd__io_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"epoll: List insertion failure!"</span>);
213 <a name="l00086"></a>00086                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
214 <a name="l00087"></a>00087         }
215 <a name="l00088"></a>00088 <span class="preprocessor">#endif</span>
216 <a name="l00089"></a>00089 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_KQUEUE</span>
217 <a name="l00090"></a>00090 <span class="preprocessor"></span>        <span class="keyword">struct </span>kevent ke;
218 <a name="l00091"></a>00091         <a class="code" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log</a>(<a class="code" href="inspircd__io_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"kqueue: Add socket to events, kq=%d socket=%d"</span>,<a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a>,fd);
219 <a name="l00092"></a>00092         EV_SET(&amp;ke, fd, readable ? EVFILT_READ : EVFILT_WRITE, EV_ADD, 0, 0, NULL);
220 <a name="l00093"></a>00093         <span class="keywordtype">int</span> i = kevent(<a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a>, &amp;ke, 1, 0, 0, NULL);
221 <a name="l00094"></a>00094         <span class="keywordflow">if</span> (i == -1)
222 <a name="l00095"></a>00095         {
223 <a name="l00096"></a>00096                 <a class="code" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log</a>(<a class="code" href="inspircd__io_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"kqueue: List insertion failure!"</span>);
224 <a name="l00097"></a>00097                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
225 <a name="l00098"></a>00098         }
226 <a name="l00099"></a>00099 <span class="preprocessor">#endif</span>
227 <a name="l00100"></a>00100 <span class="preprocessor"></span><span class="keywordflow">return</span> <span class="keyword">true</span>;
228 <a name="l00101"></a>00101 }
229 </pre></div>
230 <p>
231     </td>
232   </tr>
233 </table>
234 <a class="anchor" name="DelFd_28int_20fd_29"></a><!-- doxytag: member="SocketEngine::DelFd" ref="DelFd_28int_20fd_29" args="(int fd)" --><p>
235 <table class="mdTable" cellpadding="2" cellspacing="0">
236   <tr>
237     <td class="mdRow">
238       <table cellpadding="0" cellspacing="0" border="0">
239         <tr>
240           <td class="md" nowrap valign="top">bool SocketEngine::DelFd           </td>
241           <td class="md" valign="top">(&nbsp;</td>
242           <td class="md" nowrap valign="top">int&nbsp;</td>
243           <td class="mdname1" valign="top" nowrap> <em>fd</em>          </td>
244           <td class="md" valign="top">&nbsp;)&nbsp;</td>
245           <td class="md" nowrap></td>
246         </tr>
247       </table>
248     </td>
249   </tr>
250 </table>
251 <table cellspacing="5" cellpadding="0" border="0">
252   <tr>
253     <td>
254       &nbsp;
255     </td>
256     <td>
257
258 <p>
259 Delete a file descriptor f rom the engine This function call deletes a file descriptor from the engine, returning true if it succeeded and false if it failed. 
260 <p>
261
262 <p>
263 Definition at line <a class="el" href="socketengine_8cpp-source.html#l00103">103</a> of file <a class="el" href="socketengine_8cpp-source.html">socketengine.cpp</a>.
264 <p>
265 References <a class="el" href="inspircd__io_8h-source.html#l00029">DEBUG</a>, <a class="el" href="socketengine_8h-source.html#l00069">EngineHandle</a>, <a class="el" href="socketengine_8h-source.html#l00068">fds</a>, <a class="el" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log()</a>, <a class="el" href="socketengine_8cpp-source.html#l00033">ref</a>, and <a class="el" href="socketengine_8h-source.html#l00055">X_READBIT</a>.
266 <p>
267 Referenced by <a class="el" href="users_8cpp-source.html#l00349">kill_link()</a>, <a class="el" href="users_8cpp-source.html#l00412">kill_link_silent()</a>, <a class="el" href="socket_8cpp-source.html#l00216">InspSocket::Poll()</a>, and <a class="el" href="modules_8cpp-source.html#l00597">Server::UserToPseudo()</a>.<div class="fragment"><pre class="fragment"><a name="l00104"></a>00104 {
268 <a name="l00105"></a>00105         <a class="code" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log</a>(<a class="code" href="inspircd__io_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"SocketEngine::DelFd(%d)"</span>,fd);
269 <a name="l00106"></a>00106 
270 <a name="l00107"></a>00107         <span class="keywordflow">if</span> ((fd &lt; 0) || (fd &gt; 65535))
271 <a name="l00108"></a>00108                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
272 <a name="l00109"></a>00109 
273 <a name="l00110"></a>00110         <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;
274 <a name="l00111"></a>00111         <span class="keywordflow">for</span> (std::vector&lt;int&gt;::iterator i = <a class="code" href="classSocketEngine.html#fds">fds</a>.begin(); i != <a class="code" href="classSocketEngine.html#fds">fds</a>.end(); i++)
275 <a name="l00112"></a>00112         {
276 <a name="l00113"></a>00113                 <span class="keywordflow">if</span> (*i == fd)
277 <a name="l00114"></a>00114                 {
278 <a name="l00115"></a>00115                         <a class="code" href="classSocketEngine.html#fds">fds</a>.erase(i);
279 <a name="l00116"></a>00116                         <a class="code" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log</a>(<a class="code" href="inspircd__io_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"Deleted fd %d"</span>,fd);
280 <a name="l00117"></a>00117                         found = <span class="keyword">true</span>;
281 <a name="l00118"></a>00118                         <span class="keywordflow">break</span>;
282 <a name="l00119"></a>00119                 }
283 <a name="l00120"></a>00120         }
284 <a name="l00121"></a>00121 <span class="preprocessor">#ifdef USE_KQUEUE</span>
285 <a name="l00122"></a>00122 <span class="preprocessor"></span>        <span class="keyword">struct </span>kevent ke;
286 <a name="l00123"></a>00123         EV_SET(&amp;ke, fd, <a class="code" href="socketengine_8cpp.html#ref_5B_36_35_35_33_35_5D">ref</a>[fd] &amp; <a class="code" href="socketengine_8h.html#X_5FREADBIT">X_READBIT</a> ? EVFILT_READ : EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
287 <a name="l00124"></a>00124         <span class="keywordtype">int</span> i = kevent(<a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a>, &amp;ke, 1, 0, 0, NULL);
288 <a name="l00125"></a>00125         <span class="keywordflow">if</span> (i == -1)
289 <a name="l00126"></a>00126         {
290 <a name="l00127"></a>00127                 <a class="code" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log</a>(<a class="code" href="inspircd__io_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"kqueue: Failed to remove socket from queue!"</span>);
291 <a name="l00128"></a>00128                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
292 <a name="l00129"></a>00129         }
293 <a name="l00130"></a>00130 <span class="preprocessor">#endif</span>
294 <a name="l00131"></a>00131 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_EPOLL</span>
295 <a name="l00132"></a>00132 <span class="preprocessor"></span>        <span class="keyword">struct </span>epoll_event ev;
296 <a name="l00133"></a>00133         <a class="code" href="socketengine_8cpp.html#ref_5B_36_35_35_33_35_5D">ref</a>[fd] &amp;&amp; <a class="code" href="socketengine_8h.html#X_5FREADBIT">X_READBIT</a> ? ev.events = EPOLLIN | EPOLLET : ev.events = EPOLLOUT | EPOLLET;
297 <a name="l00134"></a>00134         ev.data.fd = fd;
298 <a name="l00135"></a>00135         <span class="keywordtype">int</span> i = epoll_ctl(<a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a>, EPOLL_CTL_DEL, fd, &amp;ev);
299 <a name="l00136"></a>00136         <span class="keywordflow">if</span> (i &lt; 0)
300 <a name="l00137"></a>00137         {
301 <a name="l00138"></a>00138                 <a class="code" href="globals_8h.html#log_28int_20level_2C_20char_20_2Atext_2C_2E_2E_2E_29">log</a>(<a class="code" href="inspircd__io_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"epoll: List deletion failure!"</span>);
302 <a name="l00139"></a>00139                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
303 <a name="l00140"></a>00140         }
304 <a name="l00141"></a>00141 <span class="preprocessor">#endif</span>
305 <a name="l00142"></a>00142 <span class="preprocessor"></span>        <a class="code" href="socketengine_8cpp.html#ref_5B_36_35_35_33_35_5D">ref</a>[fd] = 0;
306 <a name="l00143"></a>00143         <span class="keywordflow">return</span> found;
307 <a name="l00144"></a>00144 }
308 </pre></div>
309 <p>
310     </td>
311   </tr>
312 </table>
313 <a class="anchor" name="GetName_28_29"></a><!-- doxytag: member="SocketEngine::GetName" ref="GetName_28_29" args="()" --><p>
314 <table class="mdTable" cellpadding="2" cellspacing="0">
315   <tr>
316     <td class="mdRow">
317       <table cellpadding="0" cellspacing="0" border="0">
318         <tr>
319           <td class="md" nowrap valign="top"><a class="el" href="namespaceirc.html#string">std::string</a> SocketEngine::GetName           </td>
320           <td class="md" valign="top">(&nbsp;</td>
321           <td class="mdname1" valign="top" nowrap>          </td>
322           <td class="md" valign="top">&nbsp;)&nbsp;</td>
323           <td class="md" nowrap></td>
324         </tr>
325       </table>
326     </td>
327   </tr>
328 </table>
329 <table cellspacing="5" cellpadding="0" border="0">
330   <tr>
331     <td>
332       &nbsp;
333     </td>
334     <td>
335
336 <p>
337 Returns the socket engines name This returns the name of the engine for use in /VERSION responses. 
338 <p>
339
340 <p>
341 Definition at line <a class="el" href="socketengine_8cpp-source.html#l00193">193</a> of file <a class="el" href="socketengine_8cpp-source.html">socketengine.cpp</a>.<div class="fragment"><pre class="fragment"><a name="l00194"></a>00194 {
342 <a name="l00195"></a>00195 <span class="preprocessor">#ifdef USE_SELECT</span>
343 <a name="l00196"></a>00196 <span class="preprocessor"></span>        <span class="keywordflow">return</span> <span class="stringliteral">"select"</span>;
344 <a name="l00197"></a>00197 <span class="preprocessor">#endif</span>
345 <a name="l00198"></a>00198 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_KQUEUE</span>
346 <a name="l00199"></a>00199 <span class="preprocessor"></span>        <span class="keywordflow">return</span> <span class="stringliteral">"kqueue"</span>;
347 <a name="l00200"></a>00200 <span class="preprocessor">#endif</span>
348 <a name="l00201"></a>00201 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_EPOLL</span>
349 <a name="l00202"></a>00202 <span class="preprocessor"></span>        <span class="keywordflow">return</span> <span class="stringliteral">"epoll"</span>;
350 <a name="l00203"></a>00203 <span class="preprocessor">#endif</span>
351 <a name="l00204"></a>00204 <span class="preprocessor"></span>        <span class="keywordflow">return</span> <span class="stringliteral">"misconfigured"</span>;
352 <a name="l00205"></a>00205 }
353 </pre></div>
354 <p>
355     </td>
356   </tr>
357 </table>
358 <a class="anchor" name="GetType_28int_20fd_29"></a><!-- doxytag: member="SocketEngine::GetType" ref="GetType_28int_20fd_29" args="(int fd)" --><p>
359 <table class="mdTable" cellpadding="2" cellspacing="0">
360   <tr>
361     <td class="mdRow">
362       <table cellpadding="0" cellspacing="0" border="0">
363         <tr>
364           <td class="md" nowrap valign="top">char SocketEngine::GetType           </td>
365           <td class="md" valign="top">(&nbsp;</td>
366           <td class="md" nowrap valign="top">int&nbsp;</td>
367           <td class="mdname1" valign="top" nowrap> <em>fd</em>          </td>
368           <td class="md" valign="top">&nbsp;)&nbsp;</td>
369           <td class="md" nowrap></td>
370         </tr>
371       </table>
372     </td>
373   </tr>
374 </table>
375 <table cellspacing="5" cellpadding="0" border="0">
376   <tr>
377     <td>
378       &nbsp;
379     </td>
380     <td>
381
382 <p>
383 Returns the type value for this file descriptor This function masks off the X_READBIT value so that the type of the socket can be obtained. 
384 <p>
385 The core uses this to decide where to dispatch the event to. Please note that some engines such as select() have an upper limit of 1024 descriptors which may be active at any one time, where others such as kqueue have no practical limits at all.
386 <p>
387 Definition at line <a class="el" href="socketengine_8cpp-source.html#l00057">57</a> of file <a class="el" href="socketengine_8cpp-source.html">socketengine.cpp</a>.
388 <p>
389 References <a class="el" href="socketengine_8cpp-source.html#l00033">ref</a>, and <a class="el" href="socketengine_8h-source.html#l00041">X_EMPTY_SLOT</a>.<div class="fragment"><pre class="fragment"><a name="l00058"></a>00058 {
390 <a name="l00059"></a>00059         <span class="keywordflow">if</span> ((fd &lt; 0) || (fd &gt; 65535))
391 <a name="l00060"></a>00060                 <span class="keywordflow">return</span> <a class="code" href="socketengine_8h.html#X_5FEMPTY_5FSLOT">X_EMPTY_SLOT</a>;
392 <a name="l00061"></a>00061         <span class="comment">/* Mask off the top bit used for 'read/write' state */</span>
393 <a name="l00062"></a>00062         <span class="keywordflow">return</span> (<a class="code" href="socketengine_8cpp.html#ref_5B_36_35_35_33_35_5D">ref</a>[fd] &amp; ~0x80);
394 <a name="l00063"></a>00063 }
395 </pre></div>
396 <p>
397     </td>
398   </tr>
399 </table>
400 <a class="anchor" name="Wait_28std_3A_3Avector_3C_20int_20_3E_20_26fdlist_29"></a><!-- doxytag: member="SocketEngine::Wait" ref="Wait_28std_3A_3Avector_3C_20int_20_3E_20_26fdlist_29" args="(std::vector&lt; int &gt; &amp;fdlist)" --><p>
401 <table class="mdTable" cellpadding="2" cellspacing="0">
402   <tr>
403     <td class="mdRow">
404       <table cellpadding="0" cellspacing="0" border="0">
405         <tr>
406           <td class="md" nowrap valign="top">bool SocketEngine::Wait           </td>
407           <td class="md" valign="top">(&nbsp;</td>
408           <td class="md" nowrap valign="top">std::vector&lt; int &gt; &amp;&nbsp;</td>
409           <td class="mdname1" valign="top" nowrap> <em>fdlist</em>          </td>
410           <td class="md" valign="top">&nbsp;)&nbsp;</td>
411           <td class="md" nowrap></td>
412         </tr>
413       </table>
414     </td>
415   </tr>
416 </table>
417 <table cellspacing="5" cellpadding="0" border="0">
418   <tr>
419     <td>
420       &nbsp;
421     </td>
422     <td>
423
424 <p>
425 Waits for an event. 
426 <p>
427 Please note that this doesnt wait long, only a couple of milliseconds. It returns a list of active file descriptors in the vector fdlist which the core may then act upon.
428 <p>
429 Definition at line <a class="el" href="socketengine_8cpp-source.html#l00146">146</a> of file <a class="el" href="socketengine_8cpp-source.html">socketengine.cpp</a>.
430 <p>
431 References <a class="el" href="socketengine_8h-source.html#l00069">EngineHandle</a>, <a class="el" href="socketengine_8h-source.html#l00068">fds</a>, <a class="el" href="socketengine_8h-source.html#l00074">ke_list</a>, <a class="el" href="socketengine_8cpp-source.html#l00033">ref</a>, <a class="el" href="socketengine_8h-source.html#l00075">ts</a>, and <a class="el" href="socketengine_8h-source.html#l00055">X_READBIT</a>.<div class="fragment"><pre class="fragment"><a name="l00147"></a>00147 {
432 <a name="l00148"></a>00148         fdlist.clear();
433 <a name="l00149"></a>00149 <span class="preprocessor">#ifdef USE_SELECT</span>
434 <a name="l00150"></a>00150 <span class="preprocessor"></span>        FD_ZERO(&amp;wfdset);
435 <a name="l00151"></a>00151         FD_ZERO(&amp;rfdset);
436 <a name="l00152"></a>00152         timeval tval;
437 <a name="l00153"></a>00153         <span class="keywordtype">int</span> sresult;
438 <a name="l00154"></a>00154         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> a = 0; a &lt; <a class="code" href="classSocketEngine.html#fds">fds</a>.size(); a++)
439 <a name="l00155"></a>00155         {
440 <a name="l00156"></a>00156                 <span class="keywordflow">if</span> (<a class="code" href="socketengine_8cpp.html#ref_5B_36_35_35_33_35_5D">ref</a>[<a class="code" href="classSocketEngine.html#fds">fds</a>[a]] &amp; <a class="code" href="socketengine_8h.html#X_5FREADBIT">X_READBIT</a>)
441 <a name="l00157"></a>00157                 {
442 <a name="l00158"></a>00158                         FD_SET (<a class="code" href="classSocketEngine.html#fds">fds</a>[a], &amp;rfdset);
443 <a name="l00159"></a>00159                 }
444 <a name="l00160"></a>00160                 <span class="keywordflow">else</span>
445 <a name="l00161"></a>00161                 {
446 <a name="l00162"></a>00162                         FD_SET (<a class="code" href="classSocketEngine.html#fds">fds</a>[a], &amp;wfdset);
447 <a name="l00163"></a>00163                 }
448 <a name="l00164"></a>00164                 
449 <a name="l00165"></a>00165         }
450 <a name="l00166"></a>00166         tval.tv_sec = 0;
451 <a name="l00167"></a>00167         tval.tv_usec = 100L;
452 <a name="l00168"></a>00168         sresult = select(FD_SETSIZE, &amp;rfdset, &amp;wfdset, NULL, &amp;tval);
453 <a name="l00169"></a>00169         <span class="keywordflow">if</span> (sresult &gt; 0)
454 <a name="l00170"></a>00170         {
455 <a name="l00171"></a>00171                 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> a = 0; a &lt; <a class="code" href="classSocketEngine.html#fds">fds</a>.size(); a++)
456 <a name="l00172"></a>00172                 {
457 <a name="l00173"></a>00173                         <span class="keywordflow">if</span> ((FD_ISSET (<a class="code" href="classSocketEngine.html#fds">fds</a>[a], &amp;rfdset)) || (FD_ISSET (<a class="code" href="classSocketEngine.html#fds">fds</a>[a], &amp;wfdset)))
458 <a name="l00174"></a>00174                                 fdlist.push_back(<a class="code" href="classSocketEngine.html#fds">fds</a>[a]);
459 <a name="l00175"></a>00175                 }
460 <a name="l00176"></a>00176         }
461 <a name="l00177"></a>00177 <span class="preprocessor">#endif</span>
462 <a name="l00178"></a>00178 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_KQUEUE</span>
463 <a name="l00179"></a>00179 <span class="preprocessor"></span>        <a class="code" href="classSocketEngine.html#ts">ts</a>.tv_nsec = 10000L;
464 <a name="l00180"></a>00180         <a class="code" href="classSocketEngine.html#ts">ts</a>.tv_sec = 0;
465 <a name="l00181"></a>00181         <span class="keywordtype">int</span> i = kevent(<a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a>, NULL, 0, &amp;<a class="code" href="classSocketEngine.html#ke_5Flist_5B_36_35_35_33_35_5D">ke_list</a>[0], 65535, &amp;<a class="code" href="classSocketEngine.html#ts">ts</a>);
466 <a name="l00182"></a>00182         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; i; j++)
467 <a name="l00183"></a>00183                 fdlist.push_back(<a class="code" href="classSocketEngine.html#ke_5Flist_5B_36_35_35_33_35_5D">ke_list</a>[j].ident);
468 <a name="l00184"></a>00184 <span class="preprocessor">#endif</span>
469 <a name="l00185"></a>00185 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_EPOLL</span>
470 <a name="l00186"></a>00186 <span class="preprocessor"></span>        <span class="keywordtype">int</span> i = epoll_wait(<a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a>, events, 65535, 100);
471 <a name="l00187"></a>00187         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; i; j++)
472 <a name="l00188"></a>00188                 fdlist.push_back(events[j].data.fd);
473 <a name="l00189"></a>00189 <span class="preprocessor">#endif</span>
474 <a name="l00190"></a>00190 <span class="preprocessor"></span>        <span class="keywordflow">return</span> <span class="keyword">true</span>;
475 <a name="l00191"></a>00191 }
476 </pre></div>
477 <p>
478     </td>
479   </tr>
480 </table>
481 <hr><h2>Member Data Documentation</h2>
482 <a class="anchor" name="EngineHandle"></a><!-- doxytag: member="SocketEngine::EngineHandle" ref="EngineHandle" args="" --><p>
483 <table class="mdTable" cellpadding="2" cellspacing="0">
484   <tr>
485     <td class="mdRow">
486       <table cellpadding="0" cellspacing="0" border="0">
487         <tr>
488           <td class="md" nowrap valign="top">int <a class="el" href="classSocketEngine.html#EngineHandle">SocketEngine::EngineHandle</a><code> [private]</code>          </td>
489         </tr>
490       </table>
491     </td>
492   </tr>
493 </table>
494 <table cellspacing="5" cellpadding="0" border="0">
495   <tr>
496     <td>
497       &nbsp;
498     </td>
499     <td>
500
501 <p>
502
503 <p>
504 Definition at line <a class="el" href="socketengine_8h-source.html#l00069">69</a> of file <a class="el" href="socketengine_8h-source.html">socketengine.h</a>.
505 <p>
506 Referenced by <a class="el" href="socketengine_8cpp-source.html#l00065">AddFd()</a>, <a class="el" href="socketengine_8cpp-source.html#l00103">DelFd()</a>, <a class="el" href="socketengine_8cpp-source.html#l00035">SocketEngine()</a>, <a class="el" href="socketengine_8cpp-source.html#l00146">Wait()</a>, and <a class="el" href="socketengine_8cpp-source.html#l00046">~SocketEngine()</a>.    </td>
507   </tr>
508 </table>
509 <a class="anchor" name="fds"></a><!-- doxytag: member="SocketEngine::fds" ref="fds" args="" --><p>
510 <table class="mdTable" cellpadding="2" cellspacing="0">
511   <tr>
512     <td class="mdRow">
513       <table cellpadding="0" cellspacing="0" border="0">
514         <tr>
515           <td class="md" nowrap valign="top">std::vector&lt;int&gt; <a class="el" href="classSocketEngine.html#fds">SocketEngine::fds</a><code> [private]</code>          </td>
516         </tr>
517       </table>
518     </td>
519   </tr>
520 </table>
521 <table cellspacing="5" cellpadding="0" border="0">
522   <tr>
523     <td>
524       &nbsp;
525     </td>
526     <td>
527
528 <p>
529
530 <p>
531 Definition at line <a class="el" href="socketengine_8h-source.html#l00068">68</a> of file <a class="el" href="socketengine_8h-source.html">socketengine.h</a>.
532 <p>
533 Referenced by <a class="el" href="socketengine_8cpp-source.html#l00065">AddFd()</a>, <a class="el" href="socketengine_8cpp-source.html#l00103">DelFd()</a>, and <a class="el" href="socketengine_8cpp-source.html#l00146">Wait()</a>.    </td>
534   </tr>
535 </table>
536 <a class="anchor" name="ke_5Flist_5B_36_35_35_33_35_5D"></a><!-- doxytag: member="SocketEngine::ke_list" ref="ke_5Flist_5B_36_35_35_33_35_5D" args="[65535]" --><p>
537 <table class="mdTable" cellpadding="2" cellspacing="0">
538   <tr>
539     <td class="mdRow">
540       <table cellpadding="0" cellspacing="0" border="0">
541         <tr>
542           <td class="md" nowrap valign="top">struct kevent <a class="el" href="classSocketEngine.html#ke_5Flist_5B_36_35_35_33_35_5D">SocketEngine::ke_list</a>[65535]<code> [private]</code>          </td>
543         </tr>
544       </table>
545     </td>
546   </tr>
547 </table>
548 <table cellspacing="5" cellpadding="0" border="0">
549   <tr>
550     <td>
551       &nbsp;
552     </td>
553     <td>
554
555 <p>
556
557 <p>
558 Definition at line <a class="el" href="socketengine_8h-source.html#l00074">74</a> of file <a class="el" href="socketengine_8h-source.html">socketengine.h</a>.
559 <p>
560 Referenced by <a class="el" href="socketengine_8cpp-source.html#l00146">Wait()</a>.    </td>
561   </tr>
562 </table>
563 <a class="anchor" name="ts"></a><!-- doxytag: member="SocketEngine::ts" ref="ts" args="" --><p>
564 <table class="mdTable" cellpadding="2" cellspacing="0">
565   <tr>
566     <td class="mdRow">
567       <table cellpadding="0" cellspacing="0" border="0">
568         <tr>
569           <td class="md" nowrap valign="top">struct timespec <a class="el" href="classSocketEngine.html#ts">SocketEngine::ts</a><code> [private]</code>          </td>
570         </tr>
571       </table>
572     </td>
573   </tr>
574 </table>
575 <table cellspacing="5" cellpadding="0" border="0">
576   <tr>
577     <td>
578       &nbsp;
579     </td>
580     <td>
581
582 <p>
583
584 <p>
585 Definition at line <a class="el" href="socketengine_8h-source.html#l00075">75</a> of file <a class="el" href="socketengine_8h-source.html">socketengine.h</a>.
586 <p>
587 Referenced by <a class="el" href="socketengine_8cpp-source.html#l00146">Wait()</a>.    </td>
588   </tr>
589 </table>
590 <hr>The documentation for this class was generated from the following files:<ul>
591 <li><a class="el" href="socketengine_8h-source.html">socketengine.h</a><li><a class="el" href="socketengine_8cpp-source.html">socketengine.cpp</a></ul>
592 <hr size="1"><address style="align: right;"><small>Generated on Mon Dec 19 18:05:23 2005 for InspIRCd by&nbsp;
593 <a href="http://www.doxygen.org/index.html">
594 <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.4-20050815 </small></address>
595 </body>
596 </html>