summaryrefslogtreecommitdiff
path: root/linuxthreads_db
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2002-07-15 23:37:22 +0000
committerUlrich Drepper <drepper@redhat.com>2002-07-15 23:37:22 +0000
commit706d1dee4692cc5419275fcddc4518933ff2a39e (patch)
treec795b0e8236092f2345ac7803181e41c13c5427c /linuxthreads_db
parentc3da4f0cba685e6918d2babb286bd731ae7eab71 (diff)
Update.
2002-07-15 Ulrich Drepper <drepper@redhat.com> * libio/wfileops.c (_IO_wfile_seekoff): Reposition wide pointers and adjust state for seek position. [PR libc/4070] * libio/Makefile (tests): Add bug-rewind. * libio/bug-rewind.c: New file.
Diffstat (limited to 'linuxthreads_db')
-rw-r--r--linuxthreads_db/ChangeLog8
-rw-r--r--linuxthreads_db/td_ta_map_id2thr.c14
-rw-r--r--linuxthreads_db/td_ta_map_lwp2thr.c11
-rw-r--r--linuxthreads_db/td_ta_thr_iter.c31
-rw-r--r--linuxthreads_db/td_thr_get_info.c19
5 files changed, 75 insertions, 8 deletions
diff --git a/linuxthreads_db/ChangeLog b/linuxthreads_db/ChangeLog
index c5cbfba126..774afe6e2a 100644
--- a/linuxthreads_db/ChangeLog
+++ b/linuxthreads_db/ChangeLog
@@ -1,3 +1,11 @@
+2002-07-14 Ulrich Drepper <drepper@redhat.com>
+
+ * td_ta_map_id2thr.c: Begin fixing implementation for libpthread with
+ TLS support.
+ * td_ta_map_lwp2thr.c: Likewise.
+ * td_ta_thr_iter.c: Likewise.
+ * td_thr_get_info.c: Likewise.
+
2002-07-10 Ulrich Drepper <drepper@redhat.com>
* Versions [libthread_db] (GLIBC_2.3): Add td_thr_tls_get_addr.
diff --git a/linuxthreads_db/td_ta_map_id2thr.c b/linuxthreads_db/td_ta_map_id2thr.c
index e6be74ff19..ddeb2d3c4a 100644
--- a/linuxthreads_db/td_ta_map_id2thr.c
+++ b/linuxthreads_db/td_ta_map_id2thr.c
@@ -45,7 +45,19 @@ td_ta_map_id2thr (const td_thragent_t *ta, pthread_t pt, td_thrhandle_t *th)
/* Test whether this entry is in use. */
if (phc.h_descr == NULL)
- return TD_BADTH;
+ {
+ if (pt % pthread_threads_max == 0)
+ {
+ /* The initial thread always exists but the thread library
+ might not yet be initialized. */
+ th->th_ta_p = (td_thragent_t *) ta;
+ th->th_unique = NULL;
+
+ return TD_OK;
+ }
+
+ return TD_BADTH;
+ }
/* Next test: get the descriptor to see whether this is not an old
thread handle. */
diff --git a/linuxthreads_db/td_ta_map_lwp2thr.c b/linuxthreads_db/td_ta_map_lwp2thr.c
index 1fc614cc21..dd2fcbfe4e 100644
--- a/linuxthreads_db/td_ta_map_lwp2thr.c
+++ b/linuxthreads_db/td_ta_map_lwp2thr.c
@@ -76,7 +76,16 @@ td_ta_map_lwp2thr (const td_thragent_t *ta, lwpid_t lwpid, td_thrhandle_t *th)
return TD_OK;
}
- }
+ }
+ else if (cnt == 0)
+ {
+ /* The initial thread always exists. But it might not yet be
+ initialized. Construct a value. */
+ th->th_ta_p = (td_thragent_t *) ta;
+ th->th_unique = NULL;
+
+ return TD_OK;
+ }
return TD_NOLWP;
}
diff --git a/linuxthreads_db/td_ta_thr_iter.c b/linuxthreads_db/td_ta_thr_iter.c
index 7d7085870f..977711261e 100644
--- a/linuxthreads_db/td_ta_thr_iter.c
+++ b/linuxthreads_db/td_ta_thr_iter.c
@@ -31,6 +31,37 @@ handle_descr (const td_thragent_t *ta, td_thr_iter_f *callback,
size_t sizeof_descr = ta->sizeof_descr;
td_thrhandle_t th;
+ if (descr == NULL)
+ {
+ /* No descriptor (yet). */
+ if (cnt == 0)
+ {
+ /* This is the main thread. Create a fake descriptor. */
+ memset (&pds, '\0', sizeof (pds));
+
+ /* Empty thread descriptor the thread library would create. */
+ pds.p_header.data.self = &pds;
+ pds.p_nextlive = pds.p_prevlive = &pds;
+ pds.p_tid = PTHREAD_THREADS_MAX;
+ /* The init code also sets up p_lock, p_errnop, p_herrnop, and
+ p_userstack but this should not be necessary here. */
+
+ th.th_ta_p = (td_thragent_t *) ta;
+ th.th_unique = &pds;
+ if (callback (&th, cbdata_p) != 0)
+ return TD_DBERR;
+
+ /* All done successfully. */
+ return TD_OK;
+ }
+ else if (cnt == 1)
+ /* The manager is not yet started. No big deal. */
+ return TD_OK;
+ else
+ /* For every other thread this should not happen. */
+ return TD_ERR;
+ }
+
if (ps_pdread (ta->ph, descr, &pds, sizeof_descr) != PS_OK)
return TD_ERR; /* XXX Other error value? */
diff --git a/linuxthreads_db/td_thr_get_info.c b/linuxthreads_db/td_thr_get_info.c
index b479170783..4666bda976 100644
--- a/linuxthreads_db/td_thr_get_info.c
+++ b/linuxthreads_db/td_thr_get_info.c
@@ -1,5 +1,5 @@
/* Get thread information.
- Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
@@ -31,10 +31,17 @@ td_thr_get_info (const td_thrhandle_t *th, td_thrinfo_t *infop)
LOG ("td_thr_get_info");
- /* Get the thread descriptor. */
- if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
- th->th_ta_p->sizeof_descr) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
+ /* Handle the case when the thread library is not yet initialized. */
+ if (th->th_unique == NULL)
+ {
+ memset (&pds, '\0', sizeof (pds));
+ pds.p_tid = PTHREAD_THREADS_MAX;
+ }
+ else
+ /* Get the thread descriptor. */
+ if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+ th->th_ta_p->sizeof_descr) != PS_OK)
+ return TD_ERR; /* XXX Other error value? */
/* Fill in information. Clear first to provide reproducable
results for the fields we do not fill in. */
@@ -54,7 +61,7 @@ td_thr_get_info (const td_thrhandle_t *th, td_thrinfo_t *infop)
infop->ti_tls = (char *) pds.p_specific;
infop->ti_pri = pds.p_priority;
infop->ti_type = TD_THR_USER;
-
+
if (! pds.p_terminated)
/* XXX For now there is no way to get more information. */
infop->ti_state = TD_THR_ACTIVE;