forked from Imagelibrary/binutils-gdb
RAII-fy make_cleanup_restore_current_thread & friends
After all the make_cleanup_restore_current_thread fixing, I thought I'd convert that and its relatives (which are all cleanups) to RAII classes. scoped_restore_current_pspace_and_thread was put in a separate file to avoid a circular dependency. Tested on x86-64 Fedora 23, native and gdbserver. gdb/ChangeLog: 2017-05-04 Pedro Alves <palves@redhat.com> * Makefile.in (SFILES): Add progspace-and-thread.c. (HFILES_NO_SRCDIR): Add progspace-and-thread.h. (COMMON_OBS): Add progspace-and-thread.o. * breakpoint.c: Include "progspace-and-thread.h". (update_inserted_breakpoint_locations) (insert_breakpoint_locations, create_longjmp_master_breakpoint): Use scoped_restore_current_pspace_and_thread. (create_std_terminate_master_breakpoint): Use scoped_restore_current_program_space. (remove_breakpoint): Use scoped_restore_current_pspace_and_thread. (print_breakpoint_location): Use scoped_restore_current_program_space. (bp_loc_is_permanent): Use scoped_restore_current_pspace_and_thread. (resolve_sal_pc): Use scoped_restore_current_pspace_and_thread. (download_tracepoint_locations): Use scoped_restore_current_pspace_and_thread. (breakpoint_re_set): Use scoped_restore_current_pspace_and_thread. * exec.c (exec_close_1): Use scoped_restore_current_program_space. (enum step_over_calls_kind): Moved from inferior.h. (class scoped_restore_current_thread): New class. * gdbthread.h (make_cleanup_restore_current_thread): Delete declaration. (scoped_restore_current_thread): New class. * infcmd.c: Include "common/gdb_optional.h". (continue_1, proceed_after_attach): Use scoped_restore_current_thread. (notice_new_inferior): Use scoped_restore_current_thread. * inferior.c: Include "progspace-and-thread.h". (restore_inferior, save_current_inferior): Delete. (add_inferior_command, clone_inferior_command): Use scoped_restore_current_pspace_and_thread. * inferior.h (scoped_restore_current_inferior): New class. * infrun.c: Include "progspace-and-thread.h" and "common/gdb_optional.h". (follow_fork_inferior): Use scoped_restore_current_pspace_and_thread. (scoped_restore_exited_inferior): New class. (handle_vfork_child_exec_or_exit): Use scoped_restore_exited_inferior, scoped_restore_current_pspace_and_thread, scoped_restore_current_thread and scoped_restore. (fetch_inferior_event): Use scoped_restore_current_thread. * linespec.c (decode_line_full, decode_line_1): Use scoped_restore_current_program_space. * mi/mi-main.c: Include "progspace-and-thread.h". (exec_continue): Use scoped_restore_current_thread. (mi_cmd_exec_run): Use scoped_restore_current_pspace_and_thread. (mi_cmd_trace_frame_collected): Use scoped_restore_current_thread. * proc-service.c (ps_pglobal_lookup): Use scoped_restore_current_program_space. * progspace-and-thread.c: New file. * progspace-and-thread.h: New file. * progspace.c (release_program_space, clone_program_space): Use scoped_restore_current_program_space. (restore_program_space, save_current_program_space) (save_current_space_and_thread): Delete. (switch_to_program_space_and_thread): Moved to progspace-and-thread.c. * progspace.h (save_current_program_space) (save_current_space_and_thread): Delete declarations. (scoped_restore_current_program_space): New class. * remote.c (remote_btrace_maybe_reopen): Use scoped_restore_current_thread. * symtab.c: Include "progspace-and-thread.h". (skip_prologue_sal): Use scoped_restore_current_pspace_and_thread. * thread.c (print_thread_info_1): Use scoped_restore_current_thread. (struct current_thread_cleanup): Delete. (do_restore_current_thread_cleanup) (restore_current_thread_cleanup_dtor): Rename/convert both to ... (scoped_restore_current_thread::~scoped_restore_current_thread): ... this new dtor. (make_cleanup_restore_current_thread): Rename/convert to ... (scoped_restore_current_thread::scoped_restore_current_thread): ... this new ctor. (thread_apply_all_command): Use scoped_restore_current_thread. (thread_apply_command): Use scoped_restore_current_thread. * tracepoint.c (tdump_command): Use scoped_restore_current_thread. * varobj.c (value_of_root_1): Use scoped_restore_current_thread.
This commit is contained in:
65
gdb/infrun.c
65
gdb/infrun.c
@@ -64,6 +64,8 @@
|
||||
#include "event-loop.h"
|
||||
#include "thread-fsm.h"
|
||||
#include "common/enum-flags.h"
|
||||
#include "progspace-and-thread.h"
|
||||
#include "common/gdb_optional.h"
|
||||
|
||||
/* Prototypes for local functions */
|
||||
|
||||
@@ -487,7 +489,6 @@ holding the child stopped. Try \"set detach-on-fork\" or \
|
||||
else
|
||||
{
|
||||
struct inferior *parent_inf, *child_inf;
|
||||
struct cleanup *old_chain;
|
||||
|
||||
/* Add process to GDB's tables. */
|
||||
child_inf = add_inferior (ptid_get_pid (child_ptid));
|
||||
@@ -498,7 +499,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \
|
||||
child_inf->gdbarch = parent_inf->gdbarch;
|
||||
copy_inferior_target_desc_info (child_inf, parent_inf);
|
||||
|
||||
old_chain = save_current_space_and_thread ();
|
||||
scoped_restore_current_pspace_and_thread restore_pspace_thread;
|
||||
|
||||
inferior_ptid = child_ptid;
|
||||
add_thread (inferior_ptid);
|
||||
@@ -536,8 +537,6 @@ holding the child stopped. Try \"set detach-on-fork\" or \
|
||||
required. */
|
||||
solib_create_inferior_hook (0);
|
||||
}
|
||||
|
||||
do_cleanups (old_chain);
|
||||
}
|
||||
|
||||
if (has_vforked)
|
||||
@@ -895,6 +894,22 @@ proceed_after_vfork_done (struct thread_info *thread,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Save/restore inferior_ptid, current program space and current
|
||||
inferior. Only use this if the current context points at an exited
|
||||
inferior (and therefore there's no current thread to save). */
|
||||
class scoped_restore_exited_inferior
|
||||
{
|
||||
public:
|
||||
scoped_restore_exited_inferior ()
|
||||
: m_saved_ptid (&inferior_ptid)
|
||||
{}
|
||||
|
||||
private:
|
||||
scoped_restore_tmpl<ptid_t> m_saved_ptid;
|
||||
scoped_restore_current_program_space m_pspace;
|
||||
scoped_restore_current_inferior m_inferior;
|
||||
};
|
||||
|
||||
/* Called whenever we notice an exec or exit event, to handle
|
||||
detaching or resuming a vfork parent. */
|
||||
|
||||
@@ -914,7 +929,6 @@ handle_vfork_child_exec_or_exit (int exec)
|
||||
if (inf->vfork_parent->pending_detach)
|
||||
{
|
||||
struct thread_info *tp;
|
||||
struct cleanup *old_chain;
|
||||
struct program_space *pspace;
|
||||
struct address_space *aspace;
|
||||
|
||||
@@ -922,16 +936,17 @@ handle_vfork_child_exec_or_exit (int exec)
|
||||
|
||||
inf->vfork_parent->pending_detach = 0;
|
||||
|
||||
gdb::optional<scoped_restore_exited_inferior>
|
||||
maybe_restore_inferior;
|
||||
gdb::optional<scoped_restore_current_pspace_and_thread>
|
||||
maybe_restore_thread;
|
||||
|
||||
/* If we're handling a child exit, then inferior_ptid points
|
||||
at the inferior's pid, not to a thread. */
|
||||
if (!exec)
|
||||
{
|
||||
/* If we're handling a child exit, then inferior_ptid
|
||||
points at the inferior's pid, not to a thread. */
|
||||
old_chain = save_inferior_ptid ();
|
||||
save_current_program_space ();
|
||||
save_current_inferior ();
|
||||
}
|
||||
maybe_restore_inferior.emplace ();
|
||||
else
|
||||
old_chain = save_current_space_and_thread ();
|
||||
maybe_restore_thread.emplace ();
|
||||
|
||||
/* We're letting loose of the parent. */
|
||||
tp = any_live_thread_of_process (inf->vfork_parent->pid);
|
||||
@@ -979,8 +994,6 @@ handle_vfork_child_exec_or_exit (int exec)
|
||||
/* Put it back. */
|
||||
inf->pspace = pspace;
|
||||
inf->aspace = aspace;
|
||||
|
||||
do_cleanups (old_chain);
|
||||
}
|
||||
else if (exec)
|
||||
{
|
||||
@@ -998,7 +1011,6 @@ handle_vfork_child_exec_or_exit (int exec)
|
||||
}
|
||||
else
|
||||
{
|
||||
struct cleanup *old_chain;
|
||||
struct program_space *pspace;
|
||||
|
||||
/* If this is a vfork child exiting, then the pspace and
|
||||
@@ -1010,10 +1022,11 @@ handle_vfork_child_exec_or_exit (int exec)
|
||||
go ahead and create a new one for this exiting
|
||||
inferior. */
|
||||
|
||||
/* Switch to null_ptid, so that clone_program_space doesn't want
|
||||
to read the selected frame of a dead process. */
|
||||
old_chain = save_inferior_ptid ();
|
||||
inferior_ptid = null_ptid;
|
||||
/* Switch to null_ptid while running clone_program_space, so
|
||||
that clone_program_space doesn't want to read the
|
||||
selected frame of a dead process. */
|
||||
scoped_restore restore_ptid
|
||||
= make_scoped_restore (&inferior_ptid, null_ptid);
|
||||
|
||||
/* This inferior is dead, so avoid giving the breakpoints
|
||||
module the option to write through to it (cloning a
|
||||
@@ -1028,10 +1041,6 @@ handle_vfork_child_exec_or_exit (int exec)
|
||||
inf->pspace = pspace;
|
||||
inf->aspace = pspace->aspace;
|
||||
|
||||
/* Put back inferior_ptid. We'll continue mourning this
|
||||
inferior. */
|
||||
do_cleanups (old_chain);
|
||||
|
||||
resume_parent = inf->vfork_parent->pid;
|
||||
/* Break the bonds. */
|
||||
inf->vfork_parent->vfork_child = NULL;
|
||||
@@ -1045,7 +1054,7 @@ handle_vfork_child_exec_or_exit (int exec)
|
||||
{
|
||||
/* If the user wanted the parent to be running, let it go
|
||||
free now. */
|
||||
struct cleanup *old_chain = make_cleanup_restore_current_thread ();
|
||||
scoped_restore_current_thread restore_thread;
|
||||
|
||||
if (debug_infrun)
|
||||
fprintf_unfiltered (gdb_stdlog,
|
||||
@@ -1053,8 +1062,6 @@ handle_vfork_child_exec_or_exit (int exec)
|
||||
resume_parent);
|
||||
|
||||
iterate_over_threads (proceed_after_vfork_done, &resume_parent);
|
||||
|
||||
do_cleanups (old_chain);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3889,12 +3896,14 @@ fetch_inferior_event (void *client_data)
|
||||
set_current_traceframe (-1);
|
||||
}
|
||||
|
||||
gdb::optional<scoped_restore_current_thread> maybe_restore_thread;
|
||||
|
||||
if (non_stop)
|
||||
/* In non-stop mode, the user/frontend should not notice a thread
|
||||
switch due to internal events. Make sure we reverse to the
|
||||
user selected thread and frame after handling the event and
|
||||
running any breakpoint commands. */
|
||||
make_cleanup_restore_current_thread ();
|
||||
maybe_restore_thread.emplace ();
|
||||
|
||||
overlay_cache_invalid = 1;
|
||||
/* Flush target cache before starting to handle each event. Target
|
||||
|
||||
Reference in New Issue
Block a user