From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20586 invoked by alias); 10 Sep 2002 00:50:59 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 20574 invoked from network); 10 Sep 2002 00:50:58 -0000 Received: from unknown (HELO localhost.redhat.com) (66.30.197.194) by sources.redhat.com with SMTP; 10 Sep 2002 00:50:58 -0000 Received: by localhost.redhat.com (Postfix, from userid 469) id 24B8C106CC; Mon, 9 Sep 2002 20:49:07 -0400 (EDT) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15741.16771.968097.797722@localhost.redhat.com> Date: Mon, 09 Sep 2002 17:50:00 -0000 To: law@redhat.com Cc: gdb-patches@sources.redhat.com Subject: Re: fix interrupt.exp for hpux11 In-Reply-To: <200209062059.g86Kxgc10659@porcupine.slc.redhat.com> References: <200209062059.g86Kxgc10659@porcupine.slc.redhat.com> X-SW-Source: 2002-09/txt/msg00137.txt.bz2 Jeff Law writes: > > This is a repost of a patch I submitted last year, but which was > never approved. It's incorrect to use TT_PROC_CONTINUE in this > context due to its inability to pass along (or clear pending) signals. > > This fixes interrupt.exp for hpux11. > > > * infttrace.c (child_resume): Simplify and rework to avoid > TT_PROC_CONTINUE. I don't see any harm in this. The file is only used for hpux11. There are no current maintainers, and you were the previous maintainer, so, sure, go ahead. Elena > > Index: infttrace.c > =================================================================== > RCS file: /cvs/src/src/gdb/infttrace.c,v > retrieving revision 1.19 > diff -c -3 -p -r1.19 infttrace.c > *** infttrace.c 21 Jan 2002 01:27:01 -0000 1.19 > --- infttrace.c 6 Sep 2002 20:51:47 -0000 > *************** child_resume (ptid_t ptid, int step, enu > *** 4539,4636 **** > > 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 ()) > ! { > ! 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); > #endif > > ! 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); > ! } > } > - > 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"); > ! } > #endif > > ! call_ttrace (TT_LWP_CONTINUE, > ! tid, > ! TT_NIL, > ! TT_NIL, > ! TT_NIL); > > ! /* 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); > ! } > } > } > > --- 4539,4579 ---- > > else > { > ! /* 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) > ! { > #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); > #endif > > ! threads_continue_one_with_signal (tid, signal); > > ! /* 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); > } > } > > >