mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-03-05 16:09:49 +00:00
2007-02-02 Denis Pilat <denis.pilat@st.com>
* thread.c (make_cleanup_restore_current_thread): New function. (info_threads_command): Use of make_cleanup_restore_current_thread to restore the current thread and the selected frame. (restore_selected_frame): New function. (struct current_thread_cleanup): Add frame_id field. (do_restore_current_thread_cleanup): Add restoring of the selected frame. (make_cleanup_restore_current_thread): Likewise. (thread_apply_all_command): backup the selected frame while entering the function and restore it at exit. (thread_apply_command): Likewise.
This commit is contained in:
parent
d3c598de8e
commit
99b3d57478
@ -1,3 +1,17 @@
|
||||
2007-02-02 Denis Pilat <denis.pilat@st.com>
|
||||
|
||||
* thread.c (make_cleanup_restore_current_thread): New function.
|
||||
(info_threads_command): Use of make_cleanup_restore_current_thread
|
||||
to restore the current thread and the selected frame.
|
||||
(restore_selected_frame): New function.
|
||||
(struct current_thread_cleanup): Add frame_id field.
|
||||
(do_restore_current_thread_cleanup): Add restoring of the selected
|
||||
frame.
|
||||
(make_cleanup_restore_current_thread): Likewise.
|
||||
(thread_apply_all_command): backup the selected frame while
|
||||
entering the function and restore it at exit.
|
||||
(thread_apply_command): Likewise.
|
||||
|
||||
2007-02-02 Denis Pilat <denis.pilat@st.com>
|
||||
|
||||
* MAINTAINERS (Write After Approval): Add myself to the list.
|
||||
|
81
gdb/thread.c
81
gdb/thread.c
@ -65,6 +65,8 @@ static void thread_apply_command (char *, int);
|
||||
static void restore_current_thread (ptid_t);
|
||||
static void switch_to_thread (ptid_t ptid);
|
||||
static void prune_threads (void);
|
||||
static struct cleanup *make_cleanup_restore_current_thread (ptid_t,
|
||||
struct frame_id);
|
||||
|
||||
void
|
||||
delete_step_resume_breakpoint (void *arg)
|
||||
@ -408,9 +410,14 @@ info_threads_command (char *arg, int from_tty)
|
||||
struct thread_info *tp;
|
||||
ptid_t current_ptid;
|
||||
struct frame_info *cur_frame;
|
||||
struct frame_id saved_frame_id = get_frame_id (get_selected_frame (NULL));
|
||||
struct cleanup *old_chain;
|
||||
struct frame_id saved_frame_id;
|
||||
char *extra_info;
|
||||
|
||||
/* Backup current thread and selected frame. */
|
||||
saved_frame_id = get_frame_id (get_selected_frame (NULL));
|
||||
old_chain = make_cleanup_restore_current_thread (inferior_ptid, saved_frame_id);
|
||||
|
||||
prune_threads ();
|
||||
target_find_new_threads ();
|
||||
current_ptid = inferior_ptid;
|
||||
@ -427,30 +434,22 @@ info_threads_command (char *arg, int from_tty)
|
||||
if (extra_info)
|
||||
printf_filtered (" (%s)", extra_info);
|
||||
puts_filtered (" ");
|
||||
|
||||
/* That switch put us at the top of the stack (leaf frame). */
|
||||
switch_to_thread (tp->ptid);
|
||||
print_stack_frame (get_selected_frame (NULL), 0, LOCATION);
|
||||
}
|
||||
|
||||
switch_to_thread (current_ptid);
|
||||
/* Restores the current thread and the frame selected before
|
||||
the "info threads" command. */
|
||||
do_cleanups (old_chain);
|
||||
|
||||
/* Restores the frame set by the user before the "info threads"
|
||||
command. We have finished the info-threads display by switching
|
||||
back to the current thread. That switch has put us at the top of
|
||||
the stack (leaf frame). */
|
||||
cur_frame = frame_find_by_id (saved_frame_id);
|
||||
if (cur_frame == NULL)
|
||||
/* If case we were not able to find the original frame, print the
|
||||
new selected frame. */
|
||||
if (frame_find_by_id (saved_frame_id) == NULL)
|
||||
{
|
||||
/* Ooops, can't restore, tell user where we are. */
|
||||
warning (_("Couldn't restore frame in current thread, at frame 0"));
|
||||
print_stack_frame (get_selected_frame (NULL), 0, LOCATION);
|
||||
}
|
||||
else
|
||||
{
|
||||
select_frame (cur_frame);
|
||||
/* re-show current frame. */
|
||||
show_stack_frame (cur_frame);
|
||||
}
|
||||
}
|
||||
|
||||
/* Switch from one thread to another. */
|
||||
@ -474,13 +473,27 @@ restore_current_thread (ptid_t ptid)
|
||||
if (!ptid_equal (ptid, inferior_ptid))
|
||||
{
|
||||
switch_to_thread (ptid);
|
||||
print_stack_frame (get_current_frame (), 1, SRC_LINE);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
restore_selected_frame (struct frame_id a_frame_id)
|
||||
{
|
||||
struct frame_info *selected_frame_info = NULL;
|
||||
|
||||
if (frame_id_eq (a_frame_id, null_frame_id))
|
||||
return;
|
||||
|
||||
if ((selected_frame_info = frame_find_by_id (a_frame_id)) != NULL)
|
||||
{
|
||||
select_frame (selected_frame_info);
|
||||
}
|
||||
}
|
||||
|
||||
struct current_thread_cleanup
|
||||
{
|
||||
ptid_t inferior_ptid;
|
||||
struct frame_id selected_frame_id;
|
||||
};
|
||||
|
||||
static void
|
||||
@ -488,15 +501,18 @@ do_restore_current_thread_cleanup (void *arg)
|
||||
{
|
||||
struct current_thread_cleanup *old = arg;
|
||||
restore_current_thread (old->inferior_ptid);
|
||||
restore_selected_frame (old->selected_frame_id);
|
||||
xfree (old);
|
||||
}
|
||||
|
||||
static struct cleanup *
|
||||
make_cleanup_restore_current_thread (ptid_t inferior_ptid)
|
||||
make_cleanup_restore_current_thread (ptid_t inferior_ptid,
|
||||
struct frame_id a_frame_id)
|
||||
{
|
||||
struct current_thread_cleanup *old
|
||||
= xmalloc (sizeof (struct current_thread_cleanup));
|
||||
old->inferior_ptid = inferior_ptid;
|
||||
old->selected_frame_id = a_frame_id;
|
||||
return make_cleanup (do_restore_current_thread_cleanup, old);
|
||||
}
|
||||
|
||||
@ -516,11 +532,16 @@ thread_apply_all_command (char *cmd, int from_tty)
|
||||
struct cleanup *old_chain;
|
||||
struct cleanup *saved_cmd_cleanup_chain;
|
||||
char *saved_cmd;
|
||||
struct frame_id saved_frame_id;
|
||||
ptid_t current_ptid;
|
||||
int thread_has_changed = 0;
|
||||
|
||||
if (cmd == NULL || *cmd == '\000')
|
||||
error (_("Please specify a command following the thread ID list"));
|
||||
|
||||
old_chain = make_cleanup_restore_current_thread (inferior_ptid);
|
||||
|
||||
current_ptid = inferior_ptid;
|
||||
saved_frame_id = get_frame_id (get_selected_frame (NULL));
|
||||
old_chain = make_cleanup_restore_current_thread (inferior_ptid, saved_frame_id);
|
||||
|
||||
/* It is safe to update the thread list now, before
|
||||
traversing it for "thread apply all". MVS */
|
||||
@ -540,8 +561,15 @@ thread_apply_all_command (char *cmd, int from_tty)
|
||||
strcpy (cmd, saved_cmd); /* Restore exact command used previously */
|
||||
}
|
||||
|
||||
if (!ptid_equal (current_ptid, inferior_ptid))
|
||||
thread_has_changed = 1;
|
||||
|
||||
do_cleanups (saved_cmd_cleanup_chain);
|
||||
do_cleanups (old_chain);
|
||||
/* Print stack frame only if we changed thread. */
|
||||
if (thread_has_changed)
|
||||
print_stack_frame (get_current_frame (), 1, SRC_LINE);
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
@ -552,6 +580,9 @@ thread_apply_command (char *tidlist, int from_tty)
|
||||
struct cleanup *old_chain;
|
||||
struct cleanup *saved_cmd_cleanup_chain;
|
||||
char *saved_cmd;
|
||||
struct frame_id saved_frame_id;
|
||||
ptid_t current_ptid;
|
||||
int thread_has_changed = 0;
|
||||
|
||||
if (tidlist == NULL || *tidlist == '\000')
|
||||
error (_("Please specify a thread ID list"));
|
||||
@ -561,7 +592,9 @@ thread_apply_command (char *tidlist, int from_tty)
|
||||
if (*cmd == '\000')
|
||||
error (_("Please specify a command following the thread ID list"));
|
||||
|
||||
old_chain = make_cleanup_restore_current_thread (inferior_ptid);
|
||||
current_ptid = inferior_ptid;
|
||||
saved_frame_id = get_frame_id (get_selected_frame (NULL));
|
||||
old_chain = make_cleanup_restore_current_thread (inferior_ptid, saved_frame_id);
|
||||
|
||||
/* Save a copy of the command in case it is clobbered by
|
||||
execute_command */
|
||||
@ -613,8 +646,14 @@ thread_apply_command (char *tidlist, int from_tty)
|
||||
}
|
||||
}
|
||||
|
||||
if (!ptid_equal (current_ptid, inferior_ptid))
|
||||
thread_has_changed = 1;
|
||||
|
||||
do_cleanups (saved_cmd_cleanup_chain);
|
||||
do_cleanups (old_chain);
|
||||
/* Print stack frame only if we changed thread. */
|
||||
if (thread_has_changed)
|
||||
print_stack_frame (get_current_frame (), 1, SRC_LINE);
|
||||
}
|
||||
|
||||
/* Switch to the specified thread. Will dispatch off to thread_apply_command
|
||||
|
Loading…
x
Reference in New Issue
Block a user