This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[RFC: 9/9] Delete context switch references from outside of infrun.c
- From: Pedro Alves <pedro at codesourcery dot com>
- To: gdb-patches at sourceware dot org
- Date: Sat, 16 Aug 2008 16:42:54 +0100
- Subject: [RFC: 9/9] Delete context switch references from outside of infrun.c
This patch does a final cleanup over the code base,
- removing references to context_switch_to from outside of
infrun.c, replacing them with switch_to_thread calls,
as now context_switch is just a wrapper around switch_to_thread.
- gets rid of the now useless and empty save_infrun_state and
load_infrun_state functions in thread.c.
- gets rid of the main_thread_state and main_thread_executing hacks,
since we now assume the main thread is also registered in
the thread list. Gets rid of all code in thread.c that worked
around target that didn't register the main thread.
- Fixes a buglet in the detection of ptid reusing in
add_thread_silent.
--
Pedro Alves
2008-08-16 Pedro Alves <pedro@codesourcery.com>
* inferior.h (context_switch_to): Delete.
* infrun.c (context_switch): Don't save and load infrun state.
(context_switch_to): Delete.
* infcmd.c (proceed_thread_callback): Replace context_switch_to
calls by switch_to_thread calls.
* gdbthread.h (save_infrun_state, load_infrun_state): Delete.
* thread.c (main_thread_state, main_thread_executing): Delete.
(inferior_thread): Delete references to them.
(add_thread_silent): Fix case where we're adding a thread with the
same ptid as an exited thread. Remove references to
context-switching.
(load_infrun_state, save_infrun_state): Delete.
(thread_alive, is_thread_state, any_running, is_executing)
(set_executing): Remove the special handling for targets that
don't register any thread.
(restore_current_thread, thread_apply_all_command)
(do_captured_thread_select): Unconditionally call
switch_to_thread.
* mi/mi-main.c (mi_cmd_execute): Check for exited threads.
Call switch_to_thread instead of context_switch_to.
---
gdb/gdbthread.h | 7 ---
gdb/infcmd.c | 2
gdb/inferior.h | 2
gdb/infrun.c | 31 ---------------
gdb/mi/mi-main.c | 16 +++----
gdb/thread.c | 112 +++++++------------------------------------------------
6 files changed, 25 insertions(+), 145 deletions(-)
Index: src/gdb/inferior.h
===================================================================
--- src.orig/gdb/inferior.h 2008-08-16 16:17:13.000000000 +0100
+++ src/gdb/inferior.h 2008-08-16 16:17:18.000000000 +0100
@@ -132,8 +132,6 @@ extern void clear_proceed_status (void);
extern void proceed (CORE_ADDR, enum target_signal, int);
-extern ptid_t context_switch_to (ptid_t ptid);
-
/* When set, stop the 'step' command if we enter a function which has
no line number information. The normal behavior is that we step
over such function. */
Index: src/gdb/infrun.c
===================================================================
--- src.orig/gdb/infrun.c 2008-08-16 16:17:16.000000000 +0100
+++ src/gdb/infrun.c 2008-08-16 16:17:18.000000000 +0100
@@ -1706,17 +1706,11 @@ nullify_last_target_wait_ptid (void)
target_last_wait_ptid = minus_one_ptid;
}
-/* Switch thread contexts, maintaining "infrun" state. */
+/* Switch thread contexts. */
static void
context_switch (ptid_t ptid)
{
- /* Caution: it may happen that the new thread (or the old one!)
- is not in the thread list. In this case we must not attempt
- to "switch context", or we run the risk that our context may
- be lost. This may happen as a result of the target module
- mishandling thread creation. */
-
if (debug_infrun)
{
fprintf_unfiltered (gdb_stdlog, "infrun: Switching context from %s ",
@@ -1725,32 +1719,9 @@ context_switch (ptid_t ptid)
target_pid_to_str (ptid));
}
- if (in_thread_list (inferior_ptid) && in_thread_list (ptid))
- { /* Perform infrun state context switch: */
- /* Save infrun state for the old thread. */
- save_infrun_state (inferior_ptid);
-
- /* Load infrun state for the new thread. */
- load_infrun_state (ptid);
- }
-
switch_to_thread (ptid);
}
-/* Context switch to thread PTID. */
-ptid_t
-context_switch_to (ptid_t ptid)
-{
- ptid_t current_ptid = inferior_ptid;
-
- /* Context switch to the new thread. */
- if (!ptid_equal (ptid, inferior_ptid))
- {
- context_switch (ptid);
- }
- return current_ptid;
-}
-
static void
adjust_pc_after_break (struct execution_control_state *ecs)
{
Index: src/gdb/infcmd.c
===================================================================
--- src.orig/gdb/infcmd.c 2008-08-16 16:17:16.000000000 +0100
+++ src/gdb/infcmd.c 2008-08-16 16:17:18.000000000 +0100
@@ -598,7 +598,7 @@ proceed_thread_callback (struct thread_i
if (!is_stopped (thread->ptid))
return 0;
- context_switch_to (thread->ptid);
+ switch_to_thread (thread->ptid);
clear_proceed_status ();
proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0);
return 0;
Index: src/gdb/gdbthread.h
===================================================================
--- src.orig/gdb/gdbthread.h 2008-08-16 16:17:16.000000000 +0100
+++ src/gdb/gdbthread.h 2008-08-16 16:17:18.000000000 +0100
@@ -232,13 +232,6 @@ extern struct thread_info *iterate_over_
extern int thread_count (void);
-/* infrun context switch: save the debugger state for the given thread. */
-extern void save_infrun_state (ptid_t ptid);
-
-/* infrun context switch: load the debugger state previously saved
- for the given thread. */
-extern void load_infrun_state (ptid_t ptid);
-
/* Switch from one thread to another. */
extern void switch_to_thread (ptid_t ptid);
Index: src/gdb/thread.c
===================================================================
--- src.orig/gdb/thread.c 2008-08-16 16:17:16.000000000 +0100
+++ src/gdb/thread.c 2008-08-16 16:17:18.000000000 +0100
@@ -71,9 +71,6 @@ enum thread_state
THREAD_EXITED,
};
-static enum thread_state main_thread_state = THREAD_STOPPED;
-static int main_thread_executing = 0;
-
extern struct thread_info*
inferior_thread (void)
{
@@ -130,8 +127,6 @@ init_thread_list (void)
struct thread_info *tp, *tpnext;
highest_thread_num = 0;
- main_thread_state = THREAD_STOPPED;
- main_thread_executing = 0;
if (!thread_list)
return;
@@ -158,12 +153,11 @@ add_thread_silent (ptid_t ptid)
one. */
{
/* In addition to deleting the thread, if this is the current
- thread, then we need to also get rid of the current infrun
- context, and take care that delete_thread doesn't really
- delete the thread if it is inferior_ptid. Create a new
- template thread in the list with an invalid ptid, context
- switch to it, delete the original thread, reset the new
- thread's ptid, and switch to it. */
+ thread, then we need to take care that delete_thread doesn't
+ really delete the thread if it is inferior_ptid. Create a
+ new template thread in the list with an invalid ptid, switch
+ to it, delete the original thread, reset the new thread's
+ ptid, and switch to it. */
if (ptid_equal (inferior_ptid, ptid))
{
@@ -173,14 +167,17 @@ add_thread_silent (ptid_t ptid)
tp->num = ++highest_thread_num;
tp->next = thread_list;
thread_list = tp;
- context_switch_to (minus_one_ptid);
+
+ /* Make switch_to_thread not read from the thread. */
+ tp->state_ = THREAD_EXITED;
+ switch_to_thread (minus_one_ptid);
/* Now we can delete it. */
delete_thread (ptid);
- /* Since the context is already set to this new thread,
- reset its ptid, and reswitch inferior_ptid to it. */
+ /* Now reset its ptid, and reswitch inferior_ptid to it. */
tp->ptid = ptid;
+ tp->state_ = THREAD_STOPPED;
switch_to_thread (ptid);
observer_notify_new_thread (tp);
@@ -442,34 +439,6 @@ gdb_list_thread_ids (struct ui_out *uiou
return GDB_RC_OK;
}
-/* Load infrun state for the thread PID. */
-
-void
-load_infrun_state (ptid_t ptid)
-{
- struct thread_info *tp;
-
- /* If we can't find the thread, then we're debugging a single threaded
- process. No need to do anything in that case. */
- tp = find_thread_id (pid_to_thread_id (ptid));
- if (tp == NULL)
- return;
-}
-
-/* Save infrun state for the thread PID. */
-
-void
-save_infrun_state (ptid_t ptid)
-{
- struct thread_info *tp;
-
- /* If we can't find the thread, then we're debugging a single-threaded
- process. Nothing to do in that case. */
- tp = find_thread_id (pid_to_thread_id (ptid));
- if (tp == NULL)
- return;
-}
-
/* Return true if TP is an active thread. */
static int
thread_alive (struct thread_info *tp)
@@ -508,24 +477,6 @@ set_running (ptid_t ptid, int running)
{
struct thread_info *tp;
- if (!thread_list)
- {
- /* This is one of the targets that does not add main
- thread to the thread list. Just use a single
- global flag to indicate that a thread is running.
-
- This problem is unique to ST programs. For MT programs,
- the main thread is always present in the thread list. If it's
- not, the first call to context_switch will mess up GDB internal
- state. */
- if (running
- && main_thread_state != THREAD_RUNNING
- && !suppress_resume_observer)
- observer_notify_target_resumed (ptid);
- main_thread_state = running ? THREAD_RUNNING : THREAD_STOPPED;
- return;
- }
-
/* We try not to notify the observer if no thread has actually changed
the running state -- merely to reduce the number of messages to
frontend. Frontend is supposed to handle multiple *running just fine. */
@@ -565,9 +516,6 @@ is_thread_state (ptid_t ptid, enum threa
if (!target_has_execution)
return 0;
- if (!thread_list)
- return main_thread_state == state;
-
tp = find_thread_pid (ptid);
gdb_assert (tp);
return tp->state_ == state;
@@ -611,9 +559,6 @@ any_running (void)
if (!target_has_execution)
return 0;
- if (!thread_list)
- return main_thread_state == THREAD_RUNNING;
-
for (tp = thread_list; tp; tp = tp->next)
if (tp->state_ == THREAD_RUNNING)
return 1;
@@ -629,9 +574,6 @@ is_executing (ptid_t ptid)
if (!target_has_execution)
return 0;
- if (!thread_list)
- return main_thread_executing;
-
tp = find_thread_pid (ptid);
gdb_assert (tp);
return tp->executing_;
@@ -642,15 +584,6 @@ set_executing (ptid_t ptid, int executin
{
struct thread_info *tp;
- if (!thread_list)
- {
- /* This target does not add the main thread to the thread list.
- Use a global flag to indicate that the thread is
- executing. */
- main_thread_executing = executing;
- return;
- }
-
if (PIDGET (ptid) == -1)
{
for (tp = thread_list; tp; tp = tp->next)
@@ -805,13 +738,7 @@ switch_to_thread (ptid_t ptid)
static void
restore_current_thread (ptid_t ptid)
{
- if (!ptid_equal (ptid, inferior_ptid))
- {
- if (non_stop)
- context_switch_to (ptid);
- else
- switch_to_thread (ptid);
- }
+ switch_to_thread (ptid);
}
static void
@@ -967,10 +894,7 @@ thread_apply_all_command (char *cmd, int
for (tp = thread_list; tp; tp = tp->next)
if (thread_alive (tp))
{
- if (non_stop)
- context_switch_to (tp->ptid);
- else
- switch_to_thread (tp->ptid);
+ switch_to_thread (tp->ptid);
printf_filtered (_("\nThread %d (%s):\n"),
tp->num, target_tid_to_str (inferior_ptid));
@@ -1040,10 +964,7 @@ thread_apply_command (char *tidlist, int
warning (_("Thread %d has terminated."), start);
else
{
- if (non_stop)
- context_switch_to (tp->ptid);
- else
- switch_to_thread (tp->ptid);
+ switch_to_thread (tp->ptid);
printf_filtered (_("\nThread %d (%s):\n"), tp->num,
target_tid_to_str (inferior_ptid));
@@ -1113,10 +1034,7 @@ do_captured_thread_select (struct ui_out
if (!thread_alive (tp))
error (_("Thread ID %d has terminated."), num);
- if (non_stop)
- context_switch_to (tp->ptid);
- else
- switch_to_thread (tp->ptid);
+ switch_to_thread (tp->ptid);
ui_out_text (uiout, "[Switching to thread ");
ui_out_field_int (uiout, "new-thread-id", pid_to_thread_id (inferior_ptid));
Index: src/gdb/mi/mi-main.c
===================================================================
--- src.orig/gdb/mi/mi-main.c 2008-08-16 16:13:43.000000000 +0100
+++ src/gdb/mi/mi-main.c 2008-08-16 16:17:18.000000000 +0100
@@ -1076,19 +1076,19 @@ mi_cmd_execute (struct mi_parse *parse)
if (parse->frame != -1 && parse->thread == -1)
error (_("Cannot specify --frame without --thread"));
-
+
if (parse->thread != -1)
{
struct thread_info *tp = find_thread_id (parse->thread);
if (!tp)
error (_("Invalid thread id: %d"), parse->thread);
-
- if (non_stop)
- context_switch_to (tp->ptid);
- else
- switch_to_thread (tp->ptid);
+
+ if (is_exited (tp->ptid))
+ error (_("Thread id: %d has terminated"), parse->thread);
+
+ switch_to_thread (tp->ptid);
}
-
+
if (parse->frame != -1)
{
struct frame_info *fid;
@@ -1100,7 +1100,7 @@ mi_cmd_execute (struct mi_parse *parse)
else
error (_("Invalid frame id: %d"), frame);
}
-
+
if (parse->cmd->argv_func != NULL)
{
if (target_can_async_p ()