<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri","sans-serif";}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<ee-email-body>
<div style="width:100%">
<ee-email-cont><div class="WordSection1">
<p class="MsoPlainText">I didn’t change anything yet. I am just trying to understand what happens.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">We are monitoring our processes behavior by some routines.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">An infinite loop without sleeping is appearing into 'top' with 99-100% CPU. (dummy load, because the CPU is not really busy, this is just an infinite loop, but pointing always to something wrong happening in the application).<o:p></o:p></p>
<p class="MsoPlainText">This should not happen in programs where at some time the function should block on an epoll or a select waiting for events (even wait of 50msec get done the cpu load to 0.01%).<o:p></o:p></p>
<p class="MsoPlainText">In case the application receive thousands of events this could be the case and effectively my CPU will be loaded by requests, processing real data.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">But In my case nothing is happening on web sockets neither on the HTTP session.<o:p></o:p></p>
<p class="MsoPlainText">My Web Client just connects to <a href="http://%3cmyip%3e/">
http://<myip>/</a> get index.html, open 1 websocket get some data and it's done.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">So why the WebSocket thread is entering into an infinite loop ?<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">I am debugging my callbacks and the function lws_callback_on_writable(); is not solicited into the callback (since I have nothing to send), the callback function exit with "return 0", why the callback is immediately re-called ?<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">WebSocket call:<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><img border="0" width="555" height="207" id="Picture_x0020_1" src="cid:image002.png@01D1D589.5B7E8870"><o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">HTTP call:<o:p></o:p></p>
<p class="MsoPlainText"><img border="0" width="676" height="224" id="Picture_x0020_2" src="cid:image004.png@01D1D588.0886B710"><o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">I am seeing that I am arriving to line 306 into service.c where lws_callback_on_writable(wsi) is called. Why I have falling in this scenario?<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Thanks. <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">-----Original Message-----<br>
From: Andy Green [mailto:andy@warmcat.com] <br>
Sent: Sunday, July 03, 2016 22:18<br>
To: Shmuel Weiss; libwebsockets@ml.libwebsockets.org<br>
Subject: RE: [Libwebsockets] Repetitive LWS_CALLBACK_SERVER_WRITABLE making cpu load 99%</p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">On July 4, 2016 2:00:09 AM GMT+08:00, Shmuel Weiss <<a href="mailto:sweiss@kramerel.com"><span style="color:windowtext;text-decoration:none">sweiss@kramerel.com</span></a>> wrote:<o:p></o:p></p>
<p class="MsoPlainText">>Thread still at 99%.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">If the socket was writeable, and you ask to be called back again when it's writeable without doing anything, it's still writeable.  So you spin.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">You don't even explain what you changed in the code you don't share, aren't you expecting a bit much?<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">>My HTTP callback is called 4 times with LWS_CALLBACK_LOCK_POLL and then
<o:p></o:p></p>
<p class="MsoPlainText">>my WEBSOCKET callback once (every 200msec, corresponding to my TIMEOUT
<o:p></o:p></p>
<p class="MsoPlainText">>in  lsw_service).<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>But why the HTTP callback is called so many times? What means this
<o:p></o:p></p>
<p class="MsoPlainText">>LOCK_POLL event ?<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">It's unrelated to your problem.  The callbacks return 0 immediately and do nothing.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">But what does it mean both 'thread is 99% busy' and effectively that "poll() reaches his timeout"?  Poll sitting there and then returning due to timeout means the thread is *idle* for those 200ms.  If he just does housekeeping then returns
 to poll() idle, how can it be 'busy'? You don't mean the thread is 1% busy do you?<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Use a debugger or up the logging to debug your code and find out what it does that makes it 'busy', if that is actually what happens.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">-Andy<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">>Thanks.<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>-----Original Message-----<o:p></o:p></p>
