* infrun.c (start_remote): Don't clear thread list here.

* monitor.c (monitor_open): Include "gdbthread.h".  Clear thread
	list here.
	* remote.c (record_currthread): Upgrade the main thread and its
	entry in the thread list if this is the first time we hear about
	threads.
	(remote_thread_alive): Consider magic_null_ptid or a ptid without
	a tid member always alive.
	(remote_find_new_threads): Don't update the main thread here.
	(remote_start_remote): Clear thread list here.  Always add the
	main thread.
	(extended_remote_attach_1): Add the main thread here.
	(extended_remote_mourn_1): Re-add the main thread here.
	(extended_remote_create_inferior_1): Add a main thread.

	* Makefile.in (monitor.o): Depend on $(gdbthread_h).
This commit is contained in:
Pedro Alves
2008-06-27 11:54:21 +00:00
parent 87b0e16e7b
commit c0a2216eb3
5 changed files with 73 additions and 7 deletions

View File

@ -1,3 +1,22 @@
2008-06-27 Pedro Alves <pedro@codesourcery.com>
* infrun.c (start_remote): Don't clear thread list here.
* monitor.c (monitor_open): Include "gdbthread.h". Clear thread
list here.
* remote.c (record_currthread): Upgrade the main thread and its
entry in the thread list if this is the first time we hear about
threads.
(remote_thread_alive): Consider magic_null_ptid or a ptid without
a tid member always alive.
(remote_find_new_threads): Don't update the main thread here.
(remote_start_remote): Clear thread list here. Always add the
main thread.
(extended_remote_attach_1): Add the main thread here.
(extended_remote_mourn_1): Re-add the main thread here.
(extended_remote_create_inferior_1): Add a main thread.
* Makefile.in (monitor.o): Depend on $(gdbthread_h).
2008-06-27 Pedro Alves <pedro@codesourcery.com> 2008-06-27 Pedro Alves <pedro@codesourcery.com>
Use ptid_t.tid to store thread ids instead of ptid_t.pid. Use ptid_t.tid to store thread ids instead of ptid_t.pid.

View File

@ -2540,7 +2540,7 @@ mn10300-tdep.o: mn10300-tdep.c $(defs_h) $(arch_utils_h) $(dis_asm_h) \
$(symtab_h) $(dwarf2_frame_h) $(osabi_h) $(target_h) $(mn10300_tdep_h) $(symtab_h) $(dwarf2_frame_h) $(osabi_h) $(target_h) $(mn10300_tdep_h)
monitor.o: monitor.c $(defs_h) $(gdbcore_h) $(target_h) $(exceptions_h) \ monitor.o: monitor.c $(defs_h) $(gdbcore_h) $(target_h) $(exceptions_h) \
$(gdb_string_h) $(command_h) $(serial_h) $(monitor_h) $(gdbcmd_h) \ $(gdb_string_h) $(command_h) $(serial_h) $(monitor_h) $(gdbcmd_h) \
$(inferior_h) $(gdb_regex_h) $(srec_h) $(regcache_h) $(inferior_h) $(gdb_regex_h) $(srec_h) $(regcache_h) $(gdbthread_h)
mt-tdep.o: mt-tdep.c $(defs_h) $(frame_h) $(frame_unwind_h) $(frame_base_h) \ mt-tdep.o: mt-tdep.c $(defs_h) $(frame_h) $(frame_unwind_h) $(frame_base_h) \
$(symtab_h) $(dis_asm_h) $(arch_utils_h) $(gdbtypes_h) \ $(symtab_h) $(dis_asm_h) $(arch_utils_h) $(gdbtypes_h) \
$(gdb_string_h) $(regcache_h) $(reggroups_h) $(gdbcore_h) \ $(gdb_string_h) $(regcache_h) $(reggroups_h) $(gdbcore_h) \

View File

