diff options
author | Pedro Alves <palves@redhat.com> | 2010-02-24 01:06:28 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2010-02-24 01:06:28 +0000 |
commit | 06cd862c015ff7285816de9e36290b5b1a7b090e (patch) | |
tree | d053a8ccb0bdadc5088e59e7728b7f4a2961b66f /gdb/tracepoint.c | |
parent | ab92d69b1e3a3db7bd4f9564ad3b5bbccc9a7988 (diff) | |
download | gdb-06cd862c015ff7285816de9e36290b5b1a7b090e.zip gdb-06cd862c015ff7285816de9e36290b5b1a7b090e.tar.gz gdb-06cd862c015ff7285816de9e36290b5b1a7b090e.tar.bz2 |
* tracepoint.h (set_traceframe_number)
(cleanup_restore_current_traceframe): Declare.
* tracepoint.c (set_traceframe_number): New.
(struct current_traceframe_cleanup): New.
(do_restore_current_traceframe_cleanup)
(restore_current_traceframe_cleanup_dtor)
(make_cleanup_restore_current_traceframe): New.
* infrun.c: Include tracepoint.h.
(fetch_inferior_event): Switch out and in of tfind mode.
Diffstat (limited to 'gdb/tracepoint.c')
-rw-r--r-- | gdb/tracepoint.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index f38d6c1..1d2785f 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -2538,6 +2538,67 @@ get_traceframe_number (void) return traceframe_number; } +/* Make the traceframe NUM be the current trace frame. Does nothing + if NUM is already current. */ + +void +set_traceframe_number (int num) +{ + int newnum; + + if (traceframe_number == num) + { + /* Nothing to do. */ + return; + } + + newnum = target_trace_find (tfind_number, num, 0, 0, NULL); + + if (newnum != num) + warning (_("could not change traceframe")); + + traceframe_number = newnum; + + /* Changing the traceframe changes our view of registers and of the + frame chain. */ + registers_changed (); +} + +/* 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 = arg; + + set_traceframe_number (old->traceframe_number); +} + +static void +restore_current_traceframe_cleanup_dtor (void *arg) +{ + struct current_traceframe_cleanup *old = arg; + + xfree (old); +} + +struct cleanup * +make_cleanup_restore_current_traceframe (void) +{ + struct current_traceframe_cleanup *old; + + old = xmalloc (sizeof (struct current_traceframe_cleanup)); + old->traceframe_number = traceframe_number; + + return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old, + restore_current_traceframe_cleanup_dtor); +} /* Given a number and address, return an uploaded tracepoint with that number, creating if necessary. */ |