X-Git-Url: http://git.jankratochvil.net/?p=debugger.git;a=blobdiff_plain;f=testsuite.c;h=76a3d09b3058eaaa648115c0ad9bba61e11ae31d;hp=cb11a535fcd447a143587cf13bc87524e97f7bfc;hb=HEAD;hpb=e22c060c8eea5a383c3d934aacb183202d568f63 diff --git a/testsuite.c b/testsuite.c index cb11a53..76a3d09 100644 --- a/testsuite.c +++ b/testsuite.c @@ -65,24 +65,25 @@ static struct attach_state_struct *attach_checked (pid_t pid, int redelivered_ex attach_state_redelivered_get (attach_state)); abort (); } - if (attach_state_threads_count_get (attach_state) - == spawned_threads_count) - break; - fprintf (stderr, "FIXME: Untested threads initialization - REMOVE.\n"); /* During the inferior's initialization we may catch less threads. */ assert (attach_state_threads_count_get (attach_state) - < spawned_threads_count); + <= spawned_threads_count); + if (attach_state_threads_count_get (attach_state) + == spawned_threads_count + /* Inferior may got stopped before it could initialize. */ + || attach_state_stopped_get (attach_state) == 1) + { + /* FIXME: Why also STATE_STOPPED? */ + STATE (pid, (1 << STATE_PTRACED) | (1 << STATE_STOPPED)); + return attach_state; + } /* WARNING: Currently we never use REDELIVERED_EXPECT but we would have to probably reset it back to 0 otherwise. */ assert (redelivered_expect == 0); detach_checked (attach_state); } while (loops++ < LOOPS_MIN || time (NULL) < timeout); - assert (attach_state_threads_count_get (attach_state) == spawned_threads_count); - - /* FIXME: Why also STATE_STOPPED? */ - STATE (pid, (1 << STATE_PTRACED) | (1 << STATE_STOPPED)); - return attach_state; + abort (); } struct registry @@ -178,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); @@ -342,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); @@ -375,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);