<p class="MsoPlainText">>From: Andy Green [<a href="mailto:andy@warmcat.com"><span style="color:windowtext;text-decoration:none">mailto:andy@warmcat.com</span></a>]<o:p></o:p></p>
<p class="MsoPlainText">>Sent: Thursday, June 30, 2016 02:24<o:p></o:p></p>
<p class="MsoPlainText">>To: Shmuel Weiss; <a href="mailto:libwebsockets@ml.libwebsockets.org">
<span style="color:windowtext;text-decoration:none">libwebsockets@ml.libwebsockets.org</span></a><o:p></o:p></p>
<p class="MsoPlainText">>Subject: Re: [Libwebsockets] Repetitive LWS_CALLBACK_SERVER_WRITABLE
<o:p></o:p></p>
<p class="MsoPlainText">>making cpu load 99%<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>On Wed, 2016-06-29 at 23:17 +0000, Shmuel Weiss wrote:<o:p></o:p></p>
<p class="MsoPlainText">>>  I have to check, I am not using neither compiling the testserver.<o:p></o:p></p>
<p class="MsoPlainText">>> Tell me if the flow is as following:<o:p></o:p></p>
<p class="MsoPlainText">>> <o:p></o:p></p>
<p class="MsoPlainText">>> My Main loop is doing the following<o:p></o:p></p>
<p class="MsoPlainText">>> <o:p></o:p></p>
<p class="MsoPlainText">>> while(running)<o:p></o:p></p>
<p class="MsoPlainText">>> {<o:p></o:p></p>
<p class="MsoPlainText">>>           For all my protocol do:<o:p></o:p></p>
<p class="MsoPlainText">>>                           lws_callback_on_writable_all_protocol(context,<o:p></o:p></p>
<p class="MsoPlainText">>> protocol);<o:p></o:p></p>
<p class="MsoPlainText">>> <o:p></o:p></p>
<p class="MsoPlainText">>>           lws_service(context,timeout); ===> here it is no more waiting.<o:p></o:p></p>
<p class="MsoPlainText">>> }<o:p></o:p></p>
<p class="MsoPlainText">>> <o:p></o:p></p>
<p class="MsoPlainText">>> My LWS Callback is doing:<o:p></o:p></p>
<p class="MsoPlainText">>> <o:p></o:p></p>
<p class="MsoPlainText">>> ONREAD:<o:p></o:p></p>
<p class="MsoPlainText">>>           Read the data send and send it to the main engine for processing<o:p></o:p></p>
<p class="MsoPlainText">>> <o:p></o:p></p>
<p class="MsoPlainText">>> ONWRITE:<o:p></o:p></p>
<p class="MsoPlainText">>> If lws_partial_buffered != 1<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>It's not a problem, but lws guarantees if there is some partial
<o:p></o:p></p>
<p class="MsoPlainText">>buffered, you will not get the WRITEABLE callback again until it has
<o:p></o:p></p>
<p class="MsoPlainText">>been cleared, basically it uses up the writability internally to clear
<o:p></o:p></p>
<p class="MsoPlainText">>the buffered partial first.<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>So you only need that check if you will loop sending things in your
<o:p></o:p></p>
<p class="MsoPlainText">>WRITABLE callback.<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>>           Check if there is something to send from the main engine and send it<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>> Else<o:p></o:p></p>
<p class="MsoPlainText">>>           lws_callback_on_writable();<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>This means you will continuously get WRITEABLE callbacks...<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>> I expected to have ONWRITE called each time lws_service returns after<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>> timeout, but it never blocks (except at startup until the first<o:p></o:p></p>
<p class="MsoPlainText">>ONREAD<o:p></o:p></p>
<p class="MsoPlainText">>> happen).<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>That is not how poll() works.  If any of his fds have active events, he
<o:p></o:p></p>
<p class="MsoPlainText">>returns immediately.  If nothing has any events, he will return anyway
<o:p></o:p></p>
<p class="MsoPlainText">>after the timeout period.<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>So you are getting exactly what you asked for here I think.<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>-Andy<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">>> <o:p></o:p></p>
<p class="MsoPlainText">>> -----Original Message-----<o:p></o:p></p>
<p class="MsoPlainText">>> From: Andy Green [<a href="mailto:andy@warmcat.com"><span style="color:windowtext;text-decoration:none">mailto:andy@warmcat.com</span></a>]<o:p></o:p></p>
<p class="MsoPlainText">>> Sent: Thursday, June 30, 2016 00:11<o:p></o:p></p>
<p class="MsoPlainText">>> To: Shmuel Weiss; <a href="mailto:libwebsockets@ml.libwebsockets.org">
<span style="color:windowtext;text-decoration:none">libwebsockets@ml.libwebsockets.org</span></a><o:p></o:p></p>
<p class="MsoPlainText">>> Subject: Re: [Libwebsockets] Repetitive LWS_CALLBACK_SERVER_WRITABLE
<o:p></o:p></p>
<p class="MsoPlainText">>> making cpu load 99%<o:p></o:p></p>
<p class="MsoPlainText">>> <o:p></o:p></p>
<p class="MsoPlainText">>> On Wed, 2016-06-29 at 20:02 +0000, Shmuel Weiss wrote:<o:p></o:p></p>
<p class="MsoPlainText">>> > Hi Andy,<o:p></o:p></p>
<p class="MsoPlainText">>> >  <o:p></o:p></p>
<p class="MsoPlainText">>> > A new phenomena.<o:p></o:p></p>
<p class="MsoPlainText">>> > The  LWS main thread is quiet until I initiate the first<o:p></o:p></p>
<p class="MsoPlainText">>> connection,<o:p></o:p></p>
<p class="MsoPlainText">>> > where sending data and receiving data is OK but since this moment<o:p></o:p></p>
<p class="MsoPlainText">>> the<o:p></o:p></p>
<p class="MsoPlainText">>> > lws_service function doesn’t block until timeout and process
<o:p></o:p></p>
<p class="MsoPlainText">>> > immediately even if no data arrived.<o:p></o:p></p>
<p class="MsoPlainText">>> >  <o:p></o:p></p>
<p class="MsoPlainText">>> > What I missed ?<o:p></o:p></p>
<p class="MsoPlainText">>> <o:p></o:p></p>
<p class="MsoPlainText">>> Does the test server, without your code, act like that?<o:p></o:p></p>
<p class="MsoPlainText">>> <o:p></o:p></p>
<p class="MsoPlainText">>> -Andy<o:p></o:p></p>
<p class="MsoPlainText">>> <o:p></o:p></p>
<p class="MsoPlainText">>> > My lws callback return 0 , should I return -1 ?<o:p></o:p></p>
<p class="MsoPlainText">>> >  <o:p></o:p></p>
<p class="MsoPlainText">>> > thanks<o:p></o:p></p>
<p class="MsoPlainText">>> > This mail was sent via Mail-SeCure System.<o:p></o:p></p>
<p class="MsoPlainText">>> >  _______________________________________________<o:p></o:p></p>
<p class="MsoPlainText">>> > Libwebsockets mailing list<o:p></o:p></p>
<p class="MsoPlainText">>> > <a href="mailto:Libwebsockets@ml.libwebsockets.org">
<span style="color:windowtext;text-decoration:none">Libwebsockets@ml.libwebsockets.org</span></a><o:p></o:p></p>
<p class="MsoPlainText">>> > <a href="http://libwebsockets.org/mailman/listinfo/libwebsockets">
<span style="color:windowtext;text-decoration:none">http://libwebsockets.org/mailman/listinfo/libwebsockets</span></a><o:p></o:p></p>
<p class="MsoPlainText">>> This mail was sent via Mail-SeCure System.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
</div></ee-email-cont>
</div>
<div>This mail was sent via Mail-SeCure System.</div>
<div style="font-size:0%; height:0; width:0"><span style="font-size:0%; display: none; visibility:hidden;">--ef.1.7bf204766250f944897b32b1e0f9ea47.ef--</span></div></ee-email-body>
</body>
</html>