summaryrefslogtreecommitdiff
path: root/linuxthreads_db/td_ta_map_lwp2thr.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-11-05 02:26:16 +0000
committerUlrich Drepper <drepper@redhat.com>1999-11-05 02:26:16 +0000
commit9532eb67a4a92baab960d8d37bfa28048285dabb (patch)
tree179887a0e1239d9aebb41cffb1134f019712b56b /linuxthreads_db/td_ta_map_lwp2thr.c
parentab86fbb1d2866df567219904982dac61751808e5 (diff)
Update.
1999-11-03 Ulrich Drepper <drepper@cygnus.com> * Versions.def: Add version for libthread_db.
Diffstat (limited to 'linuxthreads_db/td_ta_map_lwp2thr.c')
-rw-r--r--linuxthreads_db/td_ta_map_lwp2thr.c69
1 files changed, 44 insertions, 25 deletions
diff --git a/linuxthreads_db/td_ta_map_lwp2thr.c b/linuxthreads_db/td_ta_map_lwp2thr.c
index 995620f023..f51bc18f16 100644
--- a/linuxthreads_db/td_ta_map_lwp2thr.c
+++ b/linuxthreads_db/td_ta_map_lwp2thr.c
@@ -24,38 +24,57 @@
td_err_e
td_ta_map_lwp2thr (const td_thragent_t *ta, lwpid_t lwpid, td_thrhandle_t *th)
{
- struct pthread_handle_struct *handles = ta->handles;
int pthread_threads_max = ta->pthread_threads_max;
+ size_t sizeof_descr = ta->sizeof_descr;
+ struct pthread_handle_struct phc[pthread_threads_max];
size_t cnt;
+#ifdef ALL_THREADS_STOPPED
+ int num;
+#else
+# define num 1
+#endif
LOG (__FUNCTION__);
+ /* Test whether the TA parameter is ok. */
+ if (! ta_ok (ta))
+ return TD_BADTA;
+
+ /* Read all the descriptors. */
+ if (ps_pdread (ta->ph, ta->handles, phc,
+ sizeof (struct pthread_handle_struct) * pthread_threads_max)
+ != PS_OK)
+ return TD_ERR; /* XXX Other error value? */
+
+#ifdef ALL_THREADS_STOPPED
+ /* Read the number of currently active threads. */
+ if (ps_pdread (ta->ph, ta->pthread_handles_num, &num, sizeof (int)) != PS_OK)
+ return TD_ERR; /* XXX Other error value? */
+#endif
+
/* Get the entries one after the other and find out whether the ID
matches. */
- for (cnt = 0; cnt < pthread_threads_max; ++cnt, ++handles)
- {
- struct pthread_handle_struct phc;
- struct _pthread_descr_struct pds;
-
- if (ps_pdread (ta->ph, handles, &phc,
- sizeof (struct pthread_handle_struct)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- if (phc.h_descr != NULL)
- {
- if (ps_pdread (ta->ph, phc.h_descr, &pds,
- sizeof (struct _pthread_descr_struct)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- if (pds.p_pid == lwpid)
- {
- /* Found it. Now fill in the `td_thrhandle_t' object. */
- th->th_ta_p = (td_thragent_t *) ta;
- th->th_unique = phc.h_descr;
-
- return TD_OK;
- }
- }
+ for (cnt = 0; cnt < pthread_threads_max && num > 0; ++cnt)
+ if (phc[cnt].h_descr != NULL)
+ {
+ struct _pthread_descr_struct pds;
+
+#ifdef ALL_THREADS_STOPPED
+ /* First count this active thread. */
+ --num;
+#endif
+
+ if (ps_pdread (ta->ph, phc[cnt].h_descr, &pds, sizeof_descr) != PS_OK)
+ return TD_ERR; /* XXX Other error value? */
+
+ if (pds.p_pid == lwpid)
+ {
+ /* Found it. Now fill in the `td_thrhandle_t' object. */
+ th->th_ta_p = (td_thragent_t *) ta;
+ th->th_unique = phc[cnt].h_descr;
+
+ return TD_OK;
+ }
}
return TD_NOLWP;