diff options
Diffstat (limited to 'docs/module-doc/classSocketEngine.html')
-rw-r--r-- | docs/module-doc/classSocketEngine.html | 599 |
1 files changed, 599 insertions, 0 deletions
diff --git a/docs/module-doc/classSocketEngine.html b/docs/module-doc/classSocketEngine.html new file mode 100644 index 000000000..a72e347c6 --- /dev/null +++ b/docs/module-doc/classSocketEngine.html @@ -0,0 +1,599 @@ +<!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 Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File 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 <<a class="el" href="socketengine_8h-source.html">socketengine.h</a>></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"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#SocketEngine_28_29">SocketEngine</a> ()</td></tr> + +<tr><td class="mdescLeft"> </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"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#_7ESocketEngine_28_29">~SocketEngine</a> ()</td></tr> + +<tr><td class="mdescLeft"> </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 </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"> </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 </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"> </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 </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"> </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 </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< int > &fdlist)</td></tr> + +<tr><td class="mdescLeft"> </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> </td><td class="memItemRight" valign="bottom"><a class="el" href="classSocketEngine.html#GetName_28_29">GetName</a> ()</td></tr> + +<tr><td class="mdescLeft"> </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< int > </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 </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 </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 </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 & 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">( </td> + <td class="mdname1" valign="top" nowrap> </td> + <td class="md" valign="top"> ) </td> + <td class="md" nowrap></td> + </tr> + </table> + </td> + </tr> +</table> +<table cellspacing="5" cellpadding="0" border="0"> + <tr> + <td> + + </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">( </td> + <td class="mdname1" valign="top" nowrap> </td> + <td class="md" valign="top"> ) </td> + <td class="md" nowrap></td> + </tr> + </table> + </td> + </tr> +</table> +<table cellspacing="5" cellpadding="0" border="0"> + <tr> + <td> + + </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">( </td> + <td class="md" nowrap valign="top">int </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 </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 </td> + <td class="mdname" nowrap> <em>type</em></td> + </tr> + <tr> + <td class="md"></td> + <td class="md">) </td> + <td class="md" colspan="2"></td> + </tr> + </table> + </td> + </tr> +</table> +<table cellspacing="5" cellpadding="0" border="0"> + <tr> + <td> + + </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#l00197">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 < 0) || (fd > 65535)) +<a name="l00068"></a>00068 <span class="keywordflow">return</span> <span class="keyword">false</span>; +<a name="l00069"></a>00069 this-><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, &ev); +<a name="l00083"></a>00083 <span class="keywordflow">if</span> (i < 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(&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>, &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">( </td> + <td class="md" nowrap valign="top">int </td> + <td class="mdname1" valign="top" nowrap> <em>fd</em> </td> + <td class="md" valign="top"> ) </td> + <td class="md" nowrap></td> + </tr> + </table> + </td> + </tr> +</table> +<table cellspacing="5" cellpadding="0" border="0"> + <tr> + <td> + + </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#l00197">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 < 0) || (fd > 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<int>::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(&ke, fd, <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> ? 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>, &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] && <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, &ev); +<a name="l00136"></a>00136 <span class="keywordflow">if</span> (i < 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">( </td> + <td class="mdname1" valign="top" nowrap> </td> + <td class="md" valign="top"> ) </td> + <td class="md" nowrap></td> + </tr> + </table> + </td> + </tr> +</table> +<table cellspacing="5" cellpadding="0" border="0"> + <tr> + <td> + + </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">( </td> + <td class="md" nowrap valign="top">int </td> + <td class="mdname1" valign="top" nowrap> <em>fd</em> </td> + <td class="md" valign="top"> ) </td> + <td class="md" nowrap></td> + </tr> + </table> + </td> + </tr> +</table> +<table cellspacing="5" cellpadding="0" border="0"> + <tr> + <td> + + </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 < 0) || (fd > 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] & ~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< int > &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">( </td> + <td class="md" nowrap valign="top">std::vector< int > & </td> + <td class="mdname1" valign="top" nowrap> <em>fdlist</em> </td> + <td class="md" valign="top"> ) </td> + <td class="md" nowrap></td> + </tr> + </table> + </td> + </tr> +</table> +<table cellspacing="5" cellpadding="0" border="0"> + <tr> + <td> + + </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(&wfdset); +<a name="l00151"></a>00151 FD_ZERO(&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 < <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]] & <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], &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], &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 = 1000L; +<a name="l00168"></a>00168 sresult = select(FD_SETSIZE, &rfdset, &wfdset, NULL, &tval); +<a name="l00169"></a>00169 <span class="keywordflow">if</span> (sresult > 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 < <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], &rfdset)) || (FD_ISSET (<a class="code" href="classSocketEngine.html#fds">fds</a>[a], &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 = 1000L; +<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, &<a class="code" href="classSocketEngine.html#ke_5Flist_5B_36_35_35_33_35_5D">ke_list</a>[0], 65535, &<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 < 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, 1); +<a name="l00190"></a>00190 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < 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> + + </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<int> <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> + + </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> + + </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> + + </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 13:31:13 2005 for InspIRCd by +<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> |