summaryrefslogtreecommitdiff
path: root/src/platform/posix
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/posix')
-rw-r--r--src/platform/posix/loop.c13
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)