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

	* Implies: New file.
	* internals.h (struct _pthread_descr_struct): Add p_startfct.
	* manager.c (pthread_handle_create): Initialize p_startfct.
	* pthread.c: Define __linuxthread_pthread_sizeof_descr variable.
This commit is contained in:
Ulrich Drepper 1999-10-08 07:03:03 +00:00
parent 10507e5595
commit 9640bbe1c1
44 changed files with 1992 additions and 0 deletions

View File

@ -1,3 +1,10 @@
1999-10-07 Ulrich Drepper <drepper@cygnus.com>
* Implies: New file.
* internals.h (struct _pthread_descr_struct): Add p_startfct.
* manager.c (pthread_handle_create): Initialize p_startfct.
* pthread.c: Define __linuxthread_pthread_sizeof_descr variable.
1999-09-25 Ulrich Drepper <drepper@cygnus.com>
* manager.c (__linuxthreads_pthread_threads_max): New variable.

1
linuxthreads/Implies Normal file
View File

@ -0,0 +1 @@
linuxthreads_db

View File

@ -113,6 +113,7 @@ struct _pthread_descr_struct {
size_t p_guardsize; /* size of guard area */
pthread_descr p_self; /* Pointer to this structure */
int p_nr; /* Index of descriptor in __pthread_handles */
void *(*p_startfct) (void *); /* The startup function of this thread. */
} __attribute__ ((aligned(32))); /* We need to align the structure so that
doubles are aligned properly. This is 8
bytes on MIPS and 16 bytes on MIPS64.

View File

@ -342,6 +342,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
new_thread->p_guardsize = guardsize;
new_thread->p_self = new_thread;
new_thread->p_nr = sseg;
new_thread->p_startfct = start_routine;
/* Initialize the thread handle */
__pthread_init_lock(&__pthread_handles[sseg].h_lock);
__pthread_handles[sseg].h_descr = new_thread;

View File

@ -150,6 +150,8 @@ const int __pthread_offsetof_descr = offsetof(struct pthread_handle_struct,
h_descr);
const int __pthread_offsetof_pid = offsetof(struct _pthread_descr_struct,
p_pid);
const int __linuxthread_pthread_sizeof_descr
= sizeof(struct _pthread_descr_struct);
/* These variables are used by the setup code. */
extern int _errno;

41
linuxthreads_db/ChangeLog Normal file
View File

@ -0,0 +1,41 @@
1999-10-07 Ulrich Drepper <drepper@cygnus.com>
* Makefile: New file.
* proc_service.h: New file.
* shlib-versions: New file.
* td_init.c: New file.
* td_log.c: New file.
* td_ta_delete.c: New file.
* td_ta_enable_stats.c: New file.
* td_ta_event_addr.c: New file.
* td_ta_get_nthreads.c: New file.
* td_ta_get_ph.c: New file.
* td_ta_get_stats.c: New file.
* td_ta_map_id2thr.c: New file.
* td_ta_map_lwp2thr.c: New file.
* td_ta_new.c: New file.
* td_ta_reset_stats.c: New file.
* td_ta_setconcurrency.c: New file.
* td_ta_thr_iter.c: New file.
* td_ta_tsd_iter.c: New file.
* td_thr_clear_event.c: New file.
* td_thr_dbresume.c: New file.
* td_thr_dbsuspend.c: New file.
* td_thr_event_enable.c: New file.
* td_thr_event_getmsg.c: New file.
* td_thr_get_info.c: New file.
* td_thr_getfpregs.c: New file.
* td_thr_getgregs.c: New file.
* td_thr_getxregs.c: New file.
* td_thr_getxregsize.c: New file.
* td_thr_set_event.c: New file.
* td_thr_setfpregs.c: New file.
* td_thr_setgregs.c: New file.
* td_thr_setprio.c: New file.
* td_thr_setsigpending.c: New file.
* td_thr_setxregs.c: New file.
* td_thr_sigsetmask.c: New file.
* td_thr_tsd.c: New file.
* td_thr_validate.c: New file.
* thread_db.h: New file.
* thread_dbP.h: New file.

49
linuxthreads_db/Makefile Normal file
View File

@ -0,0 +1,49 @@
# Copyright (C) 1999 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Library General Public License for more details.
# You should have received a copy of the GNU Library General Public
# License along with the GNU C Library; see the file COPYING.LIB. If not,
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
# Makefile for linuxthreads debug library subdirectory of GNU C Library.
subdir := linuxthreads_db
libthread_db-version = 1
extra-libs = libthread_db
extra-libs-others := $(extra-libs)
headers = thread_db.h
libthread_db-routines = td_init td_log td_ta_delete td_ta_get_nthreads \
td_ta_get_ph td_ta_map_id2thr td_ta_map_lwp2thr \
td_ta_new td_ta_thr_iter td_ta_tsd_iter \
td_thr_get_info td_thr_getfpregs td_thr_getgregs \
td_thr_getxregs td_thr_getxregsize td_thr_setfpregs \
td_thr_setgregs td_thr_setprio td_thr_setsigpending \
td_thr_setxregs td_thr_sigsetmask td_thr_tsd \
td_thr_validate td_thr_dbsuspend td_thr_dbresume \
td_ta_setconcurrency td_ta_enable_stats \
td_ta_reset_stats td_ta_get_stats td_ta_event_addr \
td_thr_event_enable td_thr_set_event \
td_thr_clear_event td_thr_event_getmsg
libthread_db-inhibit-o = $(filter-out .os,$(object-suffixes))
include ../Rules
# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
# This ensures they will load libc.so for needed symbols if loaded by
# a statically-linked program that hasn't already loaded it.
$(objpfx)libpthread.so: $(common-objpfx)libc.so

