Replace make_cleanup_restore_current_traceframe with RAII class

Message ID 20180401031752.15146-1-simon.marchi@polymtl.ca
State New, archived
Headers

Commit Message

Simon Marchi April 1, 2018, 3:17 a.m. UTC
  I put the constructor in tracepoint.c because it needs to read
traceframe_number, and I prefer to do that than to expose
traceframe_number.

gdb/ChangeLog:

	* tracepoint.c (struct current_traceframe_cleanup): Remove.
	(do_restore_current_traceframe_cleanup): Remove.
	(restore_current_traceframe_cleanup_dtor): Remove.
	(make_cleanup_restore_current_traceframe): Remove.
	(scoped_restore_current_traceframe::scoped_restore_current_traceframe):
	New.
	* tracepoint.h (struct scoped_restore_current_traceframe): New.
	* infrun.c (fetch_inferior_event): Use
	scoped_restore_current_traceframe.
---
 gdb/infrun.c     |  3 ++-
 gdb/tracepoint.c | 40 +++-------------------------------------
 gdb/tracepoint.h | 17 ++++++++++++++++-
 3 files changed, 21 insertions(+), 39 deletions(-)
  

Comments

Simon Marchi April 7, 2018, 6:03 p.m. UTC | #1
On 2018-03-31 23:17, Simon Marchi wrote:
> I put the constructor in tracepoint.c because it needs to read
> traceframe_number, and I prefer to do that than to expose
> traceframe_number.

I pushed this patch in.

Simon
  

Patch

diff --git a/gdb/infrun.c b/gdb/infrun.c
index 6648698df6f1..d89f8137f4a0 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -3877,9 +3877,10 @@  fetch_inferior_event (void *client_data)
      debugging.  If we're looking at traceframes while the target is
      running, we're going to need to get back to that mode after
      handling the event.  */
+  gdb::optional<scoped_restore_current_traceframe> maybe_restore_traceframe;
   if (non_stop)
     {
-      make_cleanup_restore_current_traceframe ();
+      maybe_restore_traceframe.emplace ();
       set_current_traceframe (-1);
     }
 
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 954d039caf78..92343b0e7c64 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -3012,43 +3012,9 @@  set_current_traceframe (int num)
   clear_traceframe_info ();
 }
 
-/* A cleanup used when switching away and back from tfind mode.  */
-
-struct current_traceframe_cleanup
-{
-  /* The traceframe we were inspecting.  */
-  int traceframe_number;
-};
-
-static void
-do_restore_current_traceframe_cleanup (void *arg)
-{
-  struct current_traceframe_cleanup *old
-    = (struct current_traceframe_cleanup *) arg;
-
-  set_current_traceframe (old->traceframe_number);
-}
-
-static void
-restore_current_traceframe_cleanup_dtor (void *arg)
-{
-  struct current_traceframe_cleanup *old
-    = (struct current_traceframe_cleanup *) arg;
-
-  xfree (old);
-}
-
-struct cleanup *
-make_cleanup_restore_current_traceframe (void)
-{
-  struct current_traceframe_cleanup *old =
-    XNEW (struct current_traceframe_cleanup);
-
-  old->traceframe_number = traceframe_number;
-
-  return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
-			    restore_current_traceframe_cleanup_dtor);
-}
+scoped_restore_current_traceframe::scoped_restore_current_traceframe ()
+: m_traceframe_number (traceframe_number)
+{}
 
 /* Given a number and address, return an uploaded tracepoint with that
    number, creating if necessary.  */
diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h
index 8613cb2dd69e..02f4bf70890d 100644
--- a/gdb/tracepoint.h
+++ b/gdb/tracepoint.h
@@ -321,7 +321,22 @@  extern int get_tracepoint_number (void);
    etc.).  */
 extern void set_current_traceframe (int num);
 
-struct cleanup *make_cleanup_restore_current_traceframe (void);
+struct scoped_restore_current_traceframe
+{
+  scoped_restore_current_traceframe ();
+
+  ~scoped_restore_current_traceframe ()
+  {
+    set_current_traceframe (m_traceframe_number);
+  }
+
+  DISABLE_COPY_AND_ASSIGN (scoped_restore_current_traceframe);
+
+private:
+
+  /* The traceframe we were inspecting.  */
+  int m_traceframe_number;
+};
 
 void free_actions (struct breakpoint *);