<div dir="ltr"><div><div><div>In this case you have 2 solutions:<br></div>1) use some sync / lock mechanism in cwmp's callback as you've said<br></div>2) you can try to adapt some general solution that would work in ubus and submit a patch upstream; I think Felix would have to give an opinion here first<br><br></div><div>I can't think of any other solutions at the moment.<br></div><div></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 3, 2015 at 10:38 AM, XiaoFengMeng <span dir="ltr"><<a href="mailto:xiaofeng.meng@pfsw.com" target="_blank">xiaofeng.meng@pfsw.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div link="blue" vlink="purple" lang="EN-US">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Hi Alex,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Thanks you the suggestion.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">My situation is more complicated than what you think.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">I am using a third-part cwmp library, and a lots of callbacks are registered into the lib, which are used to get values of data models. The cwmp lib has its own
 working thread, and callback will be called in that thread, we have to use ubus to get the value from another daemon program in the callback, and the callback should return the value directly.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Meanwhile, we have our main thread, in which we need to receive ubus event and messages from the system.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">So it is impossible to have only one thread  to handle everything, we can’t modify the code  of third-part lib.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Thanks.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Alexandru Ardelean [mailto:<a href="mailto:ardeleanalex@gmail.com" target="_blank">ardeleanalex@gmail.com</a>]
<br>
<b>Sent:</b> 2015</span><span style="font-size:11.0pt;font-family:宋体" lang="ZH-CN">年</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">4</span><span style="font-size:11.0pt;font-family:宋体" lang="ZH-CN">月</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">3</span><span style="font-size:11.0pt;font-family:宋体" lang="ZH-CN">日</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">
 15:11</span></p><div><div class="h5"><br>
