aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--malloc/tst-mallocfork2.c8
2 files changed, 14 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 5329849..a191caf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2016-05-13 Florian Weimer <fweimer@redhat.com>
+
+ Fix race condition in tst-mallocfork2, use fewer resources.
+ * malloc/tst-mallocfork2.c (sigusr1_handler): Do not send SIGSTOP
+ to current process group.
+ (signal_sender): Yield in the non-sleeping case.
+
2016-05-13 Joseph Myers <joseph@codesourcery.com>
* conform/data/stdlib.h-data (a64l): Do not expect for [XPG3].
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 ();
}
}