diff options
Diffstat (limited to 'src/platform/posix/loop.c')
| -rw-r--r-- | src/platform/posix/loop.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/platform/posix/loop.c b/src/platform/posix/loop.c index 6624575..38f504d 100644 --- a/src/platform/posix/loop.c +++ b/src/platform/posix/loop.c @@ -122,15 +122,13 @@ static void run_signals(struct yasl_loop *l) } } +/* Only wakes the wait; the step runs posts and signals last. */ static void loop_wake_cb(void *ud, int fd, short revents) { - (void)revents; + (void)ud; (void)revents; char buf[128]; ssize_t n; while ((n = read(fd, buf, sizeof(buf))) > 0 || (n < 0 && errno == EINTR)) {} - struct yasl_loop *l = ud; - run_posts(l); - run_signals(l); } static bool open_wake_pipe(int p[2]) @@ -575,7 +573,12 @@ static int step(struct yasl_loop *l, int timeout_ms) if (d && d->deliver) d->deliver(d->ud); int fds = dispatch_fds(l); if (fds < 0) return fds; - return fds + fire_timers(l); + int timers = fire_timers(l); + /* Last, so a signal sees what came with it: a child's final output is + * read before its exit is handled. */ + run_posts(l); + run_signals(l); + return fds + timers; } int yasl_loop_step(yasl_loop *l, int timeout_ms) |
