X-Git-Url: http://git.jankratochvil.net/?p=debugger.git;a=blobdiff_plain;f=testsuite.c;h=76a3d09b3058eaaa648115c0ad9bba61e11ae31d;hp=4bfcd4f778cb2dd69422a1a823fd24ae8e4427cc;hb=80f57936cda3f7d4511b1926b424b769017aa35d;hpb=28077d611665834c9eef0b44b7d22eda92cc8fa1 diff --git a/testsuite.c b/testsuite.c index 4bfcd4f..76a3d09 100644 --- a/testsuite.c +++ b/testsuite.c @@ -179,14 +179,12 @@ static void child_alrm_handler (int signo) static __attribute__((__noreturn__)) void child_alrm (void) { - void (*handler_orig) (int signo); #if 0 int i; sigset_t oldset; #endif - handler_orig = signal (SIGALRM, child_alrm_handler); - assert (handler_orig == SIG_DFL); + /* Assumed already setup SIGALRM for CHILD_ALRM_HANDLER. */ #if 0 i = sigprocmask (SIG_BLOCK, NULL, &oldset); @@ -343,6 +341,7 @@ static void body_spawner (void *(*child) (void *data, void *input), void *data, pid_t inferior; struct attach_state_struct *attach_state; int i; + void (*handler_orig) (int signo); assert (input == NULL); @@ -376,7 +375,12 @@ static void body_spawner (void *(*child) (void *data, void *input), void *data, murder (inferior); /* Attach to a stopped process with already pending SIGALRM. */ + /* Setup the handler already in the parent to avoid the child race. */ + handler_orig = signal (SIGALRM, child_alrm_handler); + assert (handler_orig == SIG_DFL); inferior = (unsigned long) (*child) (data, child_alrm); + handler_orig = signal (SIGALRM, handler_orig); + assert (handler_orig == child_alrm_handler); STATE (inferior, 1 << STATE_SLEEPING); delay (); i = tkill (inferior, SIGSTOP);