View File

@ -0,0 +1,44 @@
typedef enum {
PS_OK, /* generic "call succeeded" */
PS_ERR, /* generic. */
PS_BADPID, /* bad process handle */
PS_BADLID, /* bad lwp identifier */
PS_BADADDR, /* bad address */
PS_NOSYM, /* p_lookup() could not find given symbol */
PS_NOFREGS
/*
* FPU register set not available for given
* lwp
*/
} ps_err_e;
typedef unsigned long paddr_t;
struct ps_prochandle; /* user defined. */
extern ps_err_e ps_pdread(struct ps_prochandle *,
psaddr_t, void *, size_t);
extern ps_err_e ps_pdwrite(struct ps_prochandle *,
psaddr_t, const void *, size_t);
extern ps_err_e ps_ptread(struct ps_prochandle *,
psaddr_t, void *, size_t);
extern ps_err_e ps_ptwrite(struct ps_prochandle *,
psaddr_t, const void *, size_t);
extern ps_err_e ps_pglobal_lookup(struct ps_prochandle *,
const char *object_name, const char *sym_name, psaddr_t *sym_addr);
extern ps_err_e ps_lgetregs(struct ps_prochandle *,
lwpid_t, prgregset_t);
extern ps_err_e ps_lsetregs(struct ps_prochandle *,
lwpid_t, const prgregset_t);
extern ps_err_e ps_lgetfpregs(struct ps_prochandle *,
lwpid_t, prfpregset_t *);
extern ps_err_e ps_lsetfpregs(struct ps_prochandle *,
lwpid_t, const prfpregset_t *);

30
linuxthreads_db/td_init.c Normal file
View File

@ -0,0 +1,30 @@
/* Initialization function of thread debugger support library.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_init (void)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_OK;
}

32
linuxthreads_db/td_log.c Normal file
View File

@ -0,0 +1,32 @@
/* Noop, left for historical reasons.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_log (void)
{
/* This interface is deprecated in the Sun interface. We provide it
for compatibility but don't do anyhting ourself. We might in
future do some logging if this seems reasonable. */
LOG (__FUNCTION__);
return TD_OK;
}

View File

@ -0,0 +1,35 @@
/* Detach to target process.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <stdlib.h>
#include "thread_dbP.h"
td_err_e
td_ta_delete (td_thragent_t *ta)
{
LOG (__FUNCTION__);
/* The handle was allocated in `td_ta_new'. */
free (ta);
return TD_OK;
}

View File

@ -0,0 +1,30 @@
/* Enable collection of statistics for process.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_ta_enable_stats (const td_thragent_t *ta, int enable)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_OK;
}

View File

@ -0,0 +1,30 @@
/* Get event address.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_ta_event_addr (const td_thragent_t *ta, td_event_e event, td_notify_t *addr)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_NOCAPAB;
}

View File

@ -0,0 +1,40 @@
/* Get the number of threads in the process.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_ta_get_nthreads (const td_thragent_t *ta, int *np)
{
psaddr_t addr;
LOG (__FUNCTION__);
/* Access the variable `__pthread_handles_num'. */
if (ps_pglobal_lookup (ta->ph, "libpthread.so.0", "__pthread_handles_num",
&addr) != PS_OK)
return TD_ERR; /* XXX Other error value? */
if (ps_pdread (ta->ph, addr, np, sizeof (int)) != PS_OK)
return TD_ERR; /* XXX Other error value? */
return TD_OK;
}

View File

@ -0,0 +1,32 @@
/* Get external process handle.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_ta_get_ph (const td_thragent_t *ta, struct ps_prochandle **ph)
{
LOG (__FUNCTION__);
*ph = ta->ph;
return TD_OK;
}

View File

@ -0,0 +1,30 @@
/* Retrieve statistics for process.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_ta_get_stats (const td_thragent_t *ta, td_ta_stats_t *statsp)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_OK;
}

View File

@ -0,0 +1,47 @@
/* Map thread ID to thread handle.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_ta_map_id2thr (const td_thragent_t *ta, pthread_t pt, td_thrhandle_t *th)
{
struct pthread_handle_struct *handles = ta->handles;
struct pthread_handle_struct phc;
int pthread_threads_max = ta->pthread_threads_max;
LOG (__FUNCTION__);
/* We can compute the entry in the handle array we want. */
if (ps_pdread (ta->ph, handles + pt % pthread_threads_max, &phc,
sizeof (struct pthread_handle_struct)) != PS_OK)
return TD_ERR; /* XXX Other error value? */
/* Test whether this entry is in use. */
if (phc.h_descr == NULL)
return TD_BADTH;
/* Create the `td_thrhandle_t' object. */
th->th_ta_p = (td_thragent_t *) ta;
th->th_unique = phc.h_descr;
return TD_OK;
}

