<div dir="ltr"><div><div>Yes, you have to use ubus_invoke_sync() in this case.<br><br></div>You can use ubus_invoke_async() and re-design your code using a state-machine mechanism.<br></div>This would simplify the need to add any locks & syncs.<br><div><br></div><div>You should not use directly:<br><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">ctx->ubus->sock.registered = true;<br><br></span></div><div><div><div><div class="gmail_extra">It could complicate things long-term.<br></div><div class="gmail_extra">To conclude : I think the best idea is to use a state-machine .<br></div><div class="gmail_extra">Whenever your callback function is called you call into the state machine.<br></div><div class="gmail_extra">Depending on the current state, you can execute actions, including changing states if needed.<br></div><div class="gmail_extra">I'd say that if you do this, you can remove that separate thread.<br></div><div class="gmail_extra"><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 3, 2015 at 9:41 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:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div link="blue" vlink="purple" lang="EN-US">
<div>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">HI Alexandru<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">Thanks so much for your reply!<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">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.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">If I have to use ubus_invoke_async, then I feel that I have to use a lock to sync the call.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">And I think you confirmed with an idea of mine:  <u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">if I want to use “ubus_invoke”,  “uloop_run” can’t be used at the same time,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">or if I use uloop_run, I have to use ubus_invoke_async instread.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">Is that right?<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">But I just got a tricky way of using ubus_invoke and uloop_run at the same time.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">For the ubus context which is only used to call ubus_invoke as client, I set the registered of usock to true,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">ctx->ubus->sock.registered = true;<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">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.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">And thus no conflict with uloop.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">if (!registered) {<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">                uloop_init();<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">                ubus_add_uloop(ctx);<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif">}<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">I experimented on this, it seems working well,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">I like to know what’s your opinion on this?<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">Thanks!<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"Calibri",sans-serif;color:rgb(31,73,125)">/Kevin<u></u><u></u></span></p>
<p class="MsoNormal"><b><span style="font-size:11pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11pt;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:11pt;font-family:宋体" lang="ZH-CN">年</span><span style="font-size:11pt;font-family:"Calibri",sans-serif">4</span><span style="font-size:11pt;font-family:宋体" lang="ZH-CN">月</span><span style="font-size:11pt;font-family:"Calibri",sans-serif">3</span><span style="font-size:11pt;font-family:宋体" lang="ZH-CN">日</span><span style="font-size:11pt;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<u></u><u></u></span></p><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12pt">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:12pt"><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-width:medium medium medium 1pt;border-style:none none none solid;border-color:-moz-use-text-color -moz-use-text-color -moz-use-text-color rgb(204,204,204);padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm">
<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:12pt"><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><br></div></div></div></div></div>