2008-03-21 Daniel Jacobowitz <dan@codesourcery.com>

* gdbthread.h (add_thread_with_info): New.
	* linux-thread-db.c: Add some documentation.
	(GET_LWP, GET_PID, GET_THREAD, is_lwp, is_thread, BUILD_LWP): Delete.
	(struct private_thread_info): Remove th_valid and ti_valid.
	Replace ti with tid.
	(thread_get_info_callback): Do not add TID to the new ptid.  Do
	not cache th or ti.
	(thread_db_map_id2thr, lwp_from_thread): Delete functions.
	(thread_from_lwp): Assert that the LWP is set.  Do not add TID to the
	new PTID.
	(attach_thread): Handle an already-existing thread.  Use
	add_thread_with_info.  Cache the th and tid.
	(detach_thread): Verify that private was set.  Remove verbose
	argument and printing.  Update caller.
	(thread_db_detach): Do not adjust inferior_ptid.
	(clear_lwpid_callback, thread_db_resume, thread_db_kill): Delete.
	(check_event, find_new_threads_callback): Do not add TID to the new PTID.
	(thread_db_wait): Do not use lwp_from_thread.
	(thread_db_pid_to_str): Use the cached TID.
	(thread_db_extra_thread_info): Check that private is set.
	(same_ptid_callback): Delete.
	(thread_db_get_thread_local_address): Do not use it or check
	is_thread.  Check that private is set.  Assume that the thread
	handle is already cached.
	(init_thread_db_ops): Remove to_resume and to_kill.
	* thread.c (add_thread_with_info): New.
	(add_thread): Use it.
	* linux-nat.c (find_thread_from_lwp): Delete.
	(exit_lwp): Do not use it.  Check print_thread_events.  Print before
	deleting the thread.
	(GET_PID, GET_LWP, BUILD_LWP, is_lwp): Move to...
	* linux-nat.h (GET_PID, GET_LWP, BUILD_LWP, is_lwp): ...here.
	* inf-ttrace.c (inf_ttrace_wait): Use print_thread_events and
	printf_unfiltered for thread exits.
	* procfs.c (procfs_wait): Likewise.

2008-03-21  Pedro Alves  <pedro@codesourcery.com>

	* gdb.threads/fork-child-threads.exp: Test next over fork.
This commit is contained in:
Daniel Jacobowitz
2008-03-21 15:44:53 +00:00
parent 93f9b40865
commit 17faa917e0
10 changed files with 167 additions and 215 deletions

View File

@ -588,11 +588,6 @@ struct lwp_info *lwp_list;
static int num_lwps;
#define GET_LWP(ptid) ptid_get_lwp (ptid)
#define GET_PID(ptid) ptid_get_pid (ptid)
#define is_lwp(ptid) (GET_LWP (ptid) != 0)
#define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
/* If the last reported event was a SIGTRAP, this variable is set to
the process id of the LWP/thread that got it. */
ptid_t trap_ptid;
@ -813,20 +808,6 @@ prune_lwps (void)
p = &(*p)->next;
}
/* Callback for iterate_over_threads that finds a thread corresponding
to the given LWP. */
static int
find_thread_from_lwp (struct thread_info *thr, void *dummy)
{
ptid_t *ptid_p = dummy;
if (GET_LWP (thr->ptid) && GET_LWP (thr->ptid) == GET_LWP (*ptid_p))
return 1;
else
return 0;
}
/* Handle the exit of a single thread LP. */
static void
@ -834,32 +815,14 @@ exit_lwp (struct lwp_info *lp)
{
if (in_thread_list (lp->ptid))
{
if (print_thread_events)
printf_unfiltered (_("[%s exited]\n"), target_pid_to_str (lp->ptid));
/* Core GDB cannot deal with us deleting the current thread. */
if (!ptid_equal (lp->ptid, inferior_ptid))
delete_thread (lp->ptid);
else
record_dead_thread (lp->ptid);
printf_unfiltered (_("[%s exited]\n"),
target_pid_to_str (lp->ptid));
}
else
{
/* Even if LP->PTID is not in the global GDB thread list, the
LWP may be - with an additional thread ID. We don't need
to print anything in this case; thread_db is in use and
already took care of that. But it didn't delete the thread
in order to handle zombies correctly. */
struct thread_info *thr;
thr = iterate_over_threads (find_thread_from_lwp, &lp->ptid);
if (thr)
{
if (!ptid_equal (thr->ptid, inferior_ptid))
delete_thread (thr->ptid);
else
record_dead_thread (thr->ptid);
}
}
delete_lwp (lp->ptid);