<div dir="ltr">In ubus_reconnect, the ctx->sock.fd is created and set to non-blocking mode:<br><div><br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">fcntl(ctx->sock.fd, F_SETFL, fcntl(ctx->sock.fd, F_GETFL) | O_NONBLOCK | O_CLOEXEC);<br></blockquote><br><a href="http://git.openwrt.org/?p=project/ubus.git;a=blob;f=libubus-io.c;h=9d3ac6c33f4d926c7f5c5d2033d531fc5fc6f834;hb=259450f414d8c9ee41896e8e6d6bc57ec00e2b63#l396">http://git.openwrt.org/?p=project/ubus.git;a=blob;f=libubus-io.c;h=9d3ac6c33f4d926c7f5c5d2033d531fc5fc6f834;hb=259450f414d8c9ee41896e8e6d6bc57ec00e2b63#l396</a><br><br><br></div><div>However, further in the call stack, the socket will get added to uloop via ubus_add_uloop with the flag ULOOP_BLOCKING set.<br><br><a href="http://git.openwrt.org/?p=project/ubus.git;a=blob;f=libubus.h;h=54e7d481b0496e719f2f567b664a2619c82a3b16;hb=259450f414d8c9ee41896e8e6d6bc57ec00e2b63#l245">http://git.openwrt.org/?p=project/ubus.git;a=blob;f=libubus.h;h=54e7d481b0496e719f2f567b664a2619c82a3b16;hb=259450f414d8c9ee41896e8e6d6bc57ec00e2b63#l245</a><br><br></div><div>ie when called from ubus_complete_request on an !registered ctx->sock, the ubus_add_uloop is done:<br><br><a href="http://git.openwrt.org/?p=project/ubus.git;a=blob;f=libubus-req.c;h=bf19f3670ea5b215190dfcce125c358f616c72a4;hb=259450f414d8c9ee41896e8e6d6bc57ec00e2b63#l136">http://git.openwrt.org/?p=project/ubus.git;a=blob;f=libubus-req.c;h=bf19f3670ea5b215190dfcce125c358f616c72a4;hb=259450f414d8c9ee41896e8e6d6bc57ec00e2b63#l136</a><br><br>The uloop function assumes a socket is blocking by default and will never make a socket blocking again, it will only turn it to non-blocking if ULOOP_BLOCKING isn't set. This caused a busy loop in some daemons that had their socket set to non-blocking due to another issue, ie. poll using 0 as infinite instead of -1, for which I submitted a fix earlier.<br></div><div><br></div><div>I wonder if it wouldn't be better to have uloop set the socket flags in all cases? Currently it "assumes" the socket is blocking and if ULOOP_BLOCKING is passed, it will set it to non-blocking, but it won't do the other way round. Though that might have some impact on daemons that think the socket is non-blocking while it will be turned into blocking if this is changed. So not sure what the best way to go about this one is?!<br><br><br></div><div></div><div>Regards,<br></div><div>Karl<br></div><div><br></div></div>