📄 a00192.html
字号:
<a name="l00225"></a>00225 <span class="comment">/* Call the generator function to generate the data in the</span><a name="l00226"></a>00226 <span class="comment"> uip_appdata buffer. */</span><a name="l00227"></a>00227 s->sendlen = generate(arg);<a name="l00228"></a>00228 s->sendptr = <a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;<a name="l00229"></a>00229 <a name="l00230"></a>00230 s->state = STATE_NONE; <a name="l00231"></a>00231 <span class="keywordflow">do</span> {<a name="l00232"></a>00232 <span class="comment">/* Call the generator function again if we are called to perform a</span><a name="l00233"></a>00233 <span class="comment"> retransmission. */</span><a name="l00234"></a>00234 <span class="keywordflow">if</span>(<a class="code" href="a00147.html#ga8933ad15a2e2947dae4a5cff50e6007">uip_rexmit</a>()) {<a name="l00235"></a>00235 generate(arg);<a name="l00236"></a>00236 }<a name="l00237"></a>00237 <span class="comment">/* Wait until all data is sent and acknowledged. */</span><a name="l00238"></a>00238 <a class="code" href="a00142.html#g99e43010ec61327164466aa2d902de45">PT_WAIT_UNTIL</a>(&s->psockpt, data_acked(s) & send_data(s));<a name="l00239"></a>00239 } <span class="keywordflow">while</span>(s->sendlen > 0);<a name="l00240"></a>00240 <a name="l00241"></a>00241 s->state = STATE_NONE;<a name="l00242"></a>00242 <a name="l00243"></a>00243 <a class="code" href="a00142.html#g7b04a0035bef29d905496c23bae066d2">PT_END</a>(&s->psockpt);<a name="l00244"></a>00244 }<a name="l00245"></a>00245 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00246"></a>00246 <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a><a name="l00247"></a><a class="code" href="a00158.html#g3178402dd725776415bf9745e7bf92ba">00247</a> <a class="code" href="a00158.html#g3178402dd725776415bf9745e7bf92ba">psock_datalen</a>(<span class="keyword">struct</span> <a class="code" href="a00082.html">psock</a> *<a class="code" href="a00082.html">psock</a>)<a name="l00248"></a>00248 {<a name="l00249"></a>00249 <span class="keywordflow">return</span> psock-><a class="code" href="a00082.html#a6bfaf327ce839ba70accd71014398d0">bufsize</a> - psock-><a class="code" href="a00082.html#d6bd03239291629676e4c0286ebb650f">buf</a>.<a class="code" href="a00083.html#20fae11b540a561c622a0d74cb4b9f97">left</a>;<a name="l00250"></a>00250 }<a name="l00251"></a>00251 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00252"></a>00252 <span class="keywordtype">char</span><a name="l00253"></a><a class="code" href="a00158.html#g3b19f65e48079d8105be2a99b5b4b2ae">00253</a> <a class="code" href="a00158.html#g3b19f65e48079d8105be2a99b5b4b2ae">psock_newdata</a>(<span class="keyword">struct</span> <a class="code" href="a00082.html">psock</a> *s)<a name="l00254"></a>00254 {<a name="l00255"></a>00255 <span class="keywordflow">if</span>(s-><a class="code" href="a00082.html#a408ca8630154ebd039f37a828399f7b">readlen</a> > 0) {<a name="l00256"></a>00256 <span class="comment">/* There is data in the uip_appdata buffer that has not yet been</span><a name="l00257"></a>00257 <span class="comment"> read with the PSOCK_READ functions. */</span><a name="l00258"></a>00258 <span class="keywordflow">return</span> 1;<a name="l00259"></a>00259 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(s-><a class="code" href="a00082.html#fda184638130452f3570966acc5b97f9">state</a> == STATE_READ) {<a name="l00260"></a>00260 <span class="comment">/* All data in uip_appdata buffer already consumed. */</span><a name="l00261"></a>00261 s-><a class="code" href="a00082.html#fda184638130452f3570966acc5b97f9">state</a> = STATE_BLOCKED_NEWDATA;<a name="l00262"></a>00262 <span class="keywordflow">return</span> 0;<a name="l00263"></a>00263 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="a00147.html#g26a14b8dae3f861830af9e7cf1e03725">uip_newdata</a>()) {<a name="l00264"></a>00264 <span class="comment">/* There is new data that has not been consumed. */</span><a name="l00265"></a>00265 <span class="keywordflow">return</span> 1;<a name="l00266"></a>00266 } <span class="keywordflow">else</span> {<a name="l00267"></a>00267 <span class="comment">/* There is no new data. */</span><a name="l00268"></a>00268 <span class="keywordflow">return</span> 0;<a name="l00269"></a>00269 }<a name="l00270"></a>00270 }<a name="l00271"></a>00271 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00272"></a>00272 <a class="code" href="a00142.html#g3d4c8bd4aada659eb34f5d2ffd3e7901">PT_THREAD</a>(psock_readto(<span class="keyword">register</span> <span class="keyword">struct</span> <a class="code" href="a00082.html">psock</a> *<a class="code" href="a00082.html">psock</a>, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c))<a name="l00273"></a>00273 {<a name="l00274"></a>00274 <a class="code" href="a00142.html#g2ffbb9e554e08a343ae2f9de4bedfdfc">PT_BEGIN</a>(&psock->psockpt);<a name="l00275"></a>00275 <a name="l00276"></a>00276 buf_setup(&psock->buf, psock->bufptr, psock->bufsize);<a name="l00277"></a>00277 <a name="l00278"></a>00278 <span class="comment">/* XXX: Should add buf_checkmarker() before do{} loop, if</span><a name="l00279"></a>00279 <span class="comment"> incoming data has been handled while waiting for a write. */</span><a name="l00280"></a>00280 <a name="l00281"></a>00281 <span class="keywordflow">do</span> {<a name="l00282"></a>00282 <span class="keywordflow">if</span>(psock->readlen == 0) {<a name="l00283"></a>00283 <a class="code" href="a00142.html#g99e43010ec61327164466aa2d902de45">PT_WAIT_UNTIL</a>(&psock->psockpt, <a class="code" href="a00158.html#g3b19f65e48079d8105be2a99b5b4b2ae">psock_newdata</a>(psock));<a name="l00284"></a>00284 psock->state = STATE_READ;<a name="l00285"></a>00285 psock->readptr = (<a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;<a name="l00286"></a>00286 psock->readlen = <a class="code" href="a00147.html#g1a1bc437c09ddef238abab41d77c3177">uip_datalen</a>();<a name="l00287"></a>00287 }<a name="l00288"></a>00288 } <span class="keywordflow">while</span>((buf_bufto(&psock->buf, c,<a name="l00289"></a>00289 &psock->readptr,<a name="l00290"></a>00290 &psock->readlen) & BUF_FOUND) == 0);<a name="l00291"></a>00291 <a name="l00292"></a>00292 <span class="keywordflow">if</span>(<a class="code" href="a00158.html#g3178402dd725776415bf9745e7bf92ba">psock_datalen</a>(psock) == 0) {<a name="l00293"></a>00293 psock->state = STATE_NONE;<a name="l00294"></a>00294 <a class="code" href="a00142.html#gcd3ac045f0a4ae63412e3b3d8780e8ab">PT_RESTART</a>(&psock->psockpt);<a name="l00295"></a>00295 }<a name="l00296"></a>00296 <a class="code" href="a00142.html#g7b04a0035bef29d905496c23bae066d2">PT_END</a>(&psock->psockpt);<a name="l00297"></a>00297 }<a name="l00298"></a>00298 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00299"></a>00299 <a class="code" href="a00142.html#g3d4c8bd4aada659eb34f5d2ffd3e7901">PT_THREAD</a>(psock_readbuf(<span class="keyword">register</span> <span class="keyword">struct</span> psock *psock))<a name="l00300"></a>00300 {<a name="l00301"></a>00301 <a class="code" href="a00142.html#g2ffbb9e554e08a343ae2f9de4bedfdfc">PT_BEGIN</a>(&psock->psockpt);<a name="l00302"></a>00302 <a name="l00303"></a>00303 buf_setup(&psock->buf, psock->bufptr, psock->bufsize);<a name="l00304"></a>00304 <a name="l00305"></a>00305 <span class="comment">/* XXX: Should add buf_checkmarker() before do{} loop, if</span><a name="l00306"></a>00306 <span class="comment"> incoming data has been handled while waiting for a write. */</span><a name="l00307"></a>00307 <a name="l00308"></a>00308 <span class="keywordflow">do</span> {<a name="l00309"></a>00309 <span class="keywordflow">if</span>(psock->readlen == 0) {<a name="l00310"></a>00310 <a class="code" href="a00142.html#g99e43010ec61327164466aa2d902de45">PT_WAIT_UNTIL</a>(&psock->psockpt, <a class="code" href="a00158.html#g3b19f65e48079d8105be2a99b5b4b2ae">psock_newdata</a>(psock));<a name="l00311"></a>00311 printf(<span class="stringliteral">"Waited for newdata\n"</span>);<a name="l00312"></a>00312 psock->state = STATE_READ;<a name="l00313"></a>00313 psock->readptr = (<a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;<a name="l00314"></a>00314 psock->readlen = <a class="code" href="a00147.html#g1a1bc437c09ddef238abab41d77c3177">uip_datalen</a>();<a name="l00315"></a>00315 }<a name="l00316"></a>00316 } <span class="keywordflow">while</span>(buf_bufdata(&psock->buf, psock->bufsize,<a name="l00317"></a>00317 &psock->readptr,<a name="l00318"></a>00318 &psock->readlen) != BUF_FULL);<a name="l00319"></a>00319 <a name="l00320"></a>00320 <span class="keywordflow">if</span>(<a class="code" href="a00158.html#g3178402dd725776415bf9745e7bf92ba">psock_datalen</a>(psock) == 0) {<a name="l00321"></a>00321 psock->state = STATE_NONE;<a name="l00322"></a>00322 <a class="code" href="a00142.html#gcd3ac045f0a4ae63412e3b3d8780e8ab">PT_RESTART</a>(&psock->psockpt);<a name="l00323"></a>00323 }<a name="l00324"></a>00324 <a class="code" href="a00142.html#g7b04a0035bef29d905496c23bae066d2">PT_END</a>(&psock->psockpt);<a name="l00325"></a>00325 }<a name="l00326"></a>00326 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00327"></a>00327 <span class="keywordtype">void</span><a name="l00328"></a>00328 psock_init(<span class="keyword">register</span> <span class="keyword">struct</span> psock *psock, <span class="keywordtype">char</span> *buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> buffersize)<a name="l00329"></a>00329 {<a name="l00330"></a>00330 psock->state = STATE_NONE;<a name="l00331"></a>00331 psock->readlen = 0;<a name="l00332"></a>00332 psock->bufptr = buffer;<a name="l00333"></a>00333 psock->bufsize = buffersize;<a name="l00334"></a>00334 buf_setup(&psock->buf, buffer, buffersize);<a name="l00335"></a>00335 <a class="code" href="a00142.html#ge6bae7dc0225468c8a5ac269df549892">PT_INIT</a>(&psock->pt);<a name="l00336"></a>00336 <a class="code" href="a00142.html#ge6bae7dc0225468c8a5ac269df549892">PT_INIT</a>(&psock->psockpt);<a name="l00337"></a>00337 }<a name="l00338"></a>00338 <span class="comment">/*---------------------------------------------------------------------------*/</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -