This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA 7/8] Use unique_xmalloc_ptr in execute_gdb_command


On 12/15/2016 03:48 AM, Tom Tromey wrote:
>>>>>> "Tom" == Tom Tromey <tom@tromey.com> writes:
> 
> Tom> To my surprise, this patch is broken.
> Tom> I must not have re-run the python tests locally after writing it :(
> 
> Tom> The problem is that prevent_dont_repeat returns a cleanup, which is then
> Tom> left dangling after this patch.
> 
> Here's the updated patch.
> I ran this one through the buildbot.
> 

In some other local patch that I hadn't posted, I handled a similar
situation of save/restoring some global that we don't want to expose
by making the "make_cleanup_..." function return a scoped_restore, which
avoids having to create a new class.  It seems a bit simpler that
creating a class to me, and maybe a tiny bit more efficient code-space
wise (rtti?)  Did you consider this approach?  In this case, it'd look
like this:

>From 3138a3fb72f76d0d1bb5a2e1db57e450c37dd43a Mon Sep 17 00:00:00 2001
From: Pedro Alves <palves@redhat.com>
Date: Tue, 20 Dec 2016 17:30:56 +0000
Subject: [PATCH] Return scoped_restore instead of cleanup

---
 gdb/breakpoint.c |  2 +-
 gdb/command.h    |  2 +-
 gdb/top.c        | 16 ++++++----------
 3 files changed, 8 insertions(+), 12 deletions(-)

diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index d737cad..dc72986 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -4685,7 +4685,7 @@ bpstat_do_actions_1 (bpstat *bsp)
   executing_breakpoint_commands = 1;
   old_chain = make_cleanup (cleanup_executing_breakpoints, 0);
 
-  prevent_dont_repeat ();
+  scoped_restore save_dont_repeat = prevent_dont_repeat ();
 
   /* This pointer will iterate over the list of bpstat's.  */
   bs = *bsp;
diff --git a/gdb/command.h b/gdb/command.h
index 965d91f..7b87814 100644
--- a/gdb/command.h
+++ b/gdb/command.h
@@ -408,7 +408,7 @@ extern void error_no_arg (const char *) ATTRIBUTE_NORETURN;
 
 extern void dont_repeat (void);
 
-extern struct cleanup *prevent_dont_repeat (void);
+extern scoped_restore_tmpl<bool> prevent_dont_repeat ();
 
 /* Used to mark commands that don't do anything.  If we just leave the
    function field NULL, the command is interpreted as a help topic, or
diff --git a/gdb/top.c b/gdb/top.c
index 7d8b6e8..280af71 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -732,10 +732,10 @@ execute_command_to_string (char *p, int from_tty)
 }
 
 
-/* When nonzero, cause dont_repeat to do nothing.  This should only be
+/* When true, cause dont_repeat to do nothing.  This should only be
    set via prevent_dont_repeat.  */
 
-static int suppress_dont_repeat = 0;
+static bool suppress_dont_repeat = false;
 
 /* Commands call this if they do not want to be repeated by null lines.  */
 
@@ -754,16 +754,12 @@ dont_repeat (void)
     *saved_command_line = 0;
 }
 
-/* Prevent dont_repeat from working, and return a cleanup that
+/* Prevent dont_repeat from working, and return a scoped restore that
    restores the previous state.  */
-
-struct cleanup *
-prevent_dont_repeat (void)
+scoped_restore_tmpl<bool>
+prevent_dont_repeat ()
 {
-  struct cleanup *result = make_cleanup_restore_integer (&suppress_dont_repeat);
-
-  suppress_dont_repeat = 1;
-  return result;
+  return make_scoped_restore (&suppress_dont_repeat, true);
 }
 
 
-- 
2.5.5



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]