<b>To:</b> XiaoFengMeng<br>
<b>Cc:</b> <a href="mailto:openwrt-devel@lists.openwrt.org" target="_blank">openwrt-devel@lists.openwrt.org</a><br>
<b>Subject:</b> Re: [OpenWrt-Devel] Question about conflict between ubus_invoke and uloop_run</div></div><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u><u></u></span><p></p><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt">Yes, you have to use ubus_invoke_sync() in this case.<u></u><u></u></p>
</div>
<p class="MsoNormal">You can use ubus_invoke_async() and re-design your code using a state-machine mechanism.<u></u><u></u></p>
</div>
<p class="MsoNormal">This would simplify the need to add any locks & syncs.<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt">You should not use directly:<br>
<span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">ctx->ubus->sock.registered = true;</span><u></u><u></u></p>
</div>
<div>
<div>
<div>
<div>
<p class="MsoNormal">It could complicate things long-term.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">To conclude : I think the best idea is to use a state-machine .<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Whenever your callback function is called you call into the state machine.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Depending on the current state, you can execute actions, including changing states if needed.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">I'd say that if you do this, you can remove that separate thread.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">On Fri, Apr 3, 2015 at 9:41 AM, XiaoFengMeng <<a href="mailto:xiaofeng.meng@pfsw.com" target="_blank">xiaofeng.meng@pfsw.com</a>> wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">HI Alexandru</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Thanks so much for your reply!</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">In my case, the ubus_invoke will be called in a callback function which is in a separate thread, and
 uloop_run will be running in  main thread.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">If I have to use ubus_invoke_async, then I feel that I have to use a lock to sync the call.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">And I think you confirmed with an idea of mine:  </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">if I want to use “ubus_invoke”,  “uloop_run” can’t be used at the same time,</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">or if I use uloop_run, I have to use ubus_invoke_async instread.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Is that right?</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">But I just got a tricky way of using ubus_invoke and uloop_run at the same time.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">For the ubus context which is only used to call ubus_invoke as client, I set the registered of usock
 to true,</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">ctx->ubus->sock.registered = true;</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">actually this socket is not added to uloop in reality, I do this so that following code in ubus_complete_request
 function will not be executed.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">And thus no conflict with uloop.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">if (!registered) {</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">                uloop_init();</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">                ubus_add_uloop(ctx);</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">}</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">I experimented on this, it seems working well,</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">I like to know what’s your opinion on this?</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Thanks!</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">/Kevin</span><u></u><u></u></p>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Alexandru Ardelean [mailto:<a href="mailto:ardeleanalex@gmail.com" target="_blank">ardeleanalex@gmail.com</a>]
<br>
<b>Sent:</b> 2015</span><span style="font-size:11.0pt;font-family:宋体" lang="ZH-CN">年</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">4</span><span style="font-size:11.0pt;font-family:宋体" lang="ZH-CN">月</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">3</span><span style="font-size:11.0pt;font-family:宋体" lang="ZH-CN">日</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">
 14:20<br>
<b>To:</b> XiaoFengMeng<br>
<b>Cc:</b> <a href="mailto:openwrt-devel@lists.openwrt.org" target="_blank">openwrt-devel@lists.openwrt.org</a><br>
<b>Subject:</b> Re: [OpenWrt-Devel] Question about conflict between ubus_invoke and uloop_run</span><u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt">Hello Kevin,<u></u><u></u></p>
</div>
<p class="MsoNormal">As far as my understanding goes regarding ubus and uloop, they were not designed with threading in mind.<u></u><u></u></p>
</div>
<p class="MsoNormal">Also, as a general rule when using uloop, you wouldn't use threads, because races could occur (especially when doing ubus calls inside a thread) and the main uloop loop would terminate.<u></u><u></u></p>
<div>
<div>
<div>
<p class="MsoNormal"><br>
One general rule would be: you should not use ubus call in threads.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">You could use ubus_invoke_async() instead of ubus_invoke().<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">It is a bit more work than just using ubus_invoke() but if you want thread-like behaviour, it could replace all the threads you're using.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
So, is there a way to re-design your code without using threads and using ubus async calls ?<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
</div>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<p class="MsoNormal">On Fri, Apr 3, 2015 at 5:24 AM, XiaoFengMeng <<a href="mailto:xiaofeng.meng@pfsw.com" target="_blank">xiaofeng.meng@pfsw.com</a>> wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid windowtext 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt;border-color:-moz-use-text-color -moz-use-text-color -moz-use-text-color rgb(204,204,204)">
<div>
<div>
<p class="MsoNormal">HI !<u></u><u></u></p>
<p class="MsoNormal">I am Kevin and learning the ubus code and got something that is confusing me very much in the code.<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">My question is regarding code in  ubus_invoke -> ubus_complete_request,<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">I can see that there are lots of uloop related code in  “ubus_complete_request”<u></u><u></u></p>
<p class="MsoNormal">if (!registered) {<u></u><u></u></p>
<p class="MsoNormal">                                uloop_init();<u></u><u></u></p>
<p class="MsoNormal">                                ubus_add_uloop(ctx);<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal">….<u></u><u></u></p>
<p class="MsoNormal">while (!req->status_msg) {<u></u><u></u></p>
<p class="MsoNormal">                                bool cancelled = uloop_cancelled;<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">                                uloop_cancelled = false;<u></u><u></u></p>
<p class="MsoNormal">                                if (req_timeout) {<u></u><u></u></p>
<p class="MsoNormal">                                                timeout = time_end - get_time_msec();<u></u><u></u></p>
<p class="MsoNormal">                                                if (timeout <= 0) {<u></u><u></u></p>
<p class="MsoNormal">                                                                ubus_set_req_status(req, UBUS_STATUS_TIMEOUT);<u></u><u></u></p>
<p class="MsoNormal">                                                                break;<u></u><u></u></p>
<p class="MsoNormal">                                                }<u></u><u></u></p>
<p class="MsoNormal">                                }<u></u><u></u></p>
<p class="MsoNormal">                                ubus_poll_data(ctx, (unsigned int) timeout);<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">                                uloop_cancelled = cancelled;<u></u><u></u></p>
<p class="MsoNormal">                }<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">My question is why is uloop involved here?  uloop could be working in another thread and also listen on the same socket.<u></u><u></u></p>
<p class="MsoNormal">I idea that, before the ubus_invoke sends the request messge, it should disable the uloop for the current socket, so that code in uloop_run will not receive anything from the same
 socket.<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Because after calling ubus_add_uloop(ctx), the uloop_run could also be receiving the response data<u></u><u></u></p>
<p class="MsoNormal">And this function could cause the uloop_run to quit the while loop.<u></u><u></u></p>
<p class="MsoNormal">How should I understand the logic here?<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">And How should I do if I want to call ubus_invoke as a client and use uloop_run as a server at  the same process?<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Thanks very much!<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Best regards<u></u><u></u></p>
<p class="MsoNormal">Kevin<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
_______________________________________________<br>
openwrt-devel mailing list<br>
<a href="mailto:openwrt-devel@lists.openwrt.org" target="_blank">openwrt-devel@lists.openwrt.org</a><br>
<a href="https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel" target="_blank">https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel</a><u></u><u></u></p>
</blockquote>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div>
</div>
</div>
</div></div></div>
</div>

</blockquote></div><br></div>