From 2f84cc6a484a430279297b97732b1da72b2e1e26 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sat, 15 Mar 2003 23:55:23 +0000 Subject: 2003-03-15 Roland McGrath * thread_db.h (td_err_e): Add TD_NOTLS and TD_TLSDEFER. (td_thr_tlsbase): Declare it. * td_thr_tlsbase.c: New file. * Makefile (libthread_db-routines): Add it. * Versions (libthread_db: GLIBC_2.3.3): New set, add td_thr_tlsbase. * td_thr_tls_get_addr.c (td_thr_tls_get_addr): Use td_thr_tlsbase. --- nptl_db/td_thr_tls_get_addr.c | 47 +++++++------------------------------------ 1 file changed, 7 insertions(+), 40 deletions(-) (limited to 'nptl_db/td_thr_tls_get_addr.c') diff --git a/nptl_db/td_thr_tls_get_addr.c b/nptl_db/td_thr_tls_get_addr.c index d1e29da8b9..c900cac8e0 100644 --- a/nptl_db/td_thr_tls_get_addr.c +++ b/nptl_db/td_thr_tls_get_addr.c @@ -1,7 +1,7 @@ /* Get address of thread local variable. - Copyright (C) 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 2002,2003 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 2002. + Contributed by Ulrich Drepper , 2002. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,15 +18,9 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include #include #include "thread_dbP.h" - -/* Value used for dtv entries for which the allocation is delayed. */ -# define TLS_DTV_UNALLOCATED ((void *) -1l) - - td_err_e td_thr_tls_get_addr (const td_thrhandle_t *th __attribute__ ((unused)), void *map_address __attribute__ ((unused)), @@ -34,44 +28,17 @@ td_thr_tls_get_addr (const td_thrhandle_t *th __attribute__ ((unused)), void **address __attribute__ ((unused))) { #if USE_TLS - size_t modid; - union dtv pdtv, *dtvp; - - LOG ("td_thr_tls_get_addr"); - - psaddr_t dtvpp = th->th_unique; -#if TLS_TCB_AT_TP - dtvpp += offsetof (struct pthread, header.dtv); -#elif TLS_DTV_AT_TP - dtvpp += TLS_PRE_TCB_SIZE + offsetof (tcbhead_t, dtv); -#else -# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined." -#endif - - /* Get the DTV pointer from the thread descriptor. */ - if (ps_pdread (th->th_ta_p->ph, dtvpp, &dtvp, sizeof dtvp) != PS_OK) - return TD_ERR; /* XXX Other error value? */ - /* Read the module ID from the link_map. */ + size_t modid; if (ps_pdread (th->th_ta_p->ph, &((struct link_map *) map_address)->l_tls_modid, &modid, sizeof modid) != PS_OK) return TD_ERR; /* XXX Other error value? */ - /* Get the corresponding entry in the DTV. */ - if (ps_pdread (th->th_ta_p->ph, dtvp + modid, - &pdtv, sizeof (union dtv)) != PS_OK) - return TD_ERR; /* XXX Other error value? */ - - /* It could be that the memory for this module is not allocated for - the given thread. */ - if (pdtv.pointer == TLS_DTV_UNALLOCATED) - /* There is not much we can do. */ - return TD_NOTALLOC; - - *address = (char *) pdtv.pointer + offset; - - return TD_OK; + td_err_e result = td_thr_tlsbase (th, modid, address); + if (result == TD_OK) + *address += offset; + return result; #else return TD_ERR; #endif -- cgit 1.4.1