cli: register event handler first, then do lookup

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@gmail.com>
This commit is contained in:
Alexandru Ardelean 2016-05-05 14:03:30 +03:00 committed by Felix Fietkau
parent ba45b27f8c
commit 312448a5b1

7
cli.c
View file

@ -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();