From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3276 invoked by alias); 7 Mar 2004 01:06:56 -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 3269 invoked from network); 7 Mar 2004 01:06:55 -0000 Received: from unknown (HELO nevyn.them.org) (66.93.172.17) by sources.redhat.com with SMTP; 7 Mar 2004 01:06:55 -0000 Received: from drow by nevyn.them.org with local (Exim 4.30 #1 (Debian)) id 1Azmko-0004hP-PI; Sat, 06 Mar 2004 20:06:54 -0500 Date: Sun, 07 Mar 2004 01:06:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sources.redhat.com Cc: Atsushi Nemoto Subject: [patch] Fix handle_inferior_event nostop signal handling for threads Message-ID: <20040307010654.GA10796@nevyn.them.org> Mail-Followup-To: gdb-patches@sources.redhat.com, Atsushi Nemoto Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.1i X-SW-Source: 2004-03.o/txt/msg00130.txt Atsushi-san, could you verify that this patch still fixes your problem? I took a look at the #if 0 block, and that made me look at the surrounding code; I don't believe that a bit of it is necessary. If we switch "current" threads in response to this event, then all the following bits of handle_inferior_event should handle the current thread correctly. If this works for you I'll commit it to HEAD. I'm not sure if it's safe for the branch. No regressions on native i686-linux, and it fixes a quirk that the previous patch I sent you introduced (we could sometimes fail to print about a pass/print/nostop signal). -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer 2004-03-06 Daniel Jacobowitz * infrun.c (handle_inferior_event): Remove short-circuit code for events in a different thread. Index: infrun.c =================================================================== RCS file: /cvs/src/src/gdb/infrun.c,v retrieving revision 1.138 diff -u -p -r1.138 infrun.c --- infrun.c 6 Mar 2004 00:10:06 -0000 1.138 +++ infrun.c 7 Mar 2004 00:31:51 -0000 @@ -1883,61 +1883,9 @@ handle_inferior_event (struct execution_ ecs->random_signal = 1; /* See if something interesting happened to the non-current thread. If - so, then switch to that thread, and eventually give control back to - the user. - - Note that if there's any kind of pending follow (i.e., of a fork, - vfork or exec), we don't want to do this now. Rather, we'll let - the next resume handle it. */ - if (!ptid_equal (ecs->ptid, inferior_ptid) && - (pending_follow.kind == TARGET_WAITKIND_SPURIOUS)) + so, then switch to that thread. */ + if (!ptid_equal (ecs->ptid, inferior_ptid)) { - int printed = 0; - - /* If it's a random signal for a non-current thread, notify user - if he's expressed an interest. */ - if (ecs->random_signal && signal_print[stop_signal]) - { -/* ??rehrauer: I don't understand the rationale for this code. If the - inferior will stop as a result of this signal, then the act of handling - the stop ought to print a message that's couches the stoppage in user - terms, e.g., "Stopped for breakpoint/watchpoint". If the inferior - won't stop as a result of the signal -- i.e., if the signal is merely - a side-effect of something GDB's doing "under the covers" for the - user, such as stepping threads over a breakpoint they shouldn't stop - for -- then the message seems to be a serious annoyance at best. - - For now, remove the message altogether. */ -#if 0 - printed = 1; - target_terminal_ours_for_output (); - printf_filtered ("\nProgram received signal %s, %s.\n", - target_signal_to_name (stop_signal), - target_signal_to_string (stop_signal)); - gdb_flush (gdb_stdout); -#endif - } - - /* If it's not SIGTRAP and not a signal we want to stop for, then - continue the thread. */ - - if (stop_signal != TARGET_SIGNAL_TRAP && !signal_stop[stop_signal]) - { - if (printed) - target_terminal_inferior (); - - /* Clear the signal if it should not be passed. */ - if (signal_program[stop_signal] == 0) - stop_signal = TARGET_SIGNAL_0; - - target_resume (ecs->ptid, 0, stop_signal); - prepare_to_wait (ecs); - return; - } - - /* It's a SIGTRAP or a signal we're interested in. Switch threads, - and fall into the rest of wait_for_inferior(). */ - context_switch (ecs); if (context_hook) From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3276 invoked by alias); 7 Mar 2004 01:06:56 -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 3269 invoked from network); 7 Mar 2004 01:06:55 -0000 Received: from unknown (HELO nevyn.them.org) (66.93.172.17) by sources.redhat.com with SMTP; 7 Mar 2004 01:06:55 -0000 Received: from drow by nevyn.them.org with local (Exim 4.30 #1 (Debian)) id 1Azmko-0004hP-PI; Sat, 06 Mar 2004 20:06:54 -0500 Date: Fri, 19 Mar 2004 00:09:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sources.redhat.com Cc: Atsushi Nemoto Subject: [patch] Fix handle_inferior_event nostop signal handling for threads Message-ID: <20040307010654.GA10796@nevyn.them.org> Mail-Followup-To: gdb-patches@sources.redhat.com, Atsushi Nemoto Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.1i X-SW-Source: 2004-03/txt/msg00130.txt.bz2 Message-ID: <20040319000900.FQPW9RbWRMClsjstNYySaqkIVRW8P_DsECCy0aQXwAo@z> Atsushi-san, could you verify that this patch still fixes your problem? I took a look at the #if 0 block, and that made me look at the surrounding code; I don't believe that a bit of it is necessary. If we switch "current" threads in response to this event, then all the following bits of handle_inferior_event should handle the current thread correctly. If this works for you I'll commit it to HEAD. I'm not sure if it's safe for the branch. No regressions on native i686-linux, and it fixes a quirk that the previous patch I sent you introduced (we could sometimes fail to print about a pass/print/nostop signal). -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer 2004-03-06 Daniel Jacobowitz * infrun.c (handle_inferior_event): Remove short-circuit code for events in a different thread. Index: infrun.c =================================================================== RCS file: /cvs/src/src/gdb/infrun.c,v retrieving revision 1.138 diff -u -p -r1.138 infrun.c --- infrun.c 6 Mar 2004 00:10:06 -0000 1.138 +++ infrun.c 7 Mar 2004 00:31:51 -0000 @@ -1883,61 +1883,9 @@ handle_inferior_event (struct execution_ ecs->random_signal = 1; /* See if something interesting happened to the non-current thread. If - so, then switch to that thread, and eventually give control back to - the user. - - Note that if there's any kind of pending follow (i.e., of a fork, - vfork or exec), we don't want to do this now. Rather, we'll let - the next resume handle it. */ - if (!ptid_equal (ecs->ptid, inferior_ptid) && - (pending_follow.kind == TARGET_WAITKIND_SPURIOUS)) + so, then switch to that thread. */ + if (!ptid_equal (ecs->ptid, inferior_ptid)) { - int printed = 0; - - /* If it's a random signal for a non-current thread, notify user - if he's expressed an interest. */ - if (ecs->random_signal && signal_print[stop_signal]) - { -/* ??rehrauer: I don't understand the rationale for this code. If the - inferior will stop as a result of this signal, then the act of handling - the stop ought to print a message that's couches the stoppage in user - terms, e.g., "Stopped for breakpoint/watchpoint". If the inferior - won't stop as a result of the signal -- i.e., if the signal is merely - a side-effect of something GDB's doing "under the covers" for the - user, such as stepping threads over a breakpoint they shouldn't stop - for -- then the message seems to be a serious annoyance at best. - - For now, remove the message altogether. */ -#if 0 - printed = 1; - target_terminal_ours_for_output (); - printf_filtered ("\nProgram received signal %s, %s.\n", - target_signal_to_name (stop_signal), - target_signal_to_string (stop_signal)); - gdb_flush (gdb_stdout); -#endif - } - - /* If it's not SIGTRAP and not a signal we want to stop for, then - continue the thread. */ - - if (stop_signal != TARGET_SIGNAL_TRAP && !signal_stop[stop_signal]) - { - if (printed) - target_terminal_inferior (); - - /* Clear the signal if it should not be passed. */ - if (signal_program[stop_signal] == 0) - stop_signal = TARGET_SIGNAL_0; - - target_resume (ecs->ptid, 0, stop_signal); - prepare_to_wait (ecs); - return; - } - - /* It's a SIGTRAP or a signal we're interested in. Switch threads, - and fall into the rest of wait_for_inferior(). */ - context_switch (ecs); if (context_hook)