[LEDE-DEV] [PATCH][ubus] cli: register event handler first, then do lookup

Alexandru Ardelean ardeleanalex at gmail.com
Wed Oct 12 04:15:49 PDT 2016


From: Alexandru Ardelean <aardelean at riverbed.com>

We seem to be getting timeout for ubus wait_for calls
every now and then.

And it's not reliably reproducible.
Looking at the code the only thing that would look like
a potetntial reason, is that between the ubus_lookup() and
ubus_register_event_handler() calls, there's a very narrow
window where the event would get sent out and we would not
get it, thus having to timeout.

It doesn't look like registering the event handler first
is a big problem for the whole wait_check_object() logic.

Signed-off-by: Alexandru Ardelean <ardeleanalex at gmail.com>
Tested-by: Zefir Kurtisi <zefir.kurtisi at neratec.com> 
---
 cli.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/cli.c b/cli.c
index c5cbfc3..080f953 100644
--- a/cli.c
+++ b/cli.c
@@ -293,17 +293,20 @@ static int ubus_cli_wait_for(struct ubus_context *ctx, int argc, char **argv)
 	uloop_init();
 	ubus_add_uloop(ctx);
 
-	ret = ubus_lookup(ctx, NULL, wait_list_cb, &data);
+	ret = ubus_register_event_handler(ctx, &data.ev, "ubus.object.add");
 	if (ret)
 		return ret;
 
 	if (!data.n_pending)
 		return ret;
 
-	ret = ubus_register_event_handler(ctx, &data.ev, "ubus.object.add");
+	ret = ubus_lookup(ctx, NULL, wait_list_cb, &data);
 	if (ret)
 		return ret;
 
+	if (!data.n_pending)
+		return ret;
+
 	uloop_timeout_set(&data.timeout, timeout * 1000);
 	uloop_run();
 	uloop_done();
-- 
2.6.6




More information about the Lede-dev mailing list