* thread.c (make_cleanup_restore_current_thread): Make it

globally visible.
	* gdbthread.h (make_cleanup_restore_current_thread): Declare.
	* varobj.c (varobj_update): Don't save/restore frame.
	(c_value_of_root): Save/restore thread and frame here,
	using make_cleanup_restore_current_thread.
	* Makefile.in: Update dependecies.
This commit is contained in:
Vladimir Prus
2008-03-23 09:53:52 +00:00
parent 44a67aa79a
commit 6208b47d6c
5 changed files with 25 additions and 15 deletions

View File

@ -1,3 +1,13 @@
2008-03-23 Vladimir Prus <vladimir@codesourcery.com>
* thread.c (make_cleanup_restore_current_thread): Make it
globally visible.
* gdbthread.h (make_cleanup_restore_current_thread): Declare.
* varobj.c (varobj_update): Don't save/restore frame.
(c_value_of_root): Save/restore thread and frame here,
using make_cleanup_restore_current_thread.
* Makefile.in: Update dependecies.
2008-03-23 Vladimir Prus <vladimir@codesourcery.com> 2008-03-23 Vladimir Prus <vladimir@codesourcery.com>
* varobj.c (struct varobj_root): Clarify * varobj.c (struct varobj_root): Clarify

View File

@ -2940,7 +2940,8 @@ value.o: value.c $(defs_h) $(gdb_string_h) $(symtab_h) $(gdbtypes_h) \
$(gdb_assert_h) $(regcache_h) $(block_h) $(dfp_h) $(gdb_assert_h) $(regcache_h) $(block_h) $(dfp_h)
varobj.o: varobj.c $(defs_h) $(exceptions_h) $(value_h) $(expression_h) \ varobj.o: varobj.c $(defs_h) $(exceptions_h) $(value_h) $(expression_h) \
$(frame_h) $(language_h) $(wrapper_h) $(gdbcmd_h) $(block_h) \ $(frame_h) $(language_h) $(wrapper_h) $(gdbcmd_h) $(block_h) \
$(gdb_assert_h) $(gdb_string_h) $(varobj_h) $(vec_h) $(gdb_assert_h) $(gdb_string_h) $(varobj_h) $(vec_h) $(gdbthread_h) \
$(inferior_h)
vaxbsd-nat.o: vaxbsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) $(target_h) \ vaxbsd-nat.o: vaxbsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) $(target_h) \
$(vax_tdep_h) $(inf_ptrace_h) $(bsd_kvm_h) $(vax_tdep_h) $(inf_ptrace_h) $(bsd_kvm_h)
vax-nat.o: vax-nat.c $(defs_h) $(inferior_h) $(gdb_assert_h) $(vax_tdep_h) \ vax-nat.o: vax-nat.c $(defs_h) $(inferior_h) $(gdb_assert_h) $(vax_tdep_h) \

View File

@ -158,4 +158,8 @@ extern int print_thread_events;
extern void print_thread_info (struct ui_out *uiout, int thread); extern void print_thread_info (struct ui_out *uiout, int thread);
extern struct cleanup *make_cleanup_restore_current_thread (ptid_t,
struct frame_id);
#endif /* GDBTHREAD_H */ #endif /* GDBTHREAD_H */

View File

@ -61,8 +61,6 @@ static void info_threads_command (char *, int);
static void thread_apply_command (char *, int); static void thread_apply_command (char *, int);
static void restore_current_thread (ptid_t); static void restore_current_thread (ptid_t);
static void prune_threads (void); static void prune_threads (void);
static struct cleanup *make_cleanup_restore_current_thread (ptid_t,
struct frame_id);
void void
delete_step_resume_breakpoint (void *arg) delete_step_resume_breakpoint (void *arg)
@ -570,7 +568,7 @@ do_restore_current_thread_cleanup (void *arg)
xfree (old); xfree (old);
} }
static struct cleanup * 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 frame_id a_frame_id)
{ {

View File

@ -31,6 +31,8 @@
#include "varobj.h" #include "varobj.h"
#include "vec.h" #include "vec.h"
#include "gdbthread.h"
#include "inferior.h"
/* Non-zero if we want to see trace of varobj level stuff. */ /* Non-zero if we want to see trace of varobj level stuff. */
@ -1111,7 +1113,6 @@ varobj_update (struct varobj **varp, struct varobj ***changelist,
struct value *new; struct value *new;
VEC (varobj_p) *stack = NULL; VEC (varobj_p) *stack = NULL;
VEC (varobj_p) *result = NULL; VEC (varobj_p) *result = NULL;
struct frame_id old_fid;
struct frame_info *fi; struct frame_info *fi;
/* sanity check: have we been passed a pointer? */ /* sanity check: have we been passed a pointer? */
@ -1130,10 +1131,6 @@ varobj_update (struct varobj **varp, struct varobj ***changelist,
if ((*varp)->root->rootvar == *varp) if ((*varp)->root->rootvar == *varp)
{ {
/* Save the selected stack frame, since we will need to change it
in order to evaluate expressions. */
old_fid = get_frame_id (deprecated_safe_get_selected_frame ());
/* Update the root variable. value_of_root can return NULL /* Update the root variable. value_of_root can return NULL
if the variable is no longer around, i.e. we stepped out of if the variable is no longer around, i.e. we stepped out of
the frame in which a local existed. We are letting the the frame in which a local existed. We are letting the
@ -1141,11 +1138,6 @@ varobj_update (struct varobj **varp, struct varobj ***changelist,
has changed. */ has changed. */
type_changed = 1; type_changed = 1;
new = value_of_root (varp, &type_changed); new = value_of_root (varp, &type_changed);
/* Restore selected frame. */
fi = frame_find_by_id (old_fid);
if (fi)
select_frame (fi);
/* If this is a "use_selected_frame" varobj, and its type has changed, /* If this is a "use_selected_frame" varobj, and its type has changed,
them note that it's changed. */ them note that it's changed. */
@ -2153,12 +2145,15 @@ c_value_of_root (struct varobj **var_handle)
struct varobj *var = *var_handle; struct varobj *var = *var_handle;
struct frame_info *fi; struct frame_info *fi;
int within_scope; int within_scope;
struct cleanup *back_to;
/* Only root variables can be updated... */ /* Only root variables can be updated... */
if (!is_root_p (var)) if (!is_root_p (var))
/* Not a root var */ /* Not a root var */
return NULL; return NULL;
back_to = make_cleanup_restore_current_thread (
inferior_ptid, get_frame_id (deprecated_safe_get_selected_frame ()));
/* Determine whether the variable is still around. */ /* Determine whether the variable is still around. */
if (var->root->valid_block == NULL || var->root->use_selected_frame) if (var->root->valid_block == NULL || var->root->use_selected_frame)
@ -2187,6 +2182,8 @@ c_value_of_root (struct varobj **var_handle)
return new_val; return new_val;
} }
do_cleanups (back_to);
return NULL; return NULL;
} }