<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>InspIRCd: SocketEngine Class Reference</title>
<link href="inspircd.doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.4-20050815 -->
<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>
<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.  
<a href="#_details">More...</a>
<p>
<code>#include &lt;<a class="el" href="socketengine_8h-source.html">socketengine.h</a>&gt;</code>
<p>
Collaboration diagram for SocketEngine:<p><center><img src="classSocketEngine__coll__graph.gif" border="0" usemap="#SocketEngine__coll__map" alt="Collaboration graph"></center>
<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">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
<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>

<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>
<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>

<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>
<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>

<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>
<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>

<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>
<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>

<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>
<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>

<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>
<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>

<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>
<tr><td colspan="2"><br><h2>Private Attributes</h2></td></tr>
<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>

<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>

<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>

<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>

</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
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. 
<p>
The current version supports select, epoll and kqueue.
<p>

<p>
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>
<a class="anchor" name="SocketEngine_28_29"></a><!-- doxytag: member="SocketEngine::SocketEngine" ref="SocketEngine_28_29" args="()" --><p>
<table class="mdTable" cellpadding="2" cellspacing="0">
  <tr>
    <td class="mdRow">
      <table cellpadding="0" cellspacing="0" border="0">
        <tr>
          <td class="md" nowrap valign="top">SocketEngine::SocketEngine           </td>
          <td class="md" valign="top">(&nbsp;</td>
          <td class="mdname1" valign="top" nowrap>          </td>
          <td class="md" valign="top">&nbsp;)&nbsp;</td>
          <td class="md" nowrap></td>
        </tr>
      </table>
    </td>
  </tr>
</table>
<table cellspacing="5" cellpadding="0" border="0">
  <tr>
    <td>
      &nbsp;
    </td>
    <td>

