net: socket service resets its restart flag
The socket service restarts whenever a new socket is registered. This is triggered via zvfs_eventfd_write(ctx.events[0].fd, 1), but the restart flag (ctx.events[0].revents) is not properly cleared, causing unintended repeated restarts and skipped socket processing. Detecting socket restart is done after the socket fd has processed its data, so the socket doesn't lose its data. Ensure the socket service clears its restart flag (ctx.events[0].revents = 0) immediately after detecting a restart event, preventing unnecessary restarts. Fixes #81813 Signed-off-by: Dominic Moffat <dom@illysky.com>
This commit is contained in:
parent
37a924be6a
commit
8519fa1627
@ -245,12 +245,7 @@ restart:
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret > 0 && ctx.events[0].revents) {
|
||||
zvfs_eventfd_read(ctx.events[0].fd, &value);
|
||||
NET_DBG("Received restart event.");
|
||||
goto restart;
|
||||
}
|
||||
|
||||
/* Process work here */
|
||||
for (i = 1; i < (count + 1); i++) {
|
||||
if (ctx.events[i].fd < 0) {
|
||||
continue;
|
||||
@ -259,10 +254,19 @@ restart:
|
||||
if (ctx.events[i].revents > 0) {
|
||||
ret = trigger_work(&ctx.events[i]);
|
||||
if (ret < 0) {
|
||||
NET_DBG("Triggering work failed (%d)", ret);
|
||||
NET_ERR("Triggering work failed (%d)", ret);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Relocate after trigger work so the work gets done before restarting */
|
||||
if (ret > 0 && ctx.events[0].revents) {
|
||||
zvfs_eventfd_read(ctx.events[0].fd, &value);
|
||||
ctx.events[0].revents = 0;
|
||||
NET_DBG("Received restart event.");
|
||||
goto restart;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user