View File

@ -0,0 +1,62 @@
/* Which thread is running on an lwp?
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
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 cnt;
LOG (__FUNCTION__);
/* 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;
}
}
}
return TD_NOLWP;
}

115
linuxthreads_db/td_ta_new.c Normal file
View File

@ -0,0 +1,115 @@
/* Attach to target process.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <stddef.h>
#include <stdlib.h>
#include "thread_dbP.h"
td_err_e
td_ta_new (struct ps_prochandle *ps, td_thragent_t **ta)
{
psaddr_t addr;
LOG (__FUNCTION__);
/* See whether the library contains the necessary symbols. */
if (ps_pglobal_lookup (ps, "libpthread.so.0", "__pthread_threads_debug",
&addr) != PS_OK)
return TD_LIBTHREAD;
/* Fill in the appropriate information. */
*ta = (td_thragent_t *) malloc (sizeof (td_thragent_t));
if (*ta == NULL)
return TD_MALLOC;
/* Store the proc handle which we will pass to the callback functions
back into the debugger. */
(*ta)->ph = ps;
/* See whether the library contains the necessary symbols. */
if (ps_pglobal_lookup (ps, "libpthread.so.0", "__pthread_handles",
&addr) != PS_OK)
{
free_return:
free (*ta);
return TD_ERR;
}
(*ta)->handles = (struct pthread_handle_struct *) addr;
if (ps_pglobal_lookup (ps, "libpthread.so.0", "pthread_keys",
&addr) != PS_OK)
goto free_return;
/* Cast to the right type. */
(*ta)->keys = (struct pthread_key_struct *) addr;
/* Find out about the maximum number of threads. Old implementations
don't provide this information. In this case we assume that the
debug library is compiled with the same values. */
if (ps_pglobal_lookup (ps, "libpthread.so.0",
"__linuxthreads_pthread_threads_max", &addr) != PS_OK)
(*ta)->pthread_threads_max = PTHREAD_THREADS_MAX;
else
{
if (ps_pdread (ps, addr, &(*ta)->pthread_threads_max, sizeof (int))
!= PS_OK)
goto free_return;
}
/* Similar for the maximum number of thread local data keys. */
if (ps_pglobal_lookup (ps, "libpthread.so.0",
"__linuxthreads_pthread_keys_max", &addr) != PS_OK)
(*ta)->pthread_keys_max = PTHREAD_KEYS_MAX;
else
{
if (ps_pdread (ps, addr, &(*ta)->pthread_keys_max, sizeof (int))
!= PS_OK)
goto free_return;
}
/* And for the size of the second level arrays for the keys. */
if (ps_pglobal_lookup (ps, "libpthread.so.0",
"__linuxthreads_pthread_sizeof_descr", &addr)
!= PS_OK)
(*ta)->sizeof_descr = offsetof (struct _pthread_descr_struct, p_startfct);
else
{
if (ps_pdread (ps, addr, &(*ta)->sizeof_descr, sizeof (int)) != PS_OK)
goto free_return;
}
/* Similar for the maximum number of thread local data keys. */
if (ps_pglobal_lookup (ps, "libpthread.so.0",
"__linuxthreads_pthread_keys_max", &addr) != PS_OK)
(*ta)->pthread_keys_max = PTHREAD_KEYS_MAX;
else
{
if (ps_pdread (ps, addr, &(*ta)->pthread_keys_max, sizeof (int))
!= PS_OK)
goto free_return;
}
return TD_OK;
}

View File

@ -0,0 +1,30 @@
/* Reset statistics.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_ta_reset_stats (const td_thragent_t *ta)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_OK;
}

View File

@ -0,0 +1,30 @@
/* Set suggested concurrency level for process.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_ta_setconcurrency (const td_thragent_t *ta, int level)
{
/* This is something LinuxThreads does not support. */
LOG (__FUNCTION__);
return TD_NOCAPAB;
}

View File

@ -0,0 +1,73 @@
/* Iterate over a process's threads.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_ta_thr_iter (const td_thragent_t *ta, td_thr_iter_f *callback,
void *cbdata_p, td_thr_state_e state, int ti_pri,
sigset_t *ti_sigmask_p, unsigned int ti_user_flags)
{
struct pthread_handle_struct *handles = ta->handles;
int pthread_threads_max = ta->pthread_threads_max;
int cnt;
LOG (__FUNCTION__);
/* Now get all descriptors, one after the other. */
for (cnt = 0; cnt < pthread_threads_max; ++cnt, ++handles)
{
struct pthread_handle_struct phc;
if (cnt == 1)
/* Skip the manager thread. */
continue;
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)
{
struct _pthread_descr_struct pds;
td_thrhandle_t th;
if (ps_pdread (ta->ph, phc.h_descr, &pds,
sizeof (struct _pthread_descr_struct)) != PS_OK)
return TD_ERR; /* XXX Other error value? */
/* Now test whether this thread matches the specified
conditions. */
/* Only if the priority level is as high or higher. */
if (pds.p_priority < ti_pri)
continue;
/* Yep, it matches. Call the callback function. */
th.th_ta_p = (td_thragent_t *) ta;
th.th_unique = phc.h_descr;
if (callback (&th, cbdata_p) != 0)
return TD_DBERR;
}
}
return TD_OK;
}