<p>
Constructor The constructor transparently initializes the socket engine which the ircd is using. 
<p>
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.
<p>
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>.
<p>
References <a class="el" href="modules_8h-source.html#l00023">DEBUG</a>, and <a class="el" href="socketengine_8h-source.html#l00069">EngineHandle</a>.<div class="fragment"><pre class="fragment"><a name="l00036"></a>00036 {
<a name="l00037"></a>00037         log(<a class="code" href="modules_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"SocketEngine::SocketEngine()"</span>);
<a name="l00038"></a>00038 <span class="preprocessor">#ifdef USE_EPOLL</span>
<a name="l00039"></a>00039 <span class="preprocessor"></span>        <a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a> = epoll_create(65535);
<a name="l00040"></a>00040 <span class="preprocessor">#endif</span>
<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_KQUEUE</span>
<a name="l00042"></a>00042 <span class="preprocessor"></span>        <a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a> = kqueue();
<a name="l00043"></a>00043 <span class="preprocessor">#endif</span>
<a name="l00044"></a>00044 <span class="preprocessor"></span>}
</pre></div>
<p>
    </td>
  </tr>
</table>
<a class="anchor" name="_7ESocketEngine_28_29"></a><!-- doxytag: member="SocketEngine::~SocketEngine" ref="_7ESocketEngine_28_29" args="()" --><p>
<table class="mdTable" cellpadding="2" cellspacing="0">
  <tr>
    <td class="mdRow">
      <table cellpadding="0" cellspacing="0" border="0">
        <tr>
          <td class="md" nowrap valign="top">SocketEngine::~SocketEngine           </td>
          <td class="md" valign="top">(&nbsp;</td>
          <td class="mdname1" valign="top" nowrap>          </td>
          <td class="md" valign="top">&nbsp;)&nbsp;</td>
          <td class="md" nowrap></td>
        </tr>
      </table>
    </td>
  </tr>
</table>
<table cellspacing="5" cellpadding="0" border="0">
  <tr>
    <td>
      &nbsp;
    </td>
    <td>

<p>
Destructor The destructor transparently tidies up any resources used by the socket engine. 
<p>

<p>
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>.
<p>
References <a class="el" href="modules_8h-source.html#l00023">DEBUG</a>, and <a class="el" href="socketengine_8h-source.html#l00069">EngineHandle</a>.<div class="fragment"><pre class="fragment"><a name="l00047"></a>00047 {
<a name="l00048"></a>00048         log(<a class="code" href="modules_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"SocketEngine::~SocketEngine()"</span>);
<a name="l00049"></a>00049 <span class="preprocessor">#ifdef USE_EPOLL</span>
<a name="l00050"></a>00050 <span class="preprocessor"></span>        close(<a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a>);
<a name="l00051"></a>00051 <span class="preprocessor">#endif</span>
<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_KQUEUE</span>
<a name="l00053"></a>00053 <span class="preprocessor"></span>        close(<a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a>);
<a name="l00054"></a>00054 <span class="preprocessor">#endif</span>
<a name="l00055"></a>00055 <span class="preprocessor"></span>}
</pre></div>
<p>
    </td>
  </tr>
</table>
<hr><h2>Member Function Documentation</h2>
<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>
<table class="mdTable" cellpadding="2" cellspacing="0">
  <tr>
    <td class="mdRow">
      <table cellpadding="0" cellspacing="0" border="0">
        <tr>
          <td class="md" nowrap valign="top">bool SocketEngine::AddFd           </td>
          <td class="md" valign="top">(&nbsp;</td>
          <td class="md" nowrap valign="top">int&nbsp;</td>
          <td class="mdname" nowrap> <em>fd</em>, </td>
        </tr>
        <tr>
          <td class="md" nowrap align="right"></td>
          <td class="md"></td>
          <td class="md" nowrap>bool&nbsp;</td>
          <td class="mdname" nowrap> <em>readable</em>, </td>
        </tr>
        <tr>
          <td class="md" nowrap align="right"></td>
          <td class="md"></td>
          <td class="md" nowrap>char&nbsp;</td>
          <td class="mdname" nowrap> <em>type</em></td>
        </tr>
        <tr>
          <td class="md"></td>
          <td class="md">)&nbsp;</td>
          <td class="md" colspan="2"></td>
        </tr>
      </table>
    </td>
  </tr>
</table>
<table cellspacing="5" cellpadding="0" border="0">
  <tr>
    <td>
      &nbsp;
    </td>
    <td>

<p>
Add a file descriptor to the engine Use AddFd to add a file descriptor to the engine and have the socket engine monitor it. 
<p>
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).
<p>
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>.
<p>
References <a class="el" href="modules_8h-source.html#l00023">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="socketengine_8cpp-source.html#l00033">ref</a>, and <a class="el" href="socketengine_8h-source.html#l00055">X_READBIT</a>.
<p>
Referenced by <a class="el" href="socket_8cpp-source.html#l00054">InspSocket::InspSocket()</a>, and <a class="el" href="socket_8cpp-source.html#l00214">InspSocket::Poll()</a>.<div class="fragment"><pre class="fragment"><a name="l00066"></a>00066 {
<a name="l00067"></a>00067         <span class="keywordflow">if</span> ((fd &lt; 0) || (fd &gt; 65535))
<a name="l00068"></a>00068                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00069"></a>00069         this-&gt;<a class="code" href="classSocketEngine.html#fds">fds</a>.push_back(fd);
<a name="l00070"></a>00070         <a class="code" href="socketengine_8cpp.html#ref_5B_36_35_35_33_35_5D">ref</a>[fd] = type;
<a name="l00071"></a>00071         <span class="keywordflow">if</span> (readable)
<a name="l00072"></a>00072         {
<a name="l00073"></a>00073                 log(<a class="code" href="modules_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"Set readbit"</span>);
<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>;
<a name="l00075"></a>00075         }
<a name="l00076"></a>00076         log(<a class="code" href="modules_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"Add socket %d"</span>,fd);
<a name="l00077"></a>00077 <span class="preprocessor">#ifdef USE_EPOLL</span>
<a name="l00078"></a>00078 <span class="preprocessor"></span>        <span class="keyword">struct </span>epoll_event ev;
<a name="l00079"></a>00079         log(<a class="code" href="modules_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);
<a name="l00080"></a>00080         readable ? ev.events = EPOLLIN | EPOLLET : ev.events = EPOLLOUT | EPOLLET;
<a name="l00081"></a>00081         ev.data.fd = fd;
<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);
<a name="l00083"></a>00083         <span class="keywordflow">if</span> (i &lt; 0)
<a name="l00084"></a>00084         {
<a name="l00085"></a>00085                 log(<a class="code" href="modules_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"epoll: List insertion failure!"</span>);
<a name="l00086"></a>00086                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00087"></a>00087         }
<a name="l00088"></a>00088 <span class="preprocessor">#endif</span>
<a name="l00089"></a>00089 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_KQUEUE</span>
<a name="l00090"></a>00090 <span class="preprocessor"></span>        <span class="keyword">struct </span>kevent ke;
<a name="l00091"></a>00091         log(<a class="code" href="modules_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);
<a name="l00092"></a>00092         EV_SET(&amp;ke, fd, readable ? EVFILT_READ : EVFILT_WRITE, EV_ADD, 0, 0, NULL);
<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);
<a name="l00094"></a>00094         <span class="keywordflow">if</span> (i == -1)
<a name="l00095"></a>00095         {
<a name="l00096"></a>00096                 log(<a class="code" href="modules_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"kqueue: List insertion failure!"</span>);
<a name="l00097"></a>00097                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00098"></a>00098         }
<a name="l00099"></a>00099 <span class="preprocessor">#endif</span>
<a name="l00100"></a>00100 <span class="preprocessor"></span><span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00101"></a>00101 }
</pre></div>
<p>
    </td>
  </tr>
</table>
<a class="anchor" name="DelFd_28int_20fd_29"></a><!-- doxytag: member="SocketEngine::DelFd" ref="DelFd_28int_20fd_29" args="(int fd)" --><p>
<table class="mdTable" cellpadding="2" cellspacing="0">
  <tr>
    <td class="mdRow">
      <table cellpadding="0" cellspacing="0" border="0">
        <tr>
          <td class="md" nowrap valign="top">bool SocketEngine::DelFd           </td>
          <td class="md" valign="top">(&nbsp;</td>
          <td class="md" nowrap valign="top">int&nbsp;</td>
          <td class="mdname1" valign="top" nowrap> <em>fd</em>          </td>
          <td class="md" valign="top">&nbsp;)&nbsp;</td>
          <td class="md" nowrap></td>
        </tr>
      </table>
    </td>
  </tr>
</table>
<table cellspacing="5" cellpadding="0" border="0">
  <tr>
    <td>
      &nbsp;
    </td>
    <td>

<p>
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. 
<p>

<p>
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>.
<p>
References <a class="el" href="modules_8h-source.html#l00023">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="socketengine_8cpp-source.html#l00033">ref</a>, and <a class="el" href="socketengine_8h-source.html#l00055">X_READBIT</a>.
<p>
Referenced by <a class="el" href="socket_8cpp-source.html#l00214">InspSocket::Poll()</a>, and <a class="el" href="modules_8cpp-source.html#l00669">Server::UserToPseudo()</a>.<div class="fragment"><pre class="fragment"><a name="l00104"></a>00104 {
<a name="l00105"></a>00105         log(<a class="code" href="modules_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"SocketEngine::DelFd(%d)"</span>,fd);
<a name="l00106"></a>00106 
<a name="l00107"></a>00107         <span class="keywordflow">if</span> ((fd &lt; 0) || (fd &gt; 65535))
<a name="l00108"></a>00108                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00109"></a>00109 
<a name="l00110"></a>00110         <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;
<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++)
<a name="l00112"></a>00112         {
<a name="l00113"></a>00113                 <span class="keywordflow">if</span> (*i == fd)
<a name="l00114"></a>00114                 {
<a name="l00115"></a>00115                         <a class="code" href="classSocketEngine.html#fds">fds</a>.erase(i);
<a name="l00116"></a>00116                         log(<a class="code" href="modules_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"Deleted fd %d"</span>,fd);
<a name="l00117"></a>00117                         found = <span class="keyword">true</span>;
<a name="l00118"></a>00118                         <span class="keywordflow">break</span>;
<a name="l00119"></a>00119                 }
<a name="l00120"></a>00120         }
<a name="l00121"></a>00121 <span class="preprocessor">#ifdef USE_KQUEUE</span>
<a name="l00122"></a>00122 <span class="preprocessor"></span>        <span class="keyword">struct </span>kevent ke;
<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;&amp; <a class="code" href="socketengine_8h.html#X_5FREADBIT">X_READBIT</a> ? EVFILT_READ : EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
<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);
<a name="l00125"></a>00125         <span class="keywordflow">if</span> (i == -1)
<a name="l00126"></a>00126         {
<a name="l00127"></a>00127                 log(<a class="code" href="modules_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"kqueue: Failed to remove socket from queue!"</span>);
<a name="l00128"></a>00128                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00129"></a>00129         }
<a name="l00130"></a>00130 <span class="preprocessor">#endif</span>
<a name="l00131"></a>00131 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_EPOLL</span>
<a name="l00132"></a>00132 <span class="preprocessor"></span>        <span class="keyword">struct </span>epoll_event ev;
<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;
<a name="l00134"></a>00134         ev.data.fd = fd;
<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);
<a name="l00136"></a>00136         <span class="keywordflow">if</span> (i &lt; 0)
<a name="l00137"></a>00137         {
<a name="l00138"></a>00138                 log(<a class="code" href="modules_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"epoll: List deletion failure!"</span>);
<a name="l00139"></a>00139                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00140"></a>00140         }
<a name="l00141"></a>00141 <span class="preprocessor">#endif</span>
<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;
<a name="l00143"></a>00143         <span class="keywordflow">return</span> found;
<a name="l00144"></a>00144 }
</pre></div>
<p>
    </td>
  </tr>
</table>
<a class="anchor" name="GetName_28_29"></a><!-- doxytag: member="SocketEngine::GetName" ref="GetName_28_29" args="()" --><p>
<table class="mdTable" cellpadding="2" cellspacing="0">
  <tr>
    <td class="mdRow">
      <table cellpadding="0" cellspacing="0" border="0">
        <tr>
          <td class="md" nowrap valign="top"><a class="el" href="namespaceirc.html#string">std::string</a> SocketEngine::GetName           </td>
          <td class="md" valign="top">(&nbsp;</td>
          <td class="mdname1" valign="top" nowrap>          </td>
          <td class="md" valign="top">&nbsp;)&nbsp;</td>
          <td class="md" nowrap></td>
        </tr>
      </table>
    </td>
  </tr>
</table>
<table cellspacing="5" cellpadding="0" border="0">
  <tr>
    <td>
      &nbsp;
    </td>
    <td>

<p>
Returns the socket engines name This returns the name of the engine for use in /VERSION responses. 
<p>

<p>
Definition at line <a class="el" href="socketengine_8cpp-source.html#l00196">196</a> of file <a class="el" href="socketengine_8cpp-source.html">socketengine.cpp</a>.<div class="fragment"><pre class="fragment"><a name="l00197"></a>00197 {
<a name="l00198"></a>00198 <span class="preprocessor">#ifdef USE_SELECT</span>
<a name="l00199"></a>00199 <span class="preprocessor"></span>        <span class="keywordflow">return</span> <span class="stringliteral">"select"</span>;
<a name="l00200"></a>00200 <span class="preprocessor">#endif</span>
<a name="l00201"></a>00201 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_KQUEUE</span>
<a name="l00202"></a>00202 <span class="preprocessor"></span>        <span class="keywordflow">return</span> <span class="stringliteral">"kqueue"</span>;
<a name="l00203"></a>00203 <span class="preprocessor">#endif</span>
<a name="l00204"></a>00204 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_EPOLL</span>
<a name="l00205"></a>00205 <span class="preprocessor"></span>        <span class="keywordflow">return</span> <span class="stringliteral">"epoll"</span>;
<a name="l00206"></a>00206 <span class="preprocessor">#endif</span>
<a name="l00207"></a>00207 <span class="preprocessor"></span>        <span class="keywordflow">return</span> <span class="stringliteral">"misconfigured"</span>;
<a name="l00208"></a>00208 }
</pre></div>
<p>
    </td>
  </tr>
</table>
<a class="anchor" name="GetType_28int_20fd_29"></a><!-- doxytag: member="SocketEngine::GetType" ref="GetType_28int_20fd_29" args="(int fd)" --><p>
<table class="mdTable" cellpadding="2" cellspacing="0">
  <tr>
    <td class="mdRow">
      <table cellpadding="0" cellspacing="0" border="0">
        <tr>
          <td class="md" nowrap valign="top">char SocketEngine::GetType           </td>
          <td class="md" valign="top">(&nbsp;</td>
          <td class="md" nowrap valign="top">int&nbsp;</td>
          <td class="mdname1" valign="top" nowrap> <em>fd</em>          </td>
          <td class="md" valign="top">&nbsp;)&nbsp;</td>
          <td class="md" nowrap></td>
        </tr>
      </table>
    </td>
  </tr>
</table>
<table cellspacing="5" cellpadding="0" border="0">
  <tr>
    <td>
      &nbsp;
    </td>
    <td>

<p>
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. 
<p>
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.
<p>
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>.
<p>
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 {
<a name="l00059"></a>00059         <span class="keywordflow">if</span> ((fd &lt; 0) || (fd &gt; 65535))
<a name="l00060"></a>00060                 <span class="keywordflow">return</span> <a class="code" href="socketengine_8h.html#X_5FEMPTY_5FSLOT">X_EMPTY_SLOT</a>;
<a name="l00061"></a>00061         <span class="comment">/* Mask off the top bit used for 'read/write' state */</span>
<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);
<a name="l00063"></a>00063 }
</pre></div>
<p>
    </td>
  </tr>
</table>
<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>
<table class="mdTable" cellpadding="2" cellspacing="0">
  <tr>
    <td class="mdRow">
      <table cellpadding="0" cellspacing="0" border="0">
        <tr>
          <td class="md" nowrap valign="top">bool SocketEngine::Wait           </td>
          <td class="md" valign="top">(&nbsp;</td>
          <td class="md" nowrap valign="top">std::vector&lt; int &gt; &amp;&nbsp;</td>
          <td class="mdname1" valign="top" nowrap> <em>fdlist</em>          </td>
          <td class="md" valign="top">&nbsp;)&nbsp;</td>
          <td class="md" nowrap></td>
        </tr>
      </table>
    </td>
  </tr>
</table>
<table cellspacing="5" cellpadding="0" border="0">
  <tr>
    <td>
      &nbsp;
    </td>
    <td>

<p>
Waits for an event. 
<p>
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.
<p>
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>.
<p>
References <a class="el" href="modules_8h-source.html#l00023">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="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 {
<a name="l00148"></a>00148         fdlist.clear();
<a name="l00149"></a>00149 <span class="preprocessor">#ifdef USE_SELECT</span>
<a name="l00150"></a>00150 <span class="preprocessor"></span>        FD_ZERO(&amp;wfdset);
<a name="l00151"></a>00151         FD_ZERO(&amp;rfdset);
<a name="l00152"></a>00152         timeval tval;
<a name="l00153"></a>00153         <span class="keywordtype">int</span> sresult;
<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++)
<a name="l00155"></a>00155         {
<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>)
<a name="l00157"></a>00157                 {
<a name="l00158"></a>00158                         FD_SET (<a class="code" href="classSocketEngine.html#fds">fds</a>[a], &amp;rfdset);
<a name="l00159"></a>00159                 }
<a name="l00160"></a>00160                 <span class="keywordflow">else</span>
<a name="l00161"></a>00161                 {
<a name="l00162"></a>00162                         FD_SET (<a class="code" href="classSocketEngine.html#fds">fds</a>[a], &amp;wfdset);
<a name="l00163"></a>00163                 }
<a name="l00164"></a>00164                 
<a name="l00165"></a>00165         }
<a name="l00166"></a>00166         tval.tv_sec = 0;
<a name="l00167"></a>00167         tval.tv_usec = 100L;
<a name="l00168"></a>00168         sresult = select(FD_SETSIZE, &amp;rfdset, &amp;wfdset, NULL, &amp;tval);
<a name="l00169"></a>00169         <span class="keywordflow">if</span> (sresult &gt; 0)
<a name="l00170"></a>00170         {
<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++)
<a name="l00172"></a>00172                 {
<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)))
<a name="l00174"></a>00174                         {
<a name="l00175"></a>00175                                 log(<a class="code" href="modules_8h.html#DEBUG">DEBUG</a>,<span class="stringliteral">"...Adding active %d"</span>,<a class="code" href="classSocketEngine.html#fds">fds</a>[a]);
<a name="l00176"></a>00176                                 fdlist.push_back(<a class="code" href="classSocketEngine.html#fds">fds</a>[a]);
<a name="l00177"></a>00177                         }
<a name="l00178"></a>00178                 }
<a name="l00179"></a>00179         }
<a name="l00180"></a>00180 <span class="preprocessor">#endif</span>
<a name="l00181"></a>00181 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_KQUEUE</span>
<a name="l00182"></a>00182 <span class="preprocessor"></span>        <a class="code" href="classSocketEngine.html#ts">ts</a>.tv_nsec = 10000L;
<a name="l00183"></a>00183         <a class="code" href="classSocketEngine.html#ts">ts</a>.tv_sec = 0;
<a name="l00184"></a>00184         <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>);
<a name="l00185"></a>00185         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; i; j++)
<a name="l00186"></a>00186                 fdlist.push_back(<a class="code" href="classSocketEngine.html#ke_5Flist_5B_36_35_35_33_35_5D">ke_list</a>[j].ident);
<a name="l00187"></a>00187 <span class="preprocessor">#endif</span>
<a name="l00188"></a>00188 <span class="preprocessor"></span><span class="preprocessor">#ifdef USE_EPOLL</span>
<a name="l00189"></a>00189 <span class="preprocessor"></span>        <span class="keywordtype">int</span> i = epoll_wait(<a class="code" href="classSocketEngine.html#EngineHandle">EngineHandle</a>, events, 65535, 100);
<a name="l00190"></a>00190         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; i; j++)
<a name="l00191"></a>00191                 fdlist.push_back(events[j].data.fd);
<a name="l00192"></a>00192 <span class="preprocessor">#endif</span>
<a name="l00193"></a>00193 <span class="preprocessor"></span>        <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00194"></a>00194 }
</pre></div>
<p>
    </td>
  </tr>
</table>
<hr><h2>Member Data Documentation</h2>
<a class="anchor" name="EngineHandle"></a><!-- doxytag: member="SocketEngine::EngineHandle" ref="EngineHandle" args="" --><p>
<table class="mdTable" cellpadding="2" cellspacing="0">
  <tr>
    <td class="mdRow">
      <table cellpadding="0" cellspacing="0" border="0">
        <tr>
          <td class="md" nowrap valign="top">int <a class="el" href="classSocketEngine.html#EngineHandle">SocketEngine::EngineHandle</a><code> [private]</code>          </td>
        </tr>
      </table>
    </td>
  </tr>
</table>
<table cellspacing="5" cellpadding="0" border="0">
  <tr>
    <td>
      &nbsp;
    </td>
    <td>

<p>

<p>
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>.
<p>
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>
  </tr>
</table>
<a class="anchor" name="fds"></a><!-- doxytag: member="SocketEngine::fds" ref="fds" args="" --><p>
<table class="mdTable" cellpadding="2" cellspacing="0">
  <tr>
    <td class="mdRow">
      <table cellpadding="0" cellspacing="0" border="0">
        <tr>
          <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>
        </tr>
      </table>
    </td>
  </tr>
</table>
<table cellspacing="5" cellpadding="0" border="0">
  <tr>
    <td>
      &nbsp;
    </td>
    <td>

<p>

<p>
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>.
<p>
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>
  </tr>
</table>
<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>
<table class="mdTable" cellpadding="2" cellspacing="0">
  <tr>
    <td class="mdRow">
      <table cellpadding="0" cellspacing="0" border="0">
        <tr>
          <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>
        </tr>
      </table>
    </td>
  </tr>
</table>
<table cellspacing="5" cellpadding="0" border="0">
  <tr>
    <td>
      &nbsp;
    </td>
    <td>

<p>

<p>
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>.
<p>
Referenced by <a class="el" href="socketengine_8cpp-source.html#l00146">Wait()</a>.    </td>
  </tr>
</table>
<a class="anchor" name="ts"></a><!-- doxytag: member="SocketEngine::ts" ref="ts" args="" --><p>
<table class="mdTable" cellpadding="2" cellspacing="0">
  <tr>
    <td class="mdRow">
      <table cellpadding="0" cellspacing="0" border="0">
        <tr>
          <td class="md" nowrap valign="top">struct timespec <a class="el" href="classSocketEngine.html#ts">SocketEngine::ts</a><code> [private]</code>          </td>
        </tr>
      </table>
    </td>
  </tr>
</table>
<table cellspacing="5" cellpadding="0" border="0">
  <tr>
    <td>
      &nbsp;
    </td>
    <td>

<p>

<p>
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>.
<p>
Referenced by <a class="el" href="socketengine_8cpp-source.html#l00146">Wait()</a>.    </td>
  </tr>
</table>
<hr>The documentation for this class was generated from the following files:<ul>
<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>
<hr size="1"><address style="align: right;"><small>Generated on Mon Dec 12 18:31:03 2005 for InspIRCd by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.4-20050815 </small></address>
</body>
</html>