libubus: process pending messages in data handler if stack depth is 0
Process pending messages before attempting to read new ones. After completing the poll, process any remaining pending messages. A previous message processing call which issued a request from within its handler may have left behind more object messages to process. Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
2099bb3ad9
commit
ef038488ed
1 changed files with 9 additions and 1 deletions
10
libubus-io.c
10
libubus-io.c
|
@ -314,12 +314,20 @@ void __hidden ubus_handle_data(struct uloop_fd *u, unsigned int events)
|
|||
struct ubus_context *ctx = container_of(u, struct ubus_context, sock);
|
||||
int recv_fd = -1;
|
||||
|
||||
while (get_next_msg(ctx, &recv_fd)) {
|
||||
while (1) {
|
||||
if (!ctx->stack_depth)
|
||||
ctx->pending_timer.cb(&ctx->pending_timer);
|
||||
|
||||
if (!get_next_msg(ctx, &recv_fd))
|
||||
break;
|
||||
ubus_process_msg(ctx, &ctx->msgbuf, recv_fd);
|
||||
if (uloop_cancelling() || ctx->cancel_poll)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!ctx->stack_depth)
|
||||
ctx->pending_timer.cb(&ctx->pending_timer);
|
||||
|
||||
if (u->eof)
|
||||
ctx->connection_lost(ctx);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue