From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10491 invoked by alias); 28 Jan 2011 02:40:09 -0000 Received: (qmail 10477 invoked by uid 22791); 28 Jan 2011 02:40:07 -0000 X-SWARE-Spam-Status: No, hits=-6.8 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 28 Jan 2011 02:40:01 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id p0S2e0xl016893 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 27 Jan 2011 21:40:00 -0500 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p0S2dx8H022881; Thu, 27 Jan 2011 21:39:59 -0500 Received: from opsy.redhat.com (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id p0S2dw3d008339; Thu, 27 Jan 2011 21:39:59 -0500 Received: by opsy.redhat.com (Postfix, from userid 500) id A564D37887A; Thu, 27 Jan 2011 19:39:58 -0700 (MST) From: Tom Tromey To: gdb-patches@sourceware.org Subject: FYI: add some breakpoint setter methods Date: Fri, 28 Jan 2011 02:40:00 -0000 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-01/txt/msg00526.txt.bz2 I plan to check this in. I noticed that modifications to breakpoints via Python do not cause the breakpoint-modified observer to fire. This is important to make the (future) MI async notifications work correctly. This patch fixes the problem by introducing some setter methods, then changing Python to use these methods. I looked for other places that set these fields, but didn't find any. I removed make_breakpoint_silent in favor of the new setter, since having multiple setters seemed strange. I opted to have the observers only fire if the field value actually changed. This seemed best to me. As an aside, it seems to me that the breakpoint observers should probably take a 'struct breakpoint *' as an argument, rather than a breakpoint number. This would be more efficient: I think most users will want to have access to the actual breakpoint anyhow, and this would avoid a search through all breakpoints for the number. Perhaps I will implement this. Bootstrapped and regtested on x86-64. Tom 2011-01-27 Tom Tromey * infcmd.c (finish_backward): Use breakpoint_set_silent. * python/py-breakpoint.c (bppy_set_silent): Use breakpoint_set_silent. (bppy_set_thread): Use breakpoint_set_thread. (bppy_set_task): Use breakpoint_set_task. * breakpoint.h (breakpoint_set_silent, breakpoint_set_thread) (breakpoint_set_task): Declare. (make_breakpoint_silent): Remove. * breakpoint.c (breakpoint_set_silent): New function. (breakpoint_set_thread): Likewise. (breakpoint_set_task): Likewise. (make_breakpoint_silent): Remove. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index f82607b..027491a 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -940,6 +940,43 @@ breakpoint_set_commands (struct breakpoint *b, observer_notify_breakpoint_modified (b->number); } +/* Set the internal `silent' flag on the breakpoint. Note that this + is not the same as the "silent" that may appear in the breakpoint's + commands. */ + +void +breakpoint_set_silent (struct breakpoint *b, int silent) +{ + int old_silent = b->silent; + b->silent = silent; + if (old_silent != silent) + observer_notify_breakpoint_modified (b->number); +} + +/* Set the thread for this breakpoint. If THREAD is -1, make the + breakpoint work for any thread. */ + +void +breakpoint_set_thread (struct breakpoint *b, int thread) +{ + int old_thread = b->thread; + b->thread = thread; + if (old_thread != thread) + observer_notify_breakpoint_modified (b->number); +} + +/* Set the task for this breakpoint. If TASK is 0, make the + breakpoint work for any task. */ + +void +breakpoint_set_task (struct breakpoint *b, int task) +{ + int old_task = b->task; + b->task = task; + if (old_task != task) + observer_notify_breakpoint_modified (b->number); +} + void check_tracepoint_command (char *line, void *closure) { @@ -10739,13 +10776,6 @@ set_ignore_count (int bptnum, int count, int from_tty) error (_("No breakpoint number %d."), bptnum); } -void -make_breakpoint_silent (struct breakpoint *b) -{ - /* Silence the breakpoint. */ - b->silent = 1; -} - /* Command to set ignore-count of breakpoint N to COUNT. */ static void diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index 6eed2cd..a7d0c61 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -1063,6 +1063,12 @@ extern void enable_breakpoint (struct breakpoint *); extern void breakpoint_set_commands (struct breakpoint *b, struct command_line *commands); +extern void breakpoint_set_silent (struct breakpoint *b, int silent); + +extern void breakpoint_set_thread (struct breakpoint *b, int thread); + +extern void breakpoint_set_task (struct breakpoint *b, int task); + /* Clear the "inserted" flag in all breakpoints. */ extern void mark_breakpoints_out (void); @@ -1140,9 +1146,6 @@ extern int catch_syscall_enabled (void); Returns 0 if not, greater than 0 if we are. */ extern int catching_syscall_number (int syscall_number); -/* Tell a breakpoint to be quiet. */ -extern void make_breakpoint_silent (struct breakpoint *); - /* Return a tracepoint with the given number if found. */ extern struct breakpoint *get_tracepoint (int num); diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 5efbf39..2755fd0 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1545,7 +1545,7 @@ finish_backward (struct symbol *function) bp_breakpoint); /* Tell the breakpoint to keep quiet. We won't be done until we've done another reverse single-step. */ - make_breakpoint_silent (breakpoint); + breakpoint_set_silent (breakpoint, 1); old_chain = make_cleanup_delete_breakpoint (breakpoint); proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0); /* We will be stopped when proceed returns. */ diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c index b6d0088..3474b71 100644 --- a/gdb/python/py-breakpoint.c +++ b/gdb/python/py-breakpoint.c @@ -201,7 +201,7 @@ bppy_set_silent (PyObject *self, PyObject *newvalue, void *closure) if (cmp < 0) return -1; else - self_bp->bp->silent = cmp; + breakpoint_set_silent (self_bp->bp, cmp); return 0; } @@ -240,7 +240,7 @@ bppy_set_thread (PyObject *self, PyObject *newvalue, void *closure) return -1; } - self_bp->bp->thread = id; + breakpoint_set_thread (self_bp->bp, id); return 0; } @@ -279,7 +279,7 @@ bppy_set_task (PyObject *self, PyObject *newvalue, void *closure) return -1; } - self_bp->bp->task = id; + breakpoint_set_task (self_bp->bp, id); return 0; }