X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbthread.h;h=cd24eaf2fb08e57aae782c55caa635b3cfb0e95b;hb=080017175b5248f1e5b0d48a55a06634244db459;hp=82f12587df5978f03f7b17782030d4cfb9e51c76;hpb=347bddb745acda8fb591511a547e66bbe00d768b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h index 82f12587df..cd24eaf2fb 100644 --- a/gdb/gdbthread.h +++ b/gdb/gdbthread.h @@ -1,6 +1,6 @@ /* Multi-process/thread control defs for GDB, the GNU debugger. Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1997, 1998, 1999, - 2000, 2007, 2008 Free Software Foundation, Inc. + 2000, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by Lynx Real-Time Systems, Inc. Los Gatos, CA. @@ -83,6 +83,11 @@ struct thread_info This is how we know when we step into a subroutine call, and how to set the frame for the breakpoint used to step out. */ struct frame_id step_frame_id; + + /* Similarly, the frame ID of the underlying stack frame (skipping + any inlined frames). */ + struct frame_id step_stack_frame_id; + int current_line; struct symtab *current_symtab; @@ -136,23 +141,56 @@ struct thread_info when we finally do stop stepping. */ bpstat stepping_through_solib_catchpoints; - /* The below are only per-thread in non-stop mode. */ /* Per-thread command support. */ + + /* Pointer to what is left to do for an execution command after the + target stops. Used only in asynchronous mode, by targets that + support async execution. Several execution commands use it. */ struct continuation *continuations; + + /* Similar to the above, but used when a single execution command + requires several resume/stop iterations. Used by the step + command. */ struct continuation *intermediate_continuations; + + /* Nonzero if the thread is being proceeded for a "finish" command + or a similar situation when stop_registers should be saved. */ int proceed_to_finish; + + /* Nonzero if the thread is being proceeded for an inferior function + call. */ + int in_infcall; + enum step_over_calls_kind step_over_calls; + + /* Nonzero if stopped due to a step command. */ int stop_step; + + /* If stepping, nonzero means step count is > 1 so don't print frame + next time inferior stops if it stops due to stepping. */ int step_multi; + /* This is used to remember when a fork or vfork event was caught by + a catchpoint, and thus the event is to be followed at the next + resume of the thread, and not immediately. */ + struct target_waitstatus pending_follow; + + /* Last signal that the inferior received (why it stopped). */ enum target_signal stop_signal; /* Chain containing status of breakpoint(s) the thread stopped at. */ bpstat stop_bpstat; + /* True if this thread has been explicitly requested to stop. */ + int stop_requested; + /* Private data used by the target vector implementation. */ struct private_thread_info *private; + + /* Function that is called to free PRIVATE. If this is NULL, then + xfree will be called on PRIVATE. */ + void (*private_dtor) (struct private_thread_info *); }; /* Create an empty thread list, or empty the existing one. */ @@ -200,11 +238,22 @@ extern int in_thread_list (ptid_t ptid); extern int valid_thread_id (int thread); /* Search function to lookup a thread by 'pid'. */ -extern struct thread_info *find_thread_pid (ptid_t ptid); +extern struct thread_info *find_thread_ptid (ptid_t ptid); /* Find thread by GDB user-visible thread number. */ struct thread_info *find_thread_id (int num); +/* Finds the first thread of the inferior given by PID. If PID is -1, + returns the first thread in the list. */ +struct thread_info *first_thread_of_process (int pid); + +/* Returns any thread of process PID. */ +extern struct thread_info *any_thread_of_process (int pid); + +/* Returns any non-exited thread of process PID, giving preference for + already stopped threads. */ +extern struct thread_info *any_live_thread_of_process (int pid); + /* Change the ptid of thread OLD_PTID to NEW_PTID. */ void thread_change_ptid (ptid_t old_ptid, ptid_t new_ptid); @@ -215,25 +264,6 @@ extern struct thread_info *iterate_over_threads (thread_callback_func, void *); extern int thread_count (void); -/* infrun context switch: save the debugger state for the given thread. */ -extern void save_infrun_state (ptid_t ptid, - struct continuation *continuations, - struct continuation *intermediate_continuations, - int proceed_to_finish, - int stop_step, - int step_multi, - enum target_signal stop_signal); - -/* infrun context switch: load the debugger state previously saved - for the given thread. */ -extern void load_infrun_state (ptid_t ptid, - struct continuation **continuations, - struct continuation **intermediate_continuations, - int *proceed_to_finish, - int *stop_step, - int *step_multi, - enum target_signal *stop_signal); - /* Switch from one thread to another. */ extern void switch_to_thread (ptid_t ptid); @@ -241,6 +271,13 @@ extern void switch_to_thread (ptid_t ptid); If PIDGET (PTID) is -1, marks all threads. */ extern void set_running (ptid_t ptid, int running); +/* Marks or clears thread(s) PTID as having been requested to stop. + If PTID is MINUS_ONE_PTID, applies to all threads. If + ptid_is_pid(PTID) is true, applies to all threads of the process + pointed at by PTID. If STOP, then the THREAD_STOP_REQUESTED + observer is called with PTID as argument. */ +extern void set_stop_requested (ptid_t ptid, int stop); + /* NOTE: Since the thread state is not a boolean, most times, you do not want to check it with negation. If you really want to check if the thread is stopped, @@ -280,6 +317,23 @@ extern void set_executing (ptid_t ptid, int executing); /* Reports if thread PTID is executing. */ extern int is_executing (ptid_t ptid); +/* Merge the executing property of thread PTID over to its thread + state property (frontend running/stopped view). + + "not executing" -> "stopped" + "executing" -> "running" + "exited" -> "exited" + + If PIDGET (PTID) is -1, go over all threads. + + Notifications are only emitted if the thread state did change. */ +extern void finish_thread_state (ptid_t ptid); + +/* Same as FINISH_THREAD_STATE, but with an interface suitable to be + registered as a cleanup. PTID_P points to the ptid_t that is + passed to FINISH_THREAD_STATE. */ +extern void finish_thread_state_cleanup (void *ptid_p); + /* Commands with a prefix of `thread'. */ extern struct cmd_list_element *thread_cmd_list; @@ -287,7 +341,8 @@ extern struct cmd_list_element *thread_cmd_list; `set print thread-events'. */ 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, + int pid); extern struct cleanup *make_cleanup_restore_current_thread (void); @@ -295,4 +350,6 @@ extern struct cleanup *make_cleanup_restore_current_thread (void); INFERIOR_PTID. INFERIOR_PTID *must* be in the thread list. */ extern struct thread_info* inferior_thread (void); +extern void update_thread_list (void); + #endif /* GDBTHREAD_H */