aboutsummaryrefslogtreecommitdiff
path: root/malloc
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2016-05-13 16:55:01 +0200
committerFlorian Weimer <fweimer@redhat.com>2016-05-13 20:43:14 +0200
commite2cd73a2ccabe8acae28719a0c3c1c03f2b5f9fb (patch)
treeaef0595da097dc402f27a64dde84f3713f9ee510 /malloc
parentfdbdbc83a53cfee6edff9f737e188a56925f1db1 (diff)
downloadglibc-e2cd73a2ccabe8acae28719a0c3c1c03f2b5f9fb.zip
glibc-e2cd73a2ccabe8acae28719a0c3c1c03f2b5f9fb.tar.gz
glibc-e2cd73a2ccabe8acae28719a0c3c1c03f2b5f9fb.tar.bz2
tst-mallocfork2: Fix race condition, use fewer resources
The first SIGUSR1 signal could arrive when sigusr1_sender_pid was still 0. As a result, kill would send SIGSTOP to the entire process group. This would cause the test to hang before printing any output. This commit also adds a sched_yield to the signal source, so that it does not flood the parent process with signals it has never a chance to handle. Even with these changes, tst-mallocfork2 still fails reliably after the fix in commit commit 56290d6e762c1194547e73ff0b948cd79d3a1e03 (Increase fork signal safety for single-threaded processes) is backed out.
Diffstat (limited to 'malloc')
-rw-r--r--malloc/tst-mallocfork2.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/malloc/tst-mallocfork2.c b/malloc/tst-mallocfork2.c
index a9e3e94..4939938 100644
--- a/malloc/tst-mallocfork2.c
+++ b/malloc/tst-mallocfork2.c
@@ -25,6 +25,7 @@
still make fork unsafe, even in single-threaded processes. */
#include <errno.h>
+#include <sched.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
@@ -70,7 +71,9 @@ sigusr1_handler (int signo)
signals from the subprocess. */
if (sigusr1_received)
return;
- if (kill (sigusr1_sender_pid, SIGSTOP) != 0)
+ /* sigusr1_sender_pid might not be initialized in the parent when
+ the first SIGUSR1 signal arrives. */
+ if (sigusr1_sender_pid > 0 && kill (sigusr1_sender_pid, SIGSTOP) != 0)
{
write_message ("error: kill (SIGSTOP)\n");
abort ();
@@ -123,6 +126,9 @@ signal_sender (int signo, bool sleep)
}
if (sleep)
usleep (1 * 1000 * 1000);
+ else
+ /* Reduce the rate at which we send signals. */
+ sched_yield ();
}
}