PERFORCE change 57771 for review
David Xu
davidxu at FreeBSD.org
Tue Jul 20 00:57:01 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=57771
Change 57771 by davidxu at davidxu_celeron on 2004/07/20 07:56:28
Don't forget to unbind the temporarily bound thread.
Affected files ...
.. //depot/projects/davidxu_ksedbg/src/gnu/usr.bin/gdb/libgdb/fbsd-threads.c#16 edit
Differences ...
==== //depot/projects/davidxu_ksedbg/src/gnu/usr.bin/gdb/libgdb/fbsd-threads.c#16 (text+ko) ====
@@ -72,6 +72,8 @@
/* The last thread we are single stepping */
static lwpid_t last_single_step_lwp;
+static ptid_t last_single_step_ptid;
+
/* Pointers to the libthread_db functions. */
static td_err_e (*td_init_p) (void);
@@ -115,6 +117,7 @@
/* Prototypes for local functions. */
static void fbsd_thread_find_new_threads (void);
+static int fbsd_thread_alive (ptid_t ptid);
/* Building process ids. */
@@ -409,6 +412,26 @@
work_ptid = inferior_ptid;
}
+ /*
+ * For KSE thread, if last time we were single stepping
+ * a thread, first we unbind thread because we had bound it,
+ * may rebind it in following code.
+ */
+ if (!ptid_equal(last_single_step_ptid, null_ptid))
+ {
+ ret = td_ta_map_id2thr_p (thread_agent,
+ GET_THREAD(last_single_step_ptid), &th);
+ if (ret == TD_OK)
+ {
+ /*
+ * keep stepping flag (may be cleared in following code),
+ * but unbind the thread
+ */
+ td_thr_sstep_p (&th, 1);
+ }
+ last_single_step_ptid = null_ptid;
+ }
+
lwp = GET_LWP (work_ptid);
if (lwp == 0)
{
@@ -418,13 +441,13 @@
error (thread_db_err_str (ret));
/*
- * For M:N thread, we need to tell UTS to set/unset single step
+ * For KSE thread, we need to tell UTS to set/unset single step
* flag at context switch time, the flag will be written into
* thread mailbox. This becauses some architecture may not have
* machine single step flag in ucontext, so we put the flag in mailbox,
* when the thread switches back, kse_switchin restores the single step
* state.
- */
+ */
ret = td_thr_sstep_p (&th, resume_all ? step : 2);
if (ret)
error (thread_db_err_str (ret));
@@ -432,6 +455,8 @@
if (ret)
error (thread_db_err_str (ret));
lwp = ti.ti_lid;
+ if (!resume_all)
+ last_single_step_ptid = work_ptid;
}
if (!resume_all && lwp == 0)
@@ -457,6 +482,14 @@
free (lwps);
}
+ /*
+ * FIX ME! if we can let PT_CONTINUE continue a single lwp,
+ * we needn't to iterate through lwp list to suspend/resume them,
+ * we just let the lwp run, this frees PT_SUSPEND PT_RESUME to user,
+ * so td_thr_dbsuspend/resume can be used to suspend or resume
+ * thread by user on command line...
+ */
+
int i;
if (last_single_step_lwp != 0)
{
@@ -483,10 +516,9 @@
last_single_step_lwp = 0;
free (lwps);
-/* ret = ptrace(PT_RESUME, lwp, 0, 0); */
/* now continue the process, suspended thread wont run */
- if (ptrace (PT_CONTINUE, proc_handle.pid , (caddr_t)1,
+ if (ptrace (PT_CONTINUE, proc_handle.pid, (caddr_t)1,
target_signal_to_host(signo)))
perror_with_name ("PT_CONTINUE");
}
More information about the p4-projects
mailing list