View File

@ -0,0 +1,51 @@
/* Iterate over a process's thread-specific data.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_ta_tsd_iter (const td_thragent_t *ta, td_key_iter_f *callback,
void *cbdata_p)
{
struct pthread_key_struct *keys = ta->keys;
int pthread_keys_max = ta->pthread_keys_max;
int cnt;
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
/* Now get all descriptors, one after the other. */
for (cnt = 0; cnt < pthread_keys_max; ++cnt, ++keys)
{
struct pthread_key_struct key;
if (ps_pdread (ta->ph, keys, &key,
sizeof (struct pthread_key_struct)) != PS_OK)
return TD_ERR; /* XXX Other error value? */
if (key.in_use
/* Return with an error if the callback returns a nonzero value. */
&& callback (cnt, key.destr, cbdata_p) != 0)
return TD_DBERR;
}
return TD_OK;
}

View File

@ -0,0 +1,30 @@
/* Disable specific event.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_clear_event (const td_thrhandle_t *th, td_thr_events_t *event)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_NOCAPAB;
}

View File

@ -0,0 +1,30 @@
/* Resume execution of given thread.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_dbresume (const td_thrhandle_t *th)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_NOCAPAB;
}

View File

@ -0,0 +1,30 @@
/* Suspend execution of given thread.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_dbsuspend (const td_thrhandle_t *th)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_NOCAPAB;
}

View File

@ -0,0 +1,30 @@
/* Enable event reporting.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_event_enable (const td_thrhandle_t *th, int event)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_NOCAPAB;
}

View File

@ -0,0 +1,30 @@
/* Retrieve event.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_event_getmsg (const td_thrhandle_t *th, td_event_msg_t *msg)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_NOCAPAB;
}

View File

@ -0,0 +1,55 @@
/* Get thread information.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <stddef.h>
#include "thread_dbP.h"
td_err_e
td_thr_get_info (const td_thrhandle_t *th, td_thrinfo_t *infop)
{
struct _pthread_descr_struct pds;
LOG (__FUNCTION__);
/* 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. */
memset (infop, '\0', sizeof (td_thrinfo_t));
infop->ti_ta_p = th->th_ta_p;
infop->ti_tid = pds.p_tid;
infop->ti_tls = (char *) pds.p_specific;
infop->ti_pri = pds.p_priority;
/* We can get the following information only if the thread descriptor
in the target processor is large enough, i.e., comes from a recent
enough library. */
if (offsetof (struct _pthread_descr_struct, p_startfct)
< th->th_ta_p->sizeof_descr)
infop->ti_startfunc = pds.p_startfct;
return TD_OK;
}

View File

@ -0,0 +1,40 @@
/* Get a thread's floating-point register set.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_getfpregs (const td_thrhandle_t *th, prfpregset_t *regset)
{
struct _pthread_descr_struct pds;
LOG (__FUNCTION__);
/* We have to get the PID for this thread. */
if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
sizeof (struct _pthread_descr_struct)) != PS_OK)
return TD_ERR;
if (ps_lgetfpregs (th->th_ta_p->ph, pds.p_pid, regset) != PS_OK)
return TD_ERR;
return TD_OK;
}

View File

@ -0,0 +1,40 @@
/* Get a thread's general register set.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_getgregs (const td_thrhandle_t *th, prgregset_t gregs)
{
struct _pthread_descr_struct pds;
LOG (__FUNCTION__);
/* We have to get the PID for this thread. */
if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
sizeof (struct _pthread_descr_struct)) != PS_OK)
return TD_ERR;
if (ps_lgetregs (th->th_ta_p->ph, pds.p_pid, gregs) != PS_OK)
return TD_ERR;
return TD_OK;
}

View File

@ -0,0 +1,30 @@
/* Get a thread's extra state register set.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_getxregs (const td_thrhandle_t *th, void *xregs)
{
/* XXX This might be platform specific. */
LOG (__FUNCTION__);
return TD_NOXREGS;
}

View File

@ -0,0 +1,30 @@
/* Get the size of the extra state register set for this architecture.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_getxregsize (const td_thrhandle_t *th, int *sizep)
{
/* XXX This might be platform specific. */
LOG (__FUNCTION__);
return TD_NOXREGS;
}

View File

@ -0,0 +1,30 @@
/* Enable specific event for thread.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_set_event (const td_thrhandle_t *th, td_thr_events_t *event)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_NOCAPAB;
}

View File

@ -0,0 +1,40 @@
/* Set a thread's floating-point register set.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_setfpregs (const td_thrhandle_t *th, const prfpregset_t *fpregs)
{
struct _pthread_descr_struct pds;
LOG (__FUNCTION__);
/* We have to get the PID for this thread. */
if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
sizeof (struct _pthread_descr_struct)) != PS_OK)
return TD_ERR;
if (ps_lsetfpregs (th->th_ta_p->ph, pds.p_pid, fpregs) != PS_OK)
return TD_ERR;
return TD_OK;
}

View File

