Back to index

glibc  2.9
td_thr_tls_get_addr.c
Go to the documentation of this file.
00001 /* Get address of thread local variable.
00002    Copyright (C) 2002,2003 Free Software Foundation, Inc.
00003    This file is part of the GNU C Library.
00004    Contributed by Ulrich Drepper <drepper@cygnus.com>, 2002.
00005 
00006    The GNU C Library is free software; you can redistribute it and/or
00007    modify it under the terms of the GNU Lesser General Public
00008    License as published by the Free Software Foundation; either
00009    version 2.1 of the License, or (at your option) any later version.
00010 
00011    The GNU C Library is distributed in the hope that it will be useful,
00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014    Lesser General Public License for more details.
00015 
00016    You should have received a copy of the GNU Lesser General Public
00017    License along with the GNU C Library; if not, write to the Free
00018    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00019    02111-1307 USA.  */
00020 
00021 #include <link.h>
00022 #include "thread_dbP.h"
00023 
00024 td_err_e
00025 td_thr_tls_get_addr (const td_thrhandle_t *th __attribute__ ((unused)),
00026                    void *map_address __attribute__ ((unused)),
00027                    size_t offset __attribute__ ((unused)),
00028                    void **address __attribute__ ((unused)))
00029 {
00030 #if USE_TLS
00031   /* Read the module ID from the link_map.  */
00032   size_t modid;
00033   if (ps_pdread (th->th_ta_p->ph,
00034                &((struct link_map *) map_address)->l_tls_modid,
00035                &modid, sizeof modid) != PS_OK)
00036     return TD_ERR;   /* XXX Other error value?  */
00037 
00038   td_err_e result = td_thr_tlsbase (th, modid, address);
00039   if (result == TD_OK)
00040     *address += offset;
00041   return result;
00042 #else
00043   return TD_ERR;
00044 #endif
00045 }