A task management system. At least this was the initial idea. Basically this it the base code for the taskrambler framework.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

641 lines
38 KiB

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Server: src/server/run.c File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body onload='searchBox.OnSelectItem(0);'>
<!-- Generated by Doxygen 1.7.3 -->
<script type="text/javascript"><!--
var searchBox = new SearchBox("searchBox", "search",false,'Search');
--></script>
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">Server&#160;<span id="projectnumber">0.0.1</span></div>
<div id="projectbrief">HTTP/REST server implementation</div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li id="searchli">
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
initNavTree('run_8c.html','');
</script>
<div id="doc-content">
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<h1>src/server/run.c File Reference</h1> </div>
</div>
<div class="contents">
<div class="textblock"><code>#include &quot;server.h&quot;</code><br/>
<code>#include &quot;logger.h&quot;</code><br/>
<code>#include &quot;utils/signalHandling.h&quot;</code><br/>
</div><div class="textblock"><div class="dynheader">
Include dependency graph for run.c:</div>
<div class="dyncontent">
<div class="center"><img src="run_8c__incl.png" border="0" usemap="#src_2server_2run_8c" alt=""/></div>
<map name="src_2server_2run_8c" id="src_2server_2run_8c">
</map>
</div>
</div>
<p><a href="run_8c_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="run_8c.html#a3f9eb08dd7565808de69e0bd29858c65">serverPoll</a> (<a class="el" href="structServer.html">Server</a>)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="run_8c.html#ac80f57676062b94ad17a46646ba15e73">serverHandleAccept</a> (<a class="el" href="structServer.html">Server</a>, unsigned int)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="run_8c.html#a57f8b8c9683e7f9fd588b441ce3bca78">serverCloseConn</a> (<a class="el" href="structServer.html">Server</a>, unsigned int)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">ssize_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="run_8c.html#ac4ce64f06fd2cb9d70953fed86a607e7">serverRead</a> (<a class="el" href="structServer.html">Server</a>, unsigned int)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">ssize_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="run_8c.html#ac275efebefdf1c64b30511daa008d3c1">serverWrite</a> (<a class="el" href="structServer.html">Server</a>, unsigned int)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="run_8c.html#a67a4d9073b80d8ae1459fb11ddd23675">serverRun</a> (<a class="el" href="structServer.html">Server</a> this)</td></tr>
</table>
<hr/><a name="_details"></a><h2>Detailed Description</h2>
<div class="textblock"><dl class="author"><dt><b>Author:</b></dt><dd>Georg Hopp</dd></dl>
<p>Copyright © 2012 Georg Hopp</p>
<p>This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p>
<p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p>
<p>You should have received a copy of the GNU General Public License along with this program. If not, see &lt;<a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>&gt;. </p>
<p>Definition in file <a class="el" href="run_8c_source.html">run.c</a>.</p>
</div><hr/><h2>Function Documentation</h2>
<a class="anchor" id="a57f8b8c9683e7f9fd588b441ce3bca78"></a><!-- doxytag: member="run.c::serverCloseConn" ref="a57f8b8c9683e7f9fd588b441ce3bca78" args="(Server, unsigned int)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void serverCloseConn </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structServer.html">Server</a>&#160;</td>
<td class="paramname">, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned&#160;</td>
<td class="paramname"><em>int</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Definition at line <a class="el" href="close__conn_8c_source.html#l00031">31</a> of file <a class="el" href="close__conn_8c_source.html">close_conn.c</a>.</p>
<div class="fragment"><pre class="fragment">{
<span class="keywordtype">int</span> fd = (this-&gt;fds)[i].fd;
<a class="code" href="structStream.html">Stream</a> st = (this-&gt;<a class="code" href="structconns.html">conns</a>[fd]).stream;
<span class="keyword">delete</span>((this-&gt;<a class="code" href="structconns.html">conns</a>)[fd].sock);
<span class="keyword">delete</span>((this-&gt;<a class="code" href="structconns.html">conns</a>)[fd].worker);
<span class="keywordflow">if</span> (NULL != st &amp;&amp; <a class="code" href="stream_2stream_8h.html#afd140730fff620c727747dbf04e76630a191f19b4a171b97e1537b688aead6e4c">STREAM_SSL</a> == st-&gt;<a class="code" href="structStream.html#ae0be31ff7a049d198e9437839e2771d9">type</a>) {
SSL_shutdown((st-&gt;<a class="code" href="structStream.html#aeb50dbcdf0720e2786546028e27e4c6c">handle</a>).ssl);
SSL_free((st-&gt;<a class="code" href="structStream.html#aeb50dbcdf0720e2786546028e27e4c6c">handle</a>).ssl);
}
<span class="keyword">delete</span>(st);
memset(&amp;(this-&gt;fds[i]), 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> pollfd));
}
</pre></div>
</div>
</div>
<a class="anchor" id="ac80f57676062b94ad17a46646ba15e73"></a><!-- doxytag: member="run.c::serverHandleAccept" ref="ac80f57676062b94ad17a46646ba15e73" args="(Server, unsigned int)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int serverHandleAccept </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structServer.html">Server</a>&#160;</td>
<td class="paramname">, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned&#160;</td>
<td class="paramname"><em>int</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Definition at line <a class="el" href="handle__accept_8c_source.html#l00036">36</a> of file <a class="el" href="handle__accept_8c_source.html">handle_accept.c</a>.</p>
<div class="fragment"><pre class="fragment">{
<span class="keywordtype">char</span> remoteAddr[16] = <span class="stringliteral">&quot;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0&quot;</span>;
<a class="code" href="structSock.html">Sock</a> acc = NULL;
<a class="code" href="structStream.html">Stream</a> st;
<span class="keywordflow">if</span> (this-&gt;nfds &gt;= this-&gt;max_fds) {
<span class="keywordflow">return</span> -1;
}
acc = <a class="code" href="socket_8h.html#a45ec8fbdb035314da3d390fdcd6dc304">socketAccept</a>((0 == i)? this-&gt;sock : this-&gt;sockSSL, &amp;remoteAddr);
<span class="keywordflow">if</span> (-1 != acc-&gt;<a class="code" href="structSock.html#a1b5945aef923a906501d7abac82449c3">handle</a>) {
<span class="keywordflow">switch</span>(i) {
<span class="keywordflow">case</span> 0:
<span class="comment">// no SSL</span>
st = <span class="keyword">new</span>(<a class="code" href="structStream.html">Stream</a>, <a class="code" href="stream_2stream_8h.html#afd140730fff620c727747dbf04e76630a3cbce5e7e6860cab7950f1d0ca92ba84">STREAM_FD</a>, acc-&gt;<a class="code" href="structSock.html#a1b5945aef923a906501d7abac82449c3">handle</a>);
<span class="keywordflow">break</span>;
<span class="keywordflow">case</span> 1:
<span class="comment">// SSL</span>
{
SSL * ssl = SSL_new(this-&gt;ctx);
SSL_set_fd(ssl, acc-&gt;<a class="code" href="structSock.html#a1b5945aef923a906501d7abac82449c3">handle</a>);
SSL_accept(ssl);
st = <span class="keyword">new</span>(<a class="code" href="structStream.html">Stream</a>, <a class="code" href="stream_2stream_8h.html#afd140730fff620c727747dbf04e76630a191f19b4a171b97e1537b688aead6e4c">STREAM_SSL</a>, ssl);
}
<span class="keywordflow">break</span>;
<span class="keywordflow">default</span>:
<span class="keywordflow">break</span>;
}
<span class="comment">// save the socket handle</span>
(this-&gt;<a class="code" href="structconns.html">conns</a>)[acc-&gt;<a class="code" href="structSock.html#a1b5945aef923a906501d7abac82449c3">handle</a>].sock = acc;
<span class="comment">// clone worker</span>
(this-&gt;conns)[acc-&gt;<a class="code" href="structSock.html#a1b5945aef923a906501d7abac82449c3">handle</a>].worker = <a class="code" href="class_2interface_2class_8h.html#a864061d3c9c7f123efb63649bb0fade7">clone</a>(this-&gt;worker);
(this-&gt;<a class="code" href="structconns.html">conns</a>)[acc-&gt;<a class="code" href="structSock.html#a1b5945aef923a906501d7abac82449c3">handle</a>].stream = st;
(this-&gt;fds)[this-&gt;nfds].<a class="code" href="structStream.html#a79b2cad70cd8f6c6e7d538f335a3dd0d">fd</a> = acc-&gt;<a class="code" href="structSock.html#a1b5945aef923a906501d7abac82449c3">handle</a>;
(this-&gt;fds)[this-&gt;nfds].events = POLLIN;
this-&gt;nfds++;
} <span class="keywordflow">else</span> {
<span class="keyword">delete</span>(acc);
<span class="keywordflow">switch</span>(errno) {
<span class="keywordflow">case</span> EAGAIN:
<a class="code" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e">loggerLog</a>(this-&gt;logger,
<a class="code" href="logger_2logger_8h.html#a63296c69f4b9bf51d6756a5d2c482d1ea30eb5eac34e7c2406c74fb78d9004f6c">LOGGER_DEBUG</a>,
<span class="stringliteral">&quot;server accept blocks&quot;</span>);
<span class="keywordflow">break</span>;
<span class="keywordflow">default</span>:
<a class="code" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e">loggerLog</a>(this-&gt;logger,
<a class="code" href="logger_2logger_8h.html#a63296c69f4b9bf51d6756a5d2c482d1ea30eb5eac34e7c2406c74fb78d9004f6c">LOGGER_DEBUG</a>,
<span class="stringliteral">&quot;server accept error&quot;</span>);
<span class="keywordflow">break</span>;
}
}
<span class="keywordflow">return</span> (acc)? acc-&gt;<a class="code" href="structSock.html#a1b5945aef923a906501d7abac82449c3">handle</a> : -1;
}
</pre></div>
<p><div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><img src="run_8c_ac80f57676062b94ad17a46646ba15e73_cgraph.png" border="0" usemap="#run_8c_ac80f57676062b94ad17a46646ba15e73_cgraph" alt=""/></div>
<map name="run_8c_ac80f57676062b94ad17a46646ba15e73_cgraph" id="run_8c_ac80f57676062b94ad17a46646ba15e73_cgraph">
<area shape="rect" id="node3" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e" title="loggerLog" alt="" coords="348,5,428,33"/><area shape="rect" id="node5" href="socket_8h.html#a45ec8fbdb035314da3d390fdcd6dc304" title="socketAccept" alt="" coords="197,30,299,58"/></map>
</div>
</p>
<p><div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><img src="run_8c_ac80f57676062b94ad17a46646ba15e73_icgraph.png" border="0" usemap="#run_8c_ac80f57676062b94ad17a46646ba15e73_icgraph" alt=""/></div>
<map name="run_8c_ac80f57676062b94ad17a46646ba15e73_icgraph" id="run_8c_ac80f57676062b94ad17a46646ba15e73_icgraph">
<area shape="rect" id="node3" href="run_8c.html#a67a4d9073b80d8ae1459fb11ddd23675" title="serverRun" alt="" coords="199,5,281,33"/><area shape="rect" id="node5" href="webgameserver_8c.html#ae66f6b31b5ad750f1fe042a706a4e3d4" title="main" alt="" coords="331,5,381,33"/></map>
</div>
</p>
</div>
</div>
<a class="anchor" id="a3f9eb08dd7565808de69e0bd29858c65"></a><!-- doxytag: member="run.c::serverPoll" ref="a3f9eb08dd7565808de69e0bd29858c65" args="(Server)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int serverPoll </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structServer.html">Server</a>&#160;</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p><p>put all closed fds to end of array in O(this-&gt;nfds)</p>
</p>
<p>Definition at line <a class="el" href="poll_8c_source.html#l00034">34</a> of file <a class="el" href="poll_8c_source.html">poll.c</a>.</p>
<div class="fragment"><pre class="fragment"> {
<span class="keywordtype">int</span> events;
<span class="keyword">struct </span>pollfd * fda = &amp;(this-&gt;fds[2]);
<span class="keyword">struct </span>pollfd * fdb = &amp;(this-&gt;fds[this-&gt;nfds-1]);
<span class="keywordflow">while</span> (fda &lt;= fdb) {
<span class="keywordflow">while</span> (0 == fdb-&gt;fd &amp;&amp; fda &lt;= fdb) {
fdb--;
this-&gt;nfds--;
}
<span class="keywordflow">while</span> (0 != fda-&gt;fd &amp;&amp; fda &lt;= fdb) fda++;
<span class="keywordflow">if</span> (fda &lt; fdb) {
memcpy(fda, fdb, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> pollfd));
fdb--;
this-&gt;nfds--;
}
}
<span class="comment">/*</span>
<span class="comment"> * wait for handles to become ready</span>
<span class="comment"> */</span>
<span class="keywordflow">if</span> (-1 == (events = poll(this-&gt;fds, this-&gt;nfds, -1))) {
<span class="keywordflow">switch</span> (errno) {
<span class="keywordflow">default</span>:
<span class="keywordflow">case</span> EBADF:
<span class="keywordflow">case</span> EINVAL:
<span class="keywordflow">case</span> ENOMEM:
<a class="code" href="signalHandling_8h.html#a960e985a396acaabb1bbed4f15668ade">doShutdown</a> = 1;
<span class="comment">// DROP THROUGH</span>
<span class="keywordflow">case</span> EINTR:
<a class="code" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e">loggerLog</a>(this-&gt;logger, <a class="code" href="logger_2logger_8h.html#a63296c69f4b9bf51d6756a5d2c482d1eaa7d55c7b377d82da77e532aa299eeeb0">LOGGER_CRIT</a>,
<span class="stringliteral">&quot;poll systemcall failed: [%s] - service terminated&quot;</span>,
strerror(errno));
}
}
<span class="keywordflow">return</span> events;
}
</pre></div>
<p><div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><img src="run_8c_a3f9eb08dd7565808de69e0bd29858c65_cgraph.png" border="0" usemap="#run_8c_a3f9eb08dd7565808de69e0bd29858c65_cgraph" alt=""/></div>
<map name="run_8c_a3f9eb08dd7565808de69e0bd29858c65_cgraph" id="run_8c_a3f9eb08dd7565808de69e0bd29858c65_cgraph">
<area shape="rect" id="node3" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e" title="loggerLog" alt="" coords="137,5,217,33"/></map>
</div>
</p>
<p><div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><img src="run_8c_a3f9eb08dd7565808de69e0bd29858c65_icgraph.png" border="0" usemap="#run_8c_a3f9eb08dd7565808de69e0bd29858c65_icgraph" alt=""/></div>
<map name="run_8c_a3f9eb08dd7565808de69e0bd29858c65_icgraph" id="run_8c_a3f9eb08dd7565808de69e0bd29858c65_icgraph">
<area shape="rect" id="node3" href="run_8c.html#a67a4d9073b80d8ae1459fb11ddd23675" title="serverRun" alt="" coords="137,5,220,33"/><area shape="rect" id="node5" href="webgameserver_8c.html#ae66f6b31b5ad750f1fe042a706a4e3d4" title="main" alt="" coords="269,5,320,33"/></map>
</div>
</p>
</div>
</div>
<a class="anchor" id="ac4ce64f06fd2cb9d70953fed86a607e7"></a><!-- doxytag: member="run.c::serverRead" ref="ac4ce64f06fd2cb9d70953fed86a607e7" args="(Server, unsigned int)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">ssize_t serverRead </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structServer.html">Server</a>&#160;</td>
<td class="paramname">, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned&#160;</td>
<td class="paramname"><em>int</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p><p>normal close: this must be mapped to -2 within the underlying read call.</p>
<dl class="todo"><dt><b><a class="el" href="todo.html#_todo000008">Todo:</a></b></dt><dd>make sure all pending writes will be done before close. </dd></dl>
</p>
<p>Definition at line <a class="el" href="server_2read_8c_source.html#l00030">30</a> of file <a class="el" href="server_2read_8c_source.html">read.c</a>.</p>
<div class="fragment"><pre class="fragment">{
<span class="keywordtype">int</span> fd = (this-&gt;fds)[i].fd;
ssize_t size;
<span class="keywordflow">if</span> (NULL == (this-&gt;<a class="code" href="structconns.html">conns</a>)[fd].worker) {
<a class="code" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e">loggerLog</a>(
this-&gt;logger,
<a class="code" href="logger_2logger_8h.html#a63296c69f4b9bf51d6756a5d2c482d1ea3a56c2c000665930df74a9ebf9047316">LOGGER_INFO</a>,
<span class="stringliteral">&quot;initialization error: NULL reader&quot;</span>);
<span class="keywordflow">return</span> -1;
}
<span class="keywordflow">switch</span> ((size = <a class="code" href="reader_8h.html#ad06d56b0fc045531cfbaf0bfc5468b83">streamReaderRead</a>(
(this-&gt;<a class="code" href="structconns.html">conns</a>)[fd].worker,
(this-&gt;<a class="code" href="structconns.html">conns</a>)[fd].stream)))
{
<span class="keywordflow">case</span> -2:
<span class="comment">// DROP-THROUGH</span>
<span class="keywordflow">case</span> -1:
<span class="comment">/*</span>
<span class="comment"> * read failure / close connection</span>
<span class="comment"> */</span>
<a class="code" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e">loggerLog</a>(this-&gt;logger, <a class="code" href="logger_2logger_8h.html#a63296c69f4b9bf51d6756a5d2c482d1ea3a56c2c000665930df74a9ebf9047316">LOGGER_INFO</a>,
<span class="stringliteral">&quot;connection[%d] closed...%s&quot;</span>,
fd,
inet_ntoa((((this-&gt;<a class="code" href="structconns.html">conns</a>)[fd].sock)-&gt;addr).sin_addr));
<a class="code" href="close__conn_8c.html#ad721e61c8676f0b4c3b8fc401e26f266">serverCloseConn</a>(<span class="keyword">this</span>, i);
<span class="keywordflow">break</span>;
<span class="keywordflow">case</span> 0:
<span class="keywordflow">break</span>;
<span class="keywordflow">default</span>:
(this-&gt;fds)[i].events |= POLLOUT;
<span class="keywordflow">break</span>;
}
<span class="keywordflow">return</span> size;
}
</pre></div>
<p><div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><img src="run_8c_ac4ce64f06fd2cb9d70953fed86a607e7_cgraph.png" border="0" usemap="#run_8c_ac4ce64f06fd2cb9d70953fed86a607e7_cgraph" alt=""/></div>
<map name="run_8c_ac4ce64f06fd2cb9d70953fed86a607e7_cgraph" id="run_8c_ac4ce64f06fd2cb9d70953fed86a607e7_cgraph">
<area shape="rect" id="node3" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e" title="loggerLog" alt="" coords="173,5,253,33"/><area shape="rect" id="node5" href="close__conn_8c.html#ad721e61c8676f0b4c3b8fc401e26f266" title="serverCloseConn" alt="" coords="151,55,276,83"/><area shape="rect" id="node7" href="reader_8h.html#ad06d56b0fc045531cfbaf0bfc5468b83" title="streamReaderRead" alt="" coords="144,106,283,134"/></map>
</div>
</p>
<p><div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><img src="run_8c_ac4ce64f06fd2cb9d70953fed86a607e7_icgraph.png" border="0" usemap="#run_8c_ac4ce64f06fd2cb9d70953fed86a607e7_icgraph" alt=""/></div>
<map name="run_8c_ac4ce64f06fd2cb9d70953fed86a607e7_icgraph" id="run_8c_ac4ce64f06fd2cb9d70953fed86a607e7_icgraph">
<area shape="rect" id="node3" href="run_8c.html#a67a4d9073b80d8ae1459fb11ddd23675" title="serverRun" alt="" coords="145,5,228,33"/><area shape="rect" id="node5" href="webgameserver_8c.html#ae66f6b31b5ad750f1fe042a706a4e3d4" title="main" alt="" coords="277,5,328,33"/></map>
</div>
</p>
</div>
</div>
<a class="anchor" id="a67a4d9073b80d8ae1459fb11ddd23675"></a><!-- doxytag: member="run.c::serverRun" ref="a67a4d9073b80d8ae1459fb11ddd23675" args="(Server this)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void serverRun </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structServer.html">Server</a>&#160;</td>
<td class="paramname"><em>this</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p><p>until error or signal</p>
<p>handle accept</p>
<p>handle accept SSL</p>
<p>handle reads</p>
<p>handle writes</p>
</p>
<p>Definition at line <a class="el" href="run_8c_source.html#l00035">35</a> of file <a class="el" href="run_8c_source.html">run.c</a>.</p>
<div class="fragment"><pre class="fragment">{
<a class="code" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e">loggerLog</a>(this-&gt;logger, <a class="code" href="logger_2logger_8h.html#a63296c69f4b9bf51d6756a5d2c482d1ea3a56c2c000665930df74a9ebf9047316">LOGGER_INFO</a>, <span class="stringliteral">&quot;service started&quot;</span>);
<span class="keywordflow">while</span> (!<a class="code" href="signalHandling_8h.html#a960e985a396acaabb1bbed4f15668ade">doShutdown</a>)
{
<span class="keywordtype">int</span> events;
<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
<span class="keywordtype">int</span> naccs = 10;
events = <a class="code" href="poll_8c.html#ab102590167bdff8b5ab2f23069cfcbd3">serverPoll</a>(<span class="keyword">this</span>);
<span class="keywordflow">if</span> (<a class="code" href="signalHandling_8h.html#a960e985a396acaabb1bbed4f15668ade">doShutdown</a> || 0 &gt;= events) <span class="keywordflow">break</span>;
<span class="keywordflow">if</span> (0 != ((this-&gt;fds)[0].revents &amp; POLLIN)) {
events--;
<span class="keywordflow">while</span>(-1 != <a class="code" href="handle__accept_8c.html#abc50e74ce8e5c91817ad8cc1ca167541">serverHandleAccept</a>(<span class="keyword">this</span>, 0) &amp;&amp; 0 &lt; naccs) {
naccs--;
}
}
<span class="keywordflow">if</span> (0 != ((this-&gt;fds)[1].revents &amp; POLLIN)) {
events--;
<span class="keywordflow">while</span>(-1 != <a class="code" href="handle__accept_8c.html#abc50e74ce8e5c91817ad8cc1ca167541">serverHandleAccept</a>(<span class="keyword">this</span>, 1) &amp;&amp; 0 &lt; naccs) {
naccs--;
}
}
<span class="keywordflow">for</span> (i=2; i &lt; this-&gt;nfds; i++) {
<span class="keywordtype">int</span> nreads = 10, nwrites = 10;
<span class="keywordflow">if</span> (0 != ((this-&gt;fds)[i].revents &amp; POLLIN) &amp;&amp; 0 &lt; nreads) {
events--;
nreads--;
<a class="code" href="server_2read_8c.html#a97cbf012583a54dfd87f131233a18b0a">serverRead</a>(<span class="keyword">this</span>, i);
}
<span class="keywordflow">if</span> (0 != ((this-&gt;fds)[i].revents &amp; POLLOUT) &amp;&amp; 0 &lt; nwrites) {
events--;
nwrites--;
<a class="code" href="run_8c.html#ac275efebefdf1c64b30511daa008d3c1">serverWrite</a>(<span class="keyword">this</span>, i);
}
<span class="keywordflow">if</span> (0 &gt; events)
<span class="keywordflow">break</span>; <span class="comment">// no more events to handle</span>
}
}
}
</pre></div>
<p><div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><img src="run_8c_a67a4d9073b80d8ae1459fb11ddd23675_cgraph.png" border="0" usemap="#run_8c_a67a4d9073b80d8ae1459fb11ddd23675_cgraph" alt=""/></div>
<map name="run_8c_a67a4d9073b80d8ae1459fb11ddd23675_cgraph" id="run_8c_a67a4d9073b80d8ae1459fb11ddd23675_cgraph">
<area shape="rect" id="node3" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e" title="loggerLog" alt="" coords="519,75,599,103"/><area shape="rect" id="node5" href="handle__accept_8c.html#abc50e74ce8e5c91817ad8cc1ca167541" title="serverHandleAccept" alt="" coords="140,50,281,78"/><area shape="rect" id="node11" href="poll_8c.html#ab102590167bdff8b5ab2f23069cfcbd3" title="serverPoll" alt="" coords="171,101,251,129"/><area shape="rect" id="node14" href="server_2read_8c.html#a97cbf012583a54dfd87f131233a18b0a" title="serverRead" alt="" coords="165,177,256,205"/><area shape="rect" id="node21" href="run_8c.html#ac275efebefdf1c64b30511daa008d3c1" title="serverWrite" alt="" coords="167,278,255,306"/><area shape="rect" id="node8" href="socket_8h.html#a45ec8fbdb035314da3d390fdcd6dc304" title="socketAccept" alt="" coords="349,50,451,78"/><area shape="rect" id="node17" href="close__conn_8c.html#ad721e61c8676f0b4c3b8fc401e26f266" title="serverCloseConn" alt="" coords="337,253,463,281"/><area shape="rect" id="node19" href="reader_8h.html#ad06d56b0fc045531cfbaf0bfc5468b83" title="streamReaderRead" alt="" coords="331,202,469,230"/><area shape="rect" id="node25" href="stream_2interface_2writer_8h.html#aabe113691016adfe02c4977daee560a0" title="streamWriterWrite" alt="" coords="336,354,464,382"/></map>
</div>
</p>
<p><div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><img src="run_8c_a67a4d9073b80d8ae1459fb11ddd23675_icgraph.png" border="0" usemap="#run_8c_a67a4d9073b80d8ae1459fb11ddd23675_icgraph" alt=""/></div>
<map name="run_8c_a67a4d9073b80d8ae1459fb11ddd23675_icgraph" id="run_8c_a67a4d9073b80d8ae1459fb11ddd23675_icgraph">
<area shape="rect" id="node3" href="webgameserver_8c.html#ae66f6b31b5ad750f1fe042a706a4e3d4" title="main" alt="" coords="139,5,189,33"/></map>
</div>
</p>
</div>
</div>
<a class="anchor" id="ac275efebefdf1c64b30511daa008d3c1"></a><!-- doxytag: member="run.c::serverWrite" ref="ac275efebefdf1c64b30511daa008d3c1" args="(Server, unsigned int)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">ssize_t serverWrite </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structServer.html">Server</a>&#160;</td>
<td class="paramname">, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned&#160;</td>
<td class="paramname"><em>int</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Definition at line <a class="el" href="server_2write_8c_source.html#l00030">30</a> of file <a class="el" href="server_2write_8c_source.html">write.c</a>.</p>
<div class="fragment"><pre class="fragment">{
<span class="keywordtype">int</span> fd = (this-&gt;fds)[i].fd;
ssize_t remaining;
<span class="keywordflow">if</span> (NULL == (this-&gt;<a class="code" href="structconns.html">conns</a>)[fd].worker) {
<a class="code" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e">loggerLog</a>(
this-&gt;logger,
<a class="code" href="logger_2logger_8h.html#a63296c69f4b9bf51d6756a5d2c482d1ea3a56c2c000665930df74a9ebf9047316">LOGGER_INFO</a>,
<span class="stringliteral">&quot;initialization error: NULL worker&quot;</span>);
<span class="keywordflow">return</span> -1;
}
remaining = <a class="code" href="stream_2interface_2writer_8h.html#aabe113691016adfe02c4977daee560a0">streamWriterWrite</a>(
(this-&gt;<a class="code" href="structconns.html">conns</a>)[fd].worker,
(this-&gt;<a class="code" href="structconns.html">conns</a>)[fd].stream);
<span class="keywordflow">switch</span>(remaining) {
<span class="keywordflow">case</span> -1:
<a class="code" href="close__conn_8c.html#ad721e61c8676f0b4c3b8fc401e26f266">serverCloseConn</a>(<span class="keyword">this</span>, i);
<span class="keywordflow">break</span>;
<span class="keywordflow">case</span> 0:
(this-&gt;fds)[i].events &amp;= ~POLLOUT;
<span class="keywordflow">break</span>;
<span class="keywordflow">default</span>:
<span class="keywordflow">break</span>;
}
<span class="keywordflow">return</span> remaining;
}
</pre></div>
<p><div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><img src="run_8c_ac275efebefdf1c64b30511daa008d3c1_cgraph.png" border="0" usemap="#run_8c_ac275efebefdf1c64b30511daa008d3c1_cgraph" alt=""/></div>
<map name="run_8c_ac275efebefdf1c64b30511daa008d3c1_cgraph" id="run_8c_ac275efebefdf1c64b30511daa008d3c1_cgraph">
<area shape="rect" id="node3" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e" title="loggerLog" alt="" coords="168,5,248,33"/><area shape="rect" id="node5" href="close__conn_8c.html#ad721e61c8676f0b4c3b8fc401e26f266" title="serverCloseConn" alt="" coords="145,55,271,83"/><area shape="rect" id="node7" href="stream_2interface_2writer_8h.html#aabe113691016adfe02c4977daee560a0" title="streamWriterWrite" alt="" coords="144,106,272,134"/></map>
</div>
</p>
<p><div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><img src="run_8c_ac275efebefdf1c64b30511daa008d3c1_icgraph.png" border="0" usemap="#run_8c_ac275efebefdf1c64b30511daa008d3c1_icgraph" alt=""/></div>
<map name="run_8c_ac275efebefdf1c64b30511daa008d3c1_icgraph" id="run_8c_ac275efebefdf1c64b30511daa008d3c1_icgraph">
<area shape="rect" id="node3" href="run_8c.html#a67a4d9073b80d8ae1459fb11ddd23675" title="serverRun" alt="" coords="145,5,228,33"/><area shape="rect" id="node5" href="webgameserver_8c.html#ae66f6b31b5ad750f1fe042a706a4e3d4" title="main" alt="" coords="277,5,328,33"/></map>
</div>
</p>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="run_8c.html">run.c</a> </li>
<li class="footer">Generated on Wed Mar 28 2012 10:39:45 for Server by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </li>
</ul>
</div>
<!--- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Defines</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
</body>
</html>