@ -0,0 +1,40 @@
/* Set a thread's general register set.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_setgregs (const td_thrhandle_t *th, prgregset_t gregs)
{
struct _pthread_descr_struct pds;
LOG (__FUNCTION__);
/* We have to get the PID for this thread. */
if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
sizeof (struct _pthread_descr_struct)) != PS_OK)
return TD_ERR;
if (ps_lsetregs (th->th_ta_p->ph, pds.p_pid, gregs) != PS_OK)
return TD_ERR;
return TD_OK;
}

View File

@ -0,0 +1,30 @@
/* Set a thread's priority.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_setprio (const td_thrhandle_t *th, int prio)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_OK;
}

View File

@ -0,0 +1,31 @@
/* Raise a signal for a thread.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_setsigpending (const td_thrhandle_t *th, unsigned char n,
const sigset_t *ss)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_OK;
}

View File

@ -0,0 +1,30 @@
/* Set a thread's extra state register set.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_setxregs (const td_thrhandle_t *ta, const void *addr)
{
/* XXX This might have to be platform specific. */
LOG (__FUNCTION__);
return TD_NOXREGS;
}

View File

@ -0,0 +1,30 @@
/* Set a thread's signal mask.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_sigsetmask (const td_thrhandle_t *th, const sigset_t *ss)
{
/* XXX We have to figure out what has to be done. */
LOG (__FUNCTION__);
return TD_OK;
}

View File

@ -0,0 +1,76 @@
/* Get a thread-specific data pointer for a thread.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_tsd (const td_thrhandle_t *th, const thread_key_t tk, void **data)
{
struct _pthread_descr_struct pds;
struct pthread_key_struct *keys = th->th_ta_p->keys;
struct pthread_key_struct key;
int pthread_keys_max = th->th_ta_p->pthread_keys_max;
int pthread_key_2ndlevel_size = th->th_ta_p->pthread_key_2ndlevel_size;
unsigned int idx1st;
unsigned int idx2nd;
void *p;
LOG (__FUNCTION__);
/* Get the thread descriptor. */
if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
sizeof (struct _pthread_descr_struct)) != PS_OK)
return TD_ERR; /* XXX Other error value? */
/* Check correct value of key. */
if (tk >= pthread_keys_max)
return TD_BADKEY;
/* Get the key entry. */
if (ps_pdread (th->th_ta_p->ph, keys, &key,
sizeof (struct pthread_key_struct)) != PS_OK)
return TD_ERR; /* XXX Other error value? */
/* Fail if this key is not at all used. */
if (! key.in_use)
return TD_BADKEY;
/* Compute the indeces. */
idx1st = tk / pthread_key_2ndlevel_size;
idx2nd = tk % pthread_key_2ndlevel_size;
/* Check the pointer to the second level array. */
if (pds.p_specific[idx1st] == NULL)
return TD_NOTSD;
/* Now get the real key.
XXX I don't know whether it's correct but there is currently no
easy way to determine whether a key was never set or the value
is NULL. We return an error whenever the value is NULL. */
if (ps_pdread (th->th_ta_p->ph, &pds.p_specific[idx1st][idx2nd], &p,
sizeof (void *)) != PS_OK)
return TD_ERR;
if (p != NULL)
*data = p;
return p != NULL ? TD_OK : TD_NOTSD;
}

View File

@ -0,0 +1,55 @@
/* Validate a thread handle.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "thread_dbP.h"
td_err_e
td_thr_validate (const td_thrhandle_t *th)
{
struct pthread_handle_struct *handles = th->th_ta_p->handles;
int pthread_threads_max = th->th_ta_p->pthread_threads_max;
int cnt;
LOG (__FUNCTION__);
/* Now get all descriptors, one after the other. */
for (cnt = 0; cnt < pthread_threads_max; ++cnt, ++handles)
{
struct pthread_handle_struct phc;
if (cnt == 1)
/* Skip the manager thread. */
continue;
if (ps_pdread (th->th_ta_p->ph, handles, &phc,
sizeof (struct pthread_handle_struct)) != PS_OK)
return TD_ERR; /* XXX Other error value? */
if (phc.h_descr != NULL && phc.h_descr == th->th_unique)
{
/* XXX There should be another test using the TID but this is
currently not available. */
return TD_OK;
}
}
return TD_ERR;
}

426
linuxthreads_db/thread_db.h Normal file
View File

