From: Elena Zannoni Date: Sun, 15 Sep 2002 19:09:05 +0000 (+0000) Subject: 2002-09-15 Elena Zannoni X-Git-Tag: gdb_5_3-2002-12-12-release~167 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e9879a9ee82aef0e3732b0fcc8aba16cceb59699;p=thirdparty%2Fbinutils-gdb.git 2002-09-15 Elena Zannoni From Jeff Law * infttrace.c (child_resume): Simplify and rework to avoid TT_PROC_CONTINUE. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 88e306aba46..77c6a672579 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2002-09-15 Elena Zannoni + + From Jeff Law + * infttrace.c (child_resume): Simplify and rework to avoid + TT_PROC_CONTINUE. + 2002-09-14 Elena Zannoni From: Emmanuel Thome' diff --git a/gdb/infttrace.c b/gdb/infttrace.c index 7433b7c7292..a1a789c59a1 100644 --- a/gdb/infttrace.c +++ b/gdb/infttrace.c @@ -4539,98 +4539,41 @@ child_resume (ptid_t ptid, int step, enum target_signal signal) else { - /* TT_LWP_CONTINUE can pass signals to threads, - * TT_PROC_CONTINUE can't. So if there are any - * signals to pass, we have to use the (slower) - * loop over the stopped threads. - * - * Equally, if we have to not continue some threads, - * due to saved events, we have to use the loop. - */ - if ((signal != 0) || saved_signals_exist ()) + /* TT_LWP_CONTINUE can pass signals to threads, TT_PROC_CONTINUE can't. + Therefore, we really can't use TT_PROC_CONTINUE here. + + Consider a process which stopped due to signal which gdb decides + to handle and not pass on to the inferior. In that case we must + clear the pending signal by restarting the inferior using + TT_LWP_CONTINUE and pass zero as the signal number. Else the + pending signal will be passed to the inferior. interrupt.exp + in the testsuite does this precise thing and fails due to the + unwanted signal delivery to the inferior. */ + if (resume_all_threads) { - if (resume_all_threads) - { - #ifdef THREAD_DEBUG - if (debug_on) - printf ("Doing a continue by loop of all threads\n"); -#endif - - threads_continue_all_with_signals (tid, signal); - - clear_all_handled (); - clear_all_stepping_mode (); - } - - else - { -#ifdef THREAD_DEBUG - printf ("Doing a continue w/signal of just thread %d\n", tid); + if (debug_on) + printf ("Doing a continue by loop of all threads\n"); #endif - threads_continue_one_with_signal (tid, signal); + threads_continue_all_with_signals (tid, signal); - /* Clear the "handled" state of this thread, because - * we'll soon get a new event for it. Other events - * can stay as they were. - */ - clear_handled (tid); - clear_stepping_mode (tid); - } + clear_all_handled (); + clear_all_stepping_mode (); } - else { - /* No signals to send. - */ - if (resume_all_threads) - { -#ifdef THREAD_DEBUG - if (debug_on) - printf ("Doing a continue by process of process %d\n", tid); -#endif - - if (more_events_left > 0) - { - warning ("Losing buffered events on continue."); - more_events_left = 0; - } - - call_ttrace (TT_PROC_CONTINUE, - tid, - TT_NIL, - TT_NIL, - TT_NIL); - - clear_all_handled (); - clear_all_stepping_mode (); - } - - else - { #ifdef THREAD_DEBUG - if (debug_on) - { - printf ("Doing a continue of just thread %d\n", tid); - if (is_terminated (tid)) - printf ("Why are we continuing a dead thread? (5)\n"); - } + printf ("Doing a continue w/signal of just thread %d\n", tid); #endif - call_ttrace (TT_LWP_CONTINUE, - tid, - TT_NIL, - TT_NIL, - TT_NIL); + threads_continue_one_with_signal (tid, signal); - /* Clear the "handled" state of this thread, because - * we'll soon get a new event for it. Other events - * can stay as they were. - */ - clear_handled (tid); - clear_stepping_mode (tid); - } + /* Clear the "handled" state of this thread, because we + will soon get a new event for it. Other events can + stay as they were. */ + clear_handled (tid); + clear_stepping_mode (tid); } }