Close race condition in ppoll test where SIGALRM was delivered before we actually reached ppoll
This seems to be what triggered the intermittent failure in https://buildkite.com/julialang/rr/builds/1395#018aad32-437b-4d71-ac76-a211b2c5dc18
diff --git a/src/test/ppoll.c b/src/test/ppoll.c
index 3fe055f..19af545 100644
--- a/src/test/ppoll.c
+++ b/src/test/ppoll.c
@@ -51,6 +51,15 @@
pfd.events = POLLIN;
for (i = 0; i < NUM_ITERATIONS; i++) {
int ret;
+ sigset_t before_sigset;
+ sigset_t sigalrm_blocked_sigset;
+ sigemptyset(&sigalrm_blocked_sigset);
+ sigaddset(&sigalrm_blocked_sigset, SIGALRM);
+ /* Block SIGALRM before we call our_ualarm because we don't want it
+ to go off early. */
+ ret = sigprocmask(SIG_SETMASK, &sigalrm_blocked_sigset, &before_sigset);
+ test_assert(ret == 0);
+ test_assert(!sigismember(&before_sigset, SIGALRM));
atomic_printf("iteration %d\n", i);
if (i % 2 == 0) {
@@ -60,11 +69,6 @@
return 0;
}
- sigset_t before_sigset;
- ret = sigprocmask(SIG_BLOCK, NULL, &before_sigset);
- test_assert(ret == 0);
- test_assert(!sigismember(&before_sigset, SIGALRM));
-
t.tv_sec = 1;
t.tv_nsec = 0;
@@ -82,7 +86,7 @@
/* Validate that the signal mask got reset */
sigset_t after_sigset;
- ret = sigprocmask(SIG_BLOCK, NULL, &after_sigset);
+ ret = sigprocmask(SIG_SETMASK, &before_sigset, &after_sigset);
test_assert(ret == 0);
test_assert(!sigismember(&after_sigset, SIGCHLD));
}