@ -0,0 +1,426 @@
/* Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _THREAD_DB_H
#define _THREAD_DB_H 1
/* This is the debugger interface for the LinuxThreads library. It is
modelled closely after the interface with same names in Solaris with
the goal to share the same code in the debugger. */
#include <pthread.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/ucontext.h>
/* Error codes of the library. */
typedef enum
{
TD_OK, /* No error. */
TD_ERR, /* No further specified error. */
TD_NOTHR, /* No matching thread found. */
TD_NOSV, /* No matching synchronization handle found. */
TD_NOLWP, /* No matching light-weighted process found. */
TD_BADPH, /* Invalid process handle. */
TD_BADTH, /* Invalid thread handle. */
TD_BADSH, /* Invalid synchronization handle. */
TD_BADTA, /* Invalid thread agent. */
TD_BADKEY, /* Invalid key. */
TD_NOMSG, /* No event available. */
TD_NOFPREGS, /* No floating-point register content available. */
TD_LIBTHREAD, /* Application not linked with thread library. */
TD_NOEVENT, /* Requested event is not supported. */
TD_NOCAPAB, /* Capability not available. */
TD_DBERR, /* Internal debug library error. */
TD_NOAPLIC, /* Operation is not applicable. */
TD_NOTSD, /* No thread-specific data available. */
TD_MALLOC, /* Out of memory. */
TD_PARTIALREG,/* Not entire register set was read or written. */
TD_NOXREGS /* X register set not available for given thread. */
} td_err_e;
/* Possible thread states. TD_THR_ANY_STATE is a pseudo-state used to
select threads regardless of state in td_ta_thr_iter(). */
typedef enum
{
TD_THR_ANY_STATE,
TD_THR_UNKNOWN,
TD_THR_STOPPED,
TD_THR_RUN,
TD_THR_ACTIVE,
TD_THR_ZOMBIE,
TD_THR_SLEEP,
TD_THR_STOPPED_ASLEEP
} td_thr_state_e;
/* Thread type: user or system. TD_THR_ANY_TYPE is a pseudo-type used
to select threads regardless of type in td_ta_thr_iter(). */
typedef enum
{
TD_THR_ANY_TYPE,
TD_THR_USER,
TD_THR_SYSTEM
} td_thr_type_e;
/* Types of the debugging library. */
/* Addresses. */
typedef void *psaddr_t;
/* Handle for a process. This type is opaque. */
typedef struct td_thragent td_thragent_t;
/* The actual thread handle type. This is also opaque. */
typedef struct td_thrhandle
{
td_thragent_t *th_ta_p;
psaddr_t th_unique;
} td_thrhandle_t;
/* Flags for `td_ta_thr_iter'. */
#define TD_THR_ANY_USER_FLAGS 0xffffffff
#define TD_THR_LOWEST_PRIORITY -20
#define TD_SIGNO_MASK NULL
#define TD_EVENTSIZE 2
#define BT_UISHIFT 5 /* log base 2 of BT_NBIPUI, to extract word index */
#define BT_NBIPUI (1 << BT_UISHIFT) /* n bits per uint */
#define BT_UIMASK (BT_NBIPUI - 1) /* to extract bit index */
/* Bitmask of enabled events. */
typedef struct td_thr_events
{
uint32_t event_bits[TD_EVENTSIZE];
} td_thr_events_t;
/* Event set manipulation macros. */
#define __td_eventmask(n) \
(UINT32_C (1) << (((n) - 1) & BT_UIMASK))
#define __td_eventword(n) \
((UINT32_C ((n) - 1)) >> BT_UISHIFT)
#define td_event_emptyset(setp) \
do { \
int __i; \
for (__i = TD_EVENTSIZE; __i > 0; --__i) \
(setp)->event_bits[__i - 1] = 0; \
} while (0)
#define td_event_fillset(setp) \
do { \
int __i; \
for (__i = TD_EVENTSIZE; __i > 0; --__i) \
(setp)->event_bits[__i - 1] = UINT32_C (0xffffffff); \
} while (0)
#define td_event_addset(setp, n) \
(((setp)->event_bits[__td_eventword (n)]) |= __td_eventmask (n))
#define td_event_delset(setp, n) \
(((setp)->event_bits[__td_eventword (n)]) &= ~__td_eventmask (n))
#define td_eventismember(setp, n) \
(__td_eventmask (n) & ((setp)->event_bits[__td_eventword (n)]))
#if TD_EVENTSIZE == 2
# define td_eventisempty(setp) \
(!((setp)->event_bits[0]) && !((setp)->event_bits[1]))
#else
# error "td_eventisempty must be changed to match TD_EVENTSIZE"
#endif
/* Events reportable by the thread implementation. */
typedef enum
{
TD_ALL_EVENTS, /* Pseudo-event number. */
TD_EVENT_NONE = TD_ALL_EVENTS, /* Depends on context. */
TD_READY, /* Is executable now. */
TD_SLEEP, /* Blocked in a synchronization obj. */
TD_SWITCHTO, /* Now assigned to a process. */
TD_SWITCHFROM, /* Not anymore assigned to a process. */
TD_LOCK_TRY, /* Trying to get an unavailable lock. */
TD_CATCHSIG, /* Signal posted to the thread. */
TD_IDLE, /* Process getting idle. */
TD_CREATE, /* New thread created. */
TD_DEATH, /* Thread terminated. */
TD_PREEMPT, /* Preempted. */
TD_PRI_INHERIT, /* Inherited elevated priority. */
TD_REAP, /* Reaped. */
TD_CONCURRENCY, /* Number of processes changing. */
TD_TIMEOUT, /* Conditional variable wait timed out. */
TD_MIN_EVENT_NUM = TD_READY,
TD_MAX_EVENT_NUM = TD_TIMEOUT,
TD_EVENTS_ENABLE = 31 /* Event reporting enabled. */
} td_event_e;
/* Values representing the different ways events are reported. */
typedef enum
{
NOTIFY_BPT, /* User must insert breakpoint at u.bptaddr. */
NOTIFY_AUTOBPT, /* Breakpoint at u.bptaddr is automatically
inserted. */
NOTIFY_SYSCALL /* System call u.syscallno will be invoked. */
} td_notify_e;
/* Description how event type is reported. */
typedef struct td_notify
{
td_notify_e type; /* Way the event is reported. */
union
{
psaddr_t bptaddr; /* Address of breakpoint. */
int syscallno; /* Number of system call used. */
} u;
} td_notify_t;
/* Structure used to report event. */
typedef struct td_event_msg
{
td_event_e event; /* Event type being reported. */
const td_thrhandle_t *th_p; /* Thread reporting the event. */
union
{
# if 0
td_synchandle_t *sh; /* Handle of synchronization object. */
#endif
uintptr_t data; /* Event specific data. */
} msg;
} td_event_msg_t;
/* Gathered statistics about the process. */
typedef struct td_ta_stats
{
int nthreads; /* Total number of threads in use. */
int r_concurrency; /* Concurrency level requested by user. */
int nrunnable_num; /* Average runnable threads, numerator. */
int nrunnable_den; /* Average runnable threads, denominator. */
int a_concurrency_num; /* Achieved concurrency level, numerator. */
int a_concurrency_den; /* Achieved concurrency level, denominator. */
int nlwps_num; /* Average number of processes in use,
numerator. */
int nlwps_den; /* Average number of processes in use,
denominator. */
int nidle_num; /* Average number of idling processes,
numerator. */
int nidle_den; /* Average number of idling processes,
denominator. */
} td_ta_stats_t;
/* Since Sun's library is based on Solaris threads we have to define a few
types to map them to POSIX threads. */
typedef pthread_t thread_t;
typedef pthread_key_t thread_key_t;
/* Linux has different names for the register set types. */
typedef gregset_t prgregset_t;
typedef fpregset_t prfpregset_t;
/* Callback for iteration over threads. */
typedef int td_thr_iter_f __P ((const td_thrhandle_t *, void *));
/* Callback for iteration over thread local data. */
typedef int td_key_iter_f __P ((thread_key_t, void (*) (void *), void *));
/* Forward declaration. This has to be defined by the user. */
struct ps_prochandle;
/* We don't have any differences between processes and threads, therefore
have only one PID type. */
typedef pid_t lwpid_t;
/* Information about the thread. */
typedef struct td_thrinfo
{
td_thragent_t *ti_ta_p; /* Process handle. */
unsigned int ti_user_flags; /* Unused. */
thread_t ti_tid; /* Thread ID returned by
pthread_create(). */
char *ti_tls; /* Pointer to thread-local data. */
psaddr_t ti_startfunc; /* Start function passed to
pthread_create(). */
psaddr_t ti_stkbase; /* Base of thread's stack. */
long int ti_stksize; /* Size of thread's stack. */
psaddr_t ti_ro_area; /* Unused. */
int ti_ro_size; /* Unused. */
td_thr_state_e ti_state; /* Thread state. */
unsigned char ti_db_suspended; /* Nonzero if suspended by debugger. */
td_thr_type_e ti_type; /* Unused. */
intptr_t ti_pc; /* Unused. */
intptr_t ti_sp; /* Unused. */
short int ti_flags; /* Unused. */
int ti_pri; /* Thread priority. */
lwpid_t ti_lid; /* Unused. */
sigset_t ti_sigmask; /* Signal mask. */
unsigned char ti_traceme; /* Nonzero if event reporting
enabled. */
unsigned char ti_preemptflag; /* Unused. */
unsigned char ti_pirecflag; /* Unused. */
sigset_t ti_pending; /* Set of pending signals. */
td_thr_events_t ti_events; /* Set of enabled events. */
} td_thrinfo_t;
/* Prototypes for exported library functions. */
/* Initialize the thread debug support library. */
extern td_err_e td_init (void);
/* Historical relict. Should not be used anymore. */
extern td_err_e td_log (void);
/* Generate new thread debu librarz handle for process PS. */
extern td_err_e td_ta_new (struct ps_prochandle *__ps, td_thragent_t **__ta);
/* Free resources allocated for TA. */
extern td_err_e td_ta_delete (td_thragent_t *__ta);
/* Get number of currently running threads in process associated with TA. */
extern td_err_e td_ta_get_nthreads (const td_thragent_t *__ta, int *__np);
/* Return process handle passed in `td_ta_new' for process associated with
TA. */
extern td_err_e td_ta_get_ph (const td_thragent_t *__ta,
struct ps_prochandle **__ph);
/* Map thread library handle PT to thread debug library handle for process
associated with TA and store result in *TH. */
extern td_err_e td_ta_map_id2thr (const td_thragent_t *__ta, pthread_t __pt,
td_thrhandle_t *__th);
/* Map process ID LWPID to thread debug library handle for process
associated with TA and store result in *TH. */
extern td_err_e td_ta_map_lwp2thr (const td_thragent_t *__ta, lwpid_t __lwpid,
td_thrhandle_t *__th);
/* Call for each thread is process associated with TA the callback function
CALLBACK. */
extern td_err_e td_ta_thr_iter (const td_thragent_t *__ta,
td_thr_iter_f *__callback, void *__cbdata_p,
td_thr_state_e __state, int __ti_pri,
sigset_t *__ti_sigmask_p,
unsigned int __ti_user_flags);
/* Call for each defined thread local data entry the callback function KI. */
extern td_err_e td_ta_tsd_iter (const td_thragent_t *__ta, td_key_iter_f *__ki,
void *__p);
/* Get event address for EVENT. */
extern td_err_e td_ta_event_addr (const td_thragent_t *__ta,
td_event_e __event, td_notify_t *__ptr);
/* Set suggested concurrency level for process associated with TA. */
extern td_err_e td_ta_setconcurrency (const td_thragent_t *__ta, int __level);
/* Enable collecting statistics for process associated with TA. */
extern td_err_e td_ta_enable_stats (const td_thragent_t *__ta, int __enable);
/* Reset statistics. */
extern td_err_e td_ta_reset_stats (const td_thragent_t *__ta);
/* Retrieve statitics from process associated with TA. */
extern td_err_e td_ta_get_stats (const td_thragent_t *__ta,
td_ta_stats_t *__statsp);
/* Validate that TH is a thread handle. */
extern td_err_e td_thr_validate (const td_thrhandle_t *__th);
/* Return information about thread TH. */
extern td_err_e td_thr_get_info (const td_thrhandle_t *__th,
td_thrinfo_t *__infop);
/* Retrieve floating-point register contents of process running thread TH. */
extern td_err_e td_thr_getfpregs (const td_thrhandle_t *__th,
prfpregset_t *__regset);
/* Retrieve general register contents of process running thread TH. */
extern td_err_e td_thr_getgregs (const td_thrhandle_t *__th,
prgregset_t __gregs);
/* Retrieve extended register contents of process running thread TH. */
extern td_err_e td_thr_getxregs (const td_thrhandle_t *__th, void *__xregs);
/* Get size of extended register set of process running thread TH. */
extern td_err_e td_thr_getxregsize (const td_thrhandle_t *__th, int *__sizep);
/* Set floating-point register contents of process running thread TH. */
extern td_err_e td_thr_setfpregs (const td_thrhandle_t *__th,
const prfpregset_t *__fpregs);
/* Set general register contents of process running thread TH. */
extern td_err_e td_thr_setgregs (const td_thrhandle_t *__th,
prgregset_t __gregs);
/* Set extended register contents of process running thread TH. */
extern td_err_e td_thr_setxregs (const td_thrhandle_t *__th,
const void *__addr);
/* Enable reporting for EVENT for thread TH. */
extern td_err_e td_thr_event_enable (const td_thrhandle_t *__th, int __event);
/* Enable EVENT for thread TH. */
extern td_err_e td_thr_set_event (const td_thrhandle_t *__th,
td_thr_events_t *__event);
/* Disable EVENT for thread TH. */
extern td_err_e td_thr_clear_event (const td_thrhandle_t *__th,
td_thr_events_t *__event);
/* Get event message for thread TH. */
extern td_err_e td_thr_event_getmsg (const td_thrhandle_t *__th,
td_event_msg_t *__msg);
/* Set priority of thread TH. */
extern td_err_e td_thr_setprio (const td_thrhandle_t *__th, int __prio);
/* Set pending signals for thread TH. */
extern td_err_e td_thr_setsigpending (const td_thrhandle_t *__th,
unsigned char __n, const sigset_t *__ss);
/* Set signal mask for thread TH. */
extern td_err_e td_thr_sigsetmask (const td_thrhandle_t *__th,
const sigset_t *__ss);
/* Return thread local data associated with key TK in thread TH. */
extern td_err_e td_thr_tsd (const td_thrhandle_t *__th,
const thread_key_t __tk, void **__data);
/* Suspend execution of thread TH. */
extern td_err_e td_thr_dbsuspend (const td_thrhandle_t *__th);
/* Resume execution of thread TH. */
extern td_err_e td_thr_dbresume (const td_thrhandle_t *__th);
#endif /* thread_db.h */

View File

@ -0,0 +1,46 @@
/* Private header for thread debug library. */
#ifndef _THREAD_DBP_H
#define _THREAD_DBP_H 1
#include "thread_db.h"
#include "../linuxthreads/internals.h"
#include "proc_service.h"
/* Comment out the following for less verbose output. */
#define LOG(c) __libc_write (2, c "\n", strlen (c "\n"))
extern ssize_t __libc_write (int, const void *, size_t);
/* Handle for a process. This type is opaque. */
struct td_thragent
{
/* Delivered by the debugger and we have to pass it back in the
proc callbacks. */
struct ps_prochandle *ph;
/* Some cached information. */
/* Address of the `__pthread_handles' array. */
struct pthread_handle_struct *handles;
/* Address of the `pthread_kyes' array. */
struct pthread_key_struct *keys;
/* Maximum number of threads. */
int pthread_threads_max;
/* Maximum number of thread-local data keys. */
int pthread_keys_max;
/* Size of 2nd level array for thread-local data keys. */
int pthread_key_2ndlevel_size;
/* Sizeof struct _pthread_descr_struct. */
int sizeof_descr;
};
#endif /* thread_dbP.h */