1999-10-13  Ulrich Drepper  <drepper@cygnus.com>

	* td_ta_thr_iter.c: Use size of descriptor from *TA.
	Don't return manager thread before it's actually running.
	Actually use state parameter to distingusih at least a few states.

	* td_thr_get_info.c: Handle manager thread special.  Fill in ti_lid,
	ti_state fields, and ti_startfunc fields.
This commit is contained in:
Ulrich Drepper 1999-10-14 00:40:29 +00:00
parent 252470b60f
commit 00e50680b1
4 changed files with 60 additions and 16 deletions

View File

@ -1,3 +1,12 @@
1999-10-13 Ulrich Drepper <drepper@cygnus.com>
* td_ta_thr_iter.c: Use size of descriptor from *TA.
Don't return manager thread before it's actually running.
Actually use state parameter to distingusih at least a few states.
* td_thr_get_info.c: Handle manager thread special. Fill in ti_lid,
ti_state fields, and ti_startfunc fields.
1999-10-12 Ulrich Drepper <drepper@cygnus.com> 1999-10-12 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/linux/i386/sys/ucontext.h: Don't define * sysdeps/unix/sysv/linux/i386/sys/ucontext.h: Don't define

View File

@ -1,3 +1,12 @@
1999-10-13 Ulrich Drepper <drepper@cygnus.com>
* td_ta_thr_iter.c: Use size of descriptor from *TA.
Don't return manager thread before it's actually running.
Actually use state parameter to distingusih at least a few states.
* td_thr_get_info.c: Handle manager thread special. Fill in ti_lid,
ti_state fields, and ti_startfunc fields.
1999-10-12 Andreas Jaeger <aj@suse.de> 1999-10-12 Andreas Jaeger <aj@suse.de>
* thread_dbP.h: Include <string.h> for strlen declaration. Remove * thread_dbP.h: Include <string.h> for strlen declaration. Remove

View File

@ -28,6 +28,7 @@ td_ta_thr_iter (const td_thragent_t *ta, td_thr_iter_f *callback,
{ {
struct pthread_handle_struct *handles = ta->handles; struct pthread_handle_struct *handles = ta->handles;
int pthread_threads_max = ta->pthread_threads_max; int pthread_threads_max = ta->pthread_threads_max;
size_t sizeof_descr = ta->sizeof_descr;
int cnt; int cnt;
LOG (__FUNCTION__); LOG (__FUNCTION__);
@ -46,10 +47,16 @@ td_ta_thr_iter (const td_thragent_t *ta, td_thr_iter_f *callback,
struct _pthread_descr_struct pds; struct _pthread_descr_struct pds;
td_thrhandle_t th; td_thrhandle_t th;
if (ps_pdread (ta->ph, phc.h_descr, &pds, if (ps_pdread (ta->ph, phc.h_descr, &pds, sizeof_descr) != PS_OK)
sizeof (struct _pthread_descr_struct)) != PS_OK)
return TD_ERR; /* XXX Other error value? */ return TD_ERR; /* XXX Other error value? */
/* The manager thread must be handled special. The descriptor
exists but the thread only gets created when the first
`pthread_create' call is issued. A clear indication that
this happened is when the p_pid field is non-zero. */
if (cnt == 1 && pds.p_pid == 0)
continue;
/* Now test whether this thread matches the specified /* Now test whether this thread matches the specified
conditions. */ conditions. */
@ -57,6 +64,13 @@ td_ta_thr_iter (const td_thragent_t *ta, td_thr_iter_f *callback,
if (pds.p_priority < ti_pri) if (pds.p_priority < ti_pri)
continue; continue;
/* Test the state.
XXX This is incomplete. */
if (state != TD_THR_ANY_STATE
&& (state != TD_THR_ZOMBIE || pds.p_exited == 0)
&& (state != TD_THR_RUN || pds.p_exited != 0))
continue;
/* Yep, it matches. Call the callback function. */ /* Yep, it matches. Call the callback function. */
th.th_ta_p = (td_thragent_t *) ta; th.th_ta_p = (td_thragent_t *) ta;
th.th_unique = phc.h_descr; th.th_unique = phc.h_descr;

View File

@ -39,21 +39,33 @@ td_thr_get_info (const td_thrhandle_t *th, td_thrinfo_t *infop)
results for the fields we do not fill in. */ results for the fields we do not fill in. */
memset (infop, '\0', sizeof (td_thrinfo_t)); memset (infop, '\0', sizeof (td_thrinfo_t));
/* We have to handle the manager thread special since the thread
descriptor in older versions is not fully initialized. */
if (pds.p_nr == 1)
{
infop->ti_ta_p = th->th_ta_p;
infop->ti_tid = th->th_ta_p->pthread_threads_max * 2 + 1;
infop->ti_lid = pds.p_pid;
infop->ti_type = TD_THR_SYSTEM;
infop->ti_state = TD_THR_RUN;
}
else
{
infop->ti_ta_p = th->th_ta_p; infop->ti_ta_p = th->th_ta_p;
infop->ti_tid = pds.p_tid; infop->ti_tid = pds.p_tid;
infop->ti_lid = pds.p_pid;
infop->ti_tls = (char *) pds.p_specific; infop->ti_tls = (char *) pds.p_specific;
infop->ti_pri = pds.p_priority; infop->ti_pri = pds.p_priority;
/* The first thread (0 being the initial one) is the manager thread infop->ti_type = TD_THR_USER;
Mark it appropriately. */
infop->ti_type = ((pds.p_tid % th->th_ta_p->pthread_threads_max) == 1
? TD_THR_SYSTEM : TD_THR_USER);
/* We can get the following information only if the thread descriptor if (pds.p_exited)
in the target processor is large enough, i.e., comes from a recent infop->ti_state = TD_THR_ZOMBIE;
enough library. */ else
if (offsetof (struct _pthread_descr_struct, p_startfct) /* XXX For now there is no way to get more information. */
< th->th_ta_p->sizeof_descr) infop->ti_state = TD_THR_RUN;
infop->ti_startfunc = pds.p_startfct;
infop->ti_startfunc = pds.p_start_args.start_routine;
}
return TD_OK; return TD_OK;
} }