@ -1281,7 +1281,6 @@ proceed (CORE_ADDR addr, enum target_signal siggnal, int step)
void void
start_remote (int from_tty) start_remote (int from_tty)
{ {
init_thread_list ();
init_wait_for_inferior (); init_wait_for_inferior ();
stop_soon = STOP_QUIETLY_REMOTE; stop_soon = STOP_QUIETLY_REMOTE;
stepping_over_breakpoint = 0; stepping_over_breakpoint = 0;

View File

@ -54,6 +54,7 @@
#include "gdb_regex.h" #include "gdb_regex.h"
#include "srec.h" #include "srec.h"
#include "regcache.h" #include "regcache.h"
#include "gdbthread.h"
static char *dev_name; static char *dev_name;
static struct target_ops *targ_ops; static struct target_ops *targ_ops;
@ -804,6 +805,9 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
push_target (targ_ops); push_target (targ_ops);
/* Start afresh. */
init_thread_list ();
inferior_ptid = pid_to_ptid (42000); /* Make run command think we are busy... */ inferior_ptid = pid_to_ptid (42000); /* Make run command think we are busy... */
/* Give monitor_wait something to read */ /* Give monitor_wait something to read */

View File

@ -1089,7 +1089,31 @@ record_currthread (ptid_t currthread)
/* If this is a new thread, add it to GDB's thread list. /* If this is a new thread, add it to GDB's thread list.
If we leave it up to WFI to do this, bad things will happen. */ If we leave it up to WFI to do this, bad things will happen. */
if (!in_thread_list (currthread)) if (!in_thread_list (currthread))
add_thread (currthread); {
if (ptid_equal (pid_to_ptid (ptid_get_pid (currthread)), inferior_ptid))
{
/* inferior_ptid has no thread member yet. This can happen
with the vAttach -> remote_wait,"TAAthread:" path if the
stub doesn't support qC. This is the first stop reported
after an attach, so this is the main thread. Update the
ptid in the thread list. */
struct thread_info *th = find_thread_pid (inferior_ptid);
inferior_ptid = th->ptid = currthread;
}
else if (ptid_equal (magic_null_ptid, inferior_ptid))
{
/* inferior_ptid is not set yet. This can happen with the
vRun -> remote_wait,"TAAthread:" path if the stub
doesn't support qC. This is the first stop reported
after an attach, so this is the main thread. Update the
ptid in the thread list. */
struct thread_info *th = find_thread_pid (inferior_ptid);
inferior_ptid = th->ptid = currthread;
}
else
/* This is really a new thread. Add it. */
add_thread (currthread);
}
} }
static char *last_pass_packet; static char *last_pass_packet;
@ -1212,6 +1236,16 @@ remote_thread_alive (ptid_t ptid)
struct remote_state *rs = get_remote_state (); struct remote_state *rs = get_remote_state ();
int tid = ptid_get_tid (ptid); int tid = ptid_get_tid (ptid);
if (ptid_equal (ptid, magic_null_ptid))
/* The main thread is always alive. */
return 1;
if (ptid_get_pid (ptid) != 0 && ptid_get_tid (ptid) == 0)
/* The main thread is always alive. This can happen after a
vAttach, if the remote side doesn't support
multi-threading. */
return 1;
if (tid < 0) if (tid < 0)
xsnprintf (rs->buf, get_remote_packet_size (), "T-%08x", -tid); xsnprintf (rs->buf, get_remote_packet_size (), "T-%08x", -tid);
else else
@ -1925,9 +1959,6 @@ remote_find_new_threads (void)
{ {
remote_threadlist_iterator (remote_newthread_step, 0, remote_threadlist_iterator (remote_newthread_step, 0,
CRAZY_MAX_THREADS); CRAZY_MAX_THREADS);
if (ptid_equal (inferior_ptid, magic_null_ptid))
/* We don't know the current thread yet. Query it. */
inferior_ptid = remote_current_thread (inferior_ptid);
} }
/* /*
@ -2289,6 +2320,9 @@ remote_start_remote (struct ui_out *uiout, void *opaque)
strcpy (wait_status, rs->buf); strcpy (wait_status, rs->buf);
} }
/* Start afresh. */
init_thread_list ();
/* Let the stub know that we want it to return the thread. */ /* Let the stub know that we want it to return the thread. */
set_continue_thread (minus_one_ptid); set_continue_thread (minus_one_ptid);
@ -2304,6 +2338,9 @@ remote_start_remote (struct ui_out *uiout, void *opaque)
/* Now, if we have thread information, update inferior_ptid. */ /* Now, if we have thread information, update inferior_ptid. */
inferior_ptid = remote_current_thread (inferior_ptid); inferior_ptid = remote_current_thread (inferior_ptid);
/* Always add the main thread. */
add_thread_silent (inferior_ptid);
get_offsets (); /* Get text, data & bss offsets. */ get_offsets (); /* Get text, data & bss offsets. */
/* Use the previously fetched status. */ /* Use the previously fetched status. */
@ -2934,6 +2971,9 @@ extended_remote_attach_1 (struct target_ops *target, char *args, int from_tty)
/* Now, if we have thread information, update inferior_ptid. */ /* Now, if we have thread information, update inferior_ptid. */
inferior_ptid = remote_current_thread (inferior_ptid); inferior_ptid = remote_current_thread (inferior_ptid);
/* Now, add the main thread to the thread list. */
add_thread_silent (inferior_ptid);
attach_flag = 1; attach_flag = 1;
/* Next, if the target can specify a description, read it. We do /* Next, if the target can specify a description, read it. We do
@ -5152,7 +5192,8 @@ extended_remote_mourn_1 (struct target_ops *target)
/* Assume that the target has been restarted. Set inferior_ptid /* Assume that the target has been restarted. Set inferior_ptid
so that bits of core GDB realizes there's something here, e.g., so that bits of core GDB realizes there's something here, e.g.,
so that the user can say "kill" again. */ so that the user can say "kill" again. */
inferior_ptid = magic_null_ptid; inferior_ptid = remote_current_thread (magic_null_ptid);
add_thread_silent (inferior_ptid);
} }
else else
{ {
@ -5267,6 +5308,9 @@ extended_remote_create_inferior_1 (char *exec_file, char *args,
/* Now mark the inferior as running before we do anything else. */ /* Now mark the inferior as running before we do anything else. */
attach_flag = 0; attach_flag = 0;
inferior_ptid = magic_null_ptid; inferior_ptid = magic_null_ptid;
add_thread_silent (inferior_ptid);
target_mark_running (&extended_remote_ops); target_mark_running (&extended_remote_ops);
/* Get updated offsets, if the stub uses qOffsets. */ /* Get updated offsets, if the stub uses qOffsets. */