1 /* Thread-local storage handling in the ELF dynamic linker. Generic version.
2 Copyright (C) 2002-2006,2008,2011,2012 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
25 #include <sys/param.h>
31 /* Amount of excess space to allocate in the static TLS area
32 to allow dynamic loading of modules defining IE-model TLS data. */
33 #define TLS_STATIC_SURPLUS 64 + DL_NNS * 100
36 /* Out-of-memory handler. */
39 __attribute__ ((__noreturn__
))
42 _dl_fatal_printf ("cannot allocate memory for thread-local data: ABORT\n");
49 _dl_next_tls_modid (void)
53 if (__builtin_expect (GL(dl_tls_dtv_gaps
), false))
56 struct dtv_slotinfo_list
*runp
= GL(dl_tls_dtv_slotinfo_list
);
58 /* Note that this branch will never be executed during program
59 start since there are no gaps at that time. Therefore it
60 does not matter that the dl_tls_dtv_slotinfo is not allocated
61 yet when the function is called for the first times.
63 NB: the offset +1 is due to the fact that DTV[0] is used
64 for something else. */
65 result
= GL(dl_tls_static_nelem
) + 1;
66 if (result
<= GL(dl_tls_max_dtv_idx
))
69 while (result
- disp
< runp
->len
)
71 if (runp
->slotinfo
[result
- disp
].map
== NULL
)
75 assert (result
<= GL(dl_tls_max_dtv_idx
) + 1);
78 if (result
- disp
< runp
->len
)
83 while ((runp
= runp
->next
) != NULL
);
85 if (result
> GL(dl_tls_max_dtv_idx
))
87 /* The new index must indeed be exactly one higher than the
89 assert (result
== GL(dl_tls_max_dtv_idx
) + 1);
90 /* There is no gap anymore. */
91 GL(dl_tls_dtv_gaps
) = false;
98 /* No gaps, allocate a new entry. */
101 result
= ++GL(dl_tls_max_dtv_idx
);
111 _dl_determine_tlsoffset (void)
113 size_t max_align
= TLS_TCB_ALIGN
;
115 size_t freebottom
= 0;
117 /* The first element of the dtv slot info list is allocated. */
118 assert (GL(dl_tls_dtv_slotinfo_list
) != NULL
);
119 /* There is at this point only one element in the
120 dl_tls_dtv_slotinfo_list list. */
121 assert (GL(dl_tls_dtv_slotinfo_list
)->next
== NULL
);
123 struct dtv_slotinfo
*slotinfo
= GL(dl_tls_dtv_slotinfo_list
)->slotinfo
;
125 /* Determining the offset of the various parts of the static TLS
126 block has several dependencies. In addition we have to work
127 around bugs in some toolchains.
129 Each TLS block from the objects available at link time has a size
130 and an alignment requirement. The GNU ld computes the alignment
131 requirements for the data at the positions *in the file*, though.
132 I.e, it is not simply possible to allocate a block with the size
133 of the TLS program header entry. The data is layed out assuming
134 that the first byte of the TLS block fulfills
136 p_vaddr mod p_align == &TLS_BLOCK mod p_align
138 This means we have to add artificial padding at the beginning of
139 the TLS block. These bytes are never used for the TLS data in
140 this module but the first byte allocated must be aligned
141 according to mod p_align == 0 so that the first byte of the TLS
142 block is aligned according to p_vaddr mod p_align. This is ugly
143 and the linker can help by computing the offsets in the TLS block
144 assuming the first byte of the TLS block is aligned according to
147 The extra space which might be allocated before the first byte of
148 the TLS block need not go unused. The code below tries to use
149 that memory for the next TLS block. This can work if the total
150 memory requirement for the next TLS block is smaller than the
154 /* We simply start with zero. */
157 for (size_t cnt
= 0; slotinfo
[cnt
].map
!= NULL
; ++cnt
)
159 assert (cnt
< GL(dl_tls_dtv_slotinfo_list
)->len
);
161 size_t firstbyte
= (-slotinfo
[cnt
].map
->l_tls_firstbyte_offset
162 & (slotinfo
[cnt
].map
->l_tls_align
- 1));
164 max_align
= MAX (max_align
, slotinfo
[cnt
].map
->l_tls_align
);
166 if (freebottom
- freetop
>= slotinfo
[cnt
].map
->l_tls_blocksize
)
168 off
= roundup (freetop
+ slotinfo
[cnt
].map
->l_tls_blocksize
169 - firstbyte
, slotinfo
[cnt
].map
->l_tls_align
)
171 if (off
<= freebottom
)
175 /* XXX For some architectures we perhaps should store the
177 slotinfo
[cnt
].map
->l_tls_offset
= off
;
182 off
= roundup (offset
+ slotinfo
[cnt
].map
->l_tls_blocksize
- firstbyte
,
183 slotinfo
[cnt
].map
->l_tls_align
) + firstbyte
;
184 if (off
> offset
+ slotinfo
[cnt
].map
->l_tls_blocksize
185 + (freebottom
- freetop
))
188 freebottom
= off
- slotinfo
[cnt
].map
->l_tls_blocksize
;
192 /* XXX For some architectures we perhaps should store the
194 slotinfo
[cnt
].map
->l_tls_offset
= off
;
197 GL(dl_tls_static_used
) = offset
;
198 GL(dl_tls_static_size
) = (roundup (offset
+ TLS_STATIC_SURPLUS
, max_align
)
201 /* The TLS blocks start right after the TCB. */
202 size_t offset
= TLS_TCB_SIZE
;
204 for (size_t cnt
= 0; slotinfo
[cnt
].map
!= NULL
; ++cnt
)
206 assert (cnt
< GL(dl_tls_dtv_slotinfo_list
)->len
);
208 size_t firstbyte
= (-slotinfo
[cnt
].map
->l_tls_firstbyte_offset
209 & (slotinfo
[cnt
].map
->l_tls_align
- 1));
211 max_align
= MAX (max_align
, slotinfo
[cnt
].map
->l_tls_align
);
213 if (slotinfo
[cnt
].map
->l_tls_blocksize
<= freetop
- freebottom
)
215 off
= roundup (freebottom
, slotinfo
[cnt
].map
->l_tls_align
);
216 if (off
- freebottom
< firstbyte
)
217 off
+= slotinfo
[cnt
].map
->l_tls_align
;
218 if (off
+ slotinfo
[cnt
].map
->l_tls_blocksize
- firstbyte
<= freetop
)
220 slotinfo
[cnt
].map
->l_tls_offset
= off
- firstbyte
;
221 freebottom
= (off
+ slotinfo
[cnt
].map
->l_tls_blocksize
227 off
= roundup (offset
, slotinfo
[cnt
].map
->l_tls_align
);
228 if (off
- offset
< firstbyte
)
229 off
+= slotinfo
[cnt
].map
->l_tls_align
;
231 slotinfo
[cnt
].map
->l_tls_offset
= off
- firstbyte
;
232 if (off
- firstbyte
- offset
> freetop
- freebottom
)
235 freetop
= off
- firstbyte
;
238 offset
= off
+ slotinfo
[cnt
].map
->l_tls_blocksize
- firstbyte
;
241 GL(dl_tls_static_used
) = offset
;
242 GL(dl_tls_static_size
) = roundup (offset
+ TLS_STATIC_SURPLUS
,
245 # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
248 /* The alignment requirement for the static TLS block. */
249 GL(dl_tls_static_align
) = max_align
;
253 /* This is called only when the data structure setup was skipped at startup,
254 when there was no need for it then. Now we have dynamically loaded
255 something needing TLS, or libpthread needs it. */
260 assert (GL(dl_tls_dtv_slotinfo_list
) == NULL
);
261 assert (GL(dl_tls_max_dtv_idx
) == 0);
263 const size_t nelem
= 2 + TLS_SLOTINFO_SURPLUS
;
265 GL(dl_tls_dtv_slotinfo_list
)
266 = calloc (1, (sizeof (struct dtv_slotinfo_list
)
267 + nelem
* sizeof (struct dtv_slotinfo
)));
268 if (GL(dl_tls_dtv_slotinfo_list
) == NULL
)
271 GL(dl_tls_dtv_slotinfo_list
)->len
= nelem
;
273 /* Number of elements in the static TLS block. It can't be zero
274 because of various assumptions. The one element is null. */
275 GL(dl_tls_static_nelem
) = GL(dl_tls_max_dtv_idx
) = 1;
277 /* This initializes more variables for us. */
278 _dl_determine_tlsoffset ();
282 rtld_hidden_def (_dl_tls_setup
)
287 allocate_dtv (void *result
)
292 /* We allocate a few more elements in the dtv than are needed for the
293 initial set of modules. This should avoid in most cases expansions
295 dtv_length
= GL(dl_tls_max_dtv_idx
) + DTV_SURPLUS
;
296 dtv
= calloc (dtv_length
+ 2, sizeof (dtv_t
));
299 /* This is the initial length of the dtv. */
300 dtv
[0].counter
= dtv_length
;
302 /* The rest of the dtv (including the generation counter) is
303 Initialize with zero to indicate nothing there. */
305 /* Add the dtv to the thread data structures. */
306 INSTALL_DTV (result
, dtv
);
315 /* Get size and alignment requirements of the static TLS block. */
318 _dl_get_tls_static_info (size_t *sizep
, size_t *alignp
)
320 *sizep
= GL(dl_tls_static_size
);
321 *alignp
= GL(dl_tls_static_align
);
327 _dl_allocate_tls_storage (void)
330 size_t size
= GL(dl_tls_static_size
);
334 [ TLS_PRE_TCB_SIZE ] [ TLS_TCB_SIZE ] [ TLS blocks ]
335 ^ This should be returned. */
336 size
+= (TLS_PRE_TCB_SIZE
+ GL(dl_tls_static_align
) - 1)
337 & ~(GL(dl_tls_static_align
) - 1);
340 /* Allocate a correctly aligned chunk of memory. */
341 result
= __libc_memalign (GL(dl_tls_static_align
), size
);
342 if (__builtin_expect (result
!= NULL
, 1))
344 /* Allocate the DTV. */
345 void *allocated
= result
;
348 /* The TCB follows the TLS blocks. */
349 result
= (char *) result
+ size
- TLS_TCB_SIZE
;
351 /* Clear the TCB data structure. We can't ask the caller (i.e.
352 libpthread) to do it, because we will initialize the DTV et al. */
353 memset (result
, '\0', TLS_TCB_SIZE
);
355 result
= (char *) result
+ size
- GL(dl_tls_static_size
);
357 /* Clear the TCB data structure and TLS_PRE_TCB_SIZE bytes before it.
358 We can't ask the caller (i.e. libpthread) to do it, because we will
359 initialize the DTV et al. */
360 memset ((char *) result
- TLS_PRE_TCB_SIZE
, '\0',
361 TLS_PRE_TCB_SIZE
+ TLS_TCB_SIZE
);
364 result
= allocate_dtv (result
);
375 _dl_allocate_tls_init (void *result
)
378 /* The memory allocation failed. */
381 dtv_t
*dtv
= GET_DTV (result
);
382 struct dtv_slotinfo_list
*listp
;
386 /* We have to prepare the dtv for all currently loaded modules using
387 TLS. For those which are dynamically loaded we add the values
388 indicating deferred allocation. */
389 listp
= GL(dl_tls_dtv_slotinfo_list
);
394 for (cnt
= total
== 0 ? 1 : 0; cnt
< listp
->len
; ++cnt
)
396 struct link_map
*map
;
399 /* Check for the total number of used slots. */
400 if (total
+ cnt
> GL(dl_tls_max_dtv_idx
))
403 map
= listp
->slotinfo
[cnt
].map
;
408 /* Keep track of the maximum generation number. This might
409 not be the generation counter. */
410 maxgen
= MAX (maxgen
, listp
->slotinfo
[cnt
].gen
);
412 if (map
->l_tls_offset
== NO_TLS_OFFSET
413 || map
->l_tls_offset
== FORCED_DYNAMIC_TLS_OFFSET
)
415 /* For dynamically loaded modules we simply store
416 the value indicating deferred allocation. */
417 dtv
[map
->l_tls_modid
].pointer
.val
= TLS_DTV_UNALLOCATED
;
418 dtv
[map
->l_tls_modid
].pointer
.is_static
= false;
422 assert (map
->l_tls_modid
== cnt
);
423 assert (map
->l_tls_blocksize
>= map
->l_tls_initimage_size
);
425 assert ((size_t) map
->l_tls_offset
>= map
->l_tls_blocksize
);
426 dest
= (char *) result
- map
->l_tls_offset
;
428 dest
= (char *) result
+ map
->l_tls_offset
;
430 # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
433 /* Copy the initialization image and clear the BSS part. */
434 dtv
[map
->l_tls_modid
].pointer
.val
= dest
;
435 dtv
[map
->l_tls_modid
].pointer
.is_static
= true;
436 memset (__mempcpy (dest
, map
->l_tls_initimage
,
437 map
->l_tls_initimage_size
), '\0',
438 map
->l_tls_blocksize
- map
->l_tls_initimage_size
);
442 if (total
>= GL(dl_tls_max_dtv_idx
))
446 assert (listp
!= NULL
);
449 /* The DTV version is up-to-date now. */
450 dtv
[0].counter
= maxgen
;
454 rtld_hidden_def (_dl_allocate_tls_init
)
458 _dl_allocate_tls (void *mem
)
460 return _dl_allocate_tls_init (mem
== NULL
461 ? _dl_allocate_tls_storage ()
462 : allocate_dtv (mem
));
464 rtld_hidden_def (_dl_allocate_tls
)
469 _dl_deallocate_tls (void *tcb
, bool dealloc_tcb
)
471 dtv_t
*dtv
= GET_DTV (tcb
);
473 /* We need to free the memory allocated for non-static TLS. */
474 for (size_t cnt
= 0; cnt
< dtv
[-1].counter
; ++cnt
)
475 if (! dtv
[1 + cnt
].pointer
.is_static
476 && dtv
[1 + cnt
].pointer
.val
!= TLS_DTV_UNALLOCATED
)
477 free (dtv
[1 + cnt
].pointer
.val
);
479 /* The array starts with dtv[-1]. */
481 if (dtv
!= GL(dl_initial_dtv
))
488 /* The TCB follows the TLS blocks. Back up to free the whole block. */
489 tcb
-= GL(dl_tls_static_size
) - TLS_TCB_SIZE
;
491 /* Back up the TLS_PRE_TCB_SIZE bytes. */
492 tcb
-= (TLS_PRE_TCB_SIZE
+ GL(dl_tls_static_align
) - 1)
493 & ~(GL(dl_tls_static_align
) - 1);
498 rtld_hidden_def (_dl_deallocate_tls
)
502 /* The __tls_get_addr function has two basic forms which differ in the
503 arguments. The IA-64 form takes two parameters, the module ID and
504 offset. The form used, among others, on IA-32 takes a reference to
505 a special structure which contain the same information. The second
506 form seems to be more often used (in the moment) so we default to
507 it. Users of the IA-64 form have to provide adequate definitions
508 of the following macros. */
509 # ifndef GET_ADDR_ARGS
510 # define GET_ADDR_ARGS tls_index *ti
511 # define GET_ADDR_PARAM ti
513 # ifndef GET_ADDR_MODULE
514 # define GET_ADDR_MODULE ti->ti_module
516 # ifndef GET_ADDR_OFFSET
517 # define GET_ADDR_OFFSET ti->ti_offset
522 allocate_and_init (struct link_map
*map
)
526 newp
= __libc_memalign (map
->l_tls_align
, map
->l_tls_blocksize
);
530 /* Initialize the memory. */
531 memset (__mempcpy (newp
, map
->l_tls_initimage
, map
->l_tls_initimage_size
),
532 '\0', map
->l_tls_blocksize
- map
->l_tls_initimage_size
);
539 _dl_update_slotinfo (unsigned long int req_modid
)
541 struct link_map
*the_map
= NULL
;
542 dtv_t
*dtv
= THREAD_DTV ();
544 /* The global dl_tls_dtv_slotinfo array contains for each module
545 index the generation counter current when the entry was created.
546 This array never shrinks so that all module indices which were
547 valid at some time can be used to access it. Before the first
548 use of a new module index in this function the array was extended
549 appropriately. Access also does not have to be guarded against
550 modifications of the array. It is assumed that pointer-size
551 values can be read atomically even in SMP environments. It is
552 possible that other threads at the same time dynamically load
553 code and therefore add to the slotinfo list. This is a problem
554 since we must not pick up any information about incomplete work.
555 The solution to this is to ignore all dtv slots which were
556 created after the one we are currently interested. We know that
557 dynamic loading for this module is completed and this is the last
558 load operation we know finished. */
559 unsigned long int idx
= req_modid
;
560 struct dtv_slotinfo_list
*listp
= GL(dl_tls_dtv_slotinfo_list
);
562 while (idx
>= listp
->len
)
568 if (dtv
[0].counter
< listp
->slotinfo
[idx
].gen
)
570 /* The generation counter for the slot is higher than what the
571 current dtv implements. We have to update the whole dtv but
572 only those entries with a generation counter <= the one for
573 the entry we need. */
574 size_t new_gen
= listp
->slotinfo
[idx
].gen
;
577 /* We have to look through the entire dtv slotinfo list. */
578 listp
= GL(dl_tls_dtv_slotinfo_list
);
581 for (size_t cnt
= total
== 0 ? 1 : 0; cnt
< listp
->len
; ++cnt
)
583 size_t gen
= listp
->slotinfo
[cnt
].gen
;
586 /* This is a slot for a generation younger than the
587 one we are handling now. It might be incompletely
588 set up so ignore it. */
591 /* If the entry is older than the current dtv layout we
592 know we don't have to handle it. */
593 if (gen
<= dtv
[0].counter
)
596 /* If there is no map this means the entry is empty. */
597 struct link_map
*map
= listp
->slotinfo
[cnt
].map
;
600 /* If this modid was used at some point the memory
601 might still be allocated. */
602 if (! dtv
[total
+ cnt
].pointer
.is_static
603 && dtv
[total
+ cnt
].pointer
.val
!= TLS_DTV_UNALLOCATED
)
605 free (dtv
[total
+ cnt
].pointer
.val
);
606 dtv
[total
+ cnt
].pointer
.val
= TLS_DTV_UNALLOCATED
;
612 /* Check whether the current dtv array is large enough. */
613 size_t modid
= map
->l_tls_modid
;
614 assert (total
+ cnt
== modid
);
615 if (dtv
[-1].counter
< modid
)
617 /* Reallocate the dtv. */
619 size_t newsize
= GL(dl_tls_max_dtv_idx
) + DTV_SURPLUS
;
620 size_t oldsize
= dtv
[-1].counter
;
622 assert (map
->l_tls_modid
<= newsize
);
624 if (dtv
== GL(dl_initial_dtv
))
626 /* This is the initial dtv that was allocated
627 during rtld startup using the dl-minimal.c
628 malloc instead of the real malloc. We can't
629 free it, we have to abandon the old storage. */
631 newp
= malloc ((2 + newsize
) * sizeof (dtv_t
));
634 memcpy (newp
, &dtv
[-1], (2 + oldsize
) * sizeof (dtv_t
));
638 newp
= realloc (&dtv
[-1],
639 (2 + newsize
) * sizeof (dtv_t
));
644 newp
[0].counter
= newsize
;
646 /* Clear the newly allocated part. */
647 memset (newp
+ 2 + oldsize
, '\0',
648 (newsize
- oldsize
) * sizeof (dtv_t
));
650 /* Point dtv to the generation counter. */
653 /* Install this new dtv in the thread data
655 INSTALL_NEW_DTV (dtv
);
658 /* If there is currently memory allocate for this
659 dtv entry free it. */
660 /* XXX Ideally we will at some point create a memory
662 if (! dtv
[modid
].pointer
.is_static
663 && dtv
[modid
].pointer
.val
!= TLS_DTV_UNALLOCATED
)
664 /* Note that free is called for NULL is well. We
665 deallocate even if it is this dtv entry we are
666 supposed to load. The reason is that we call
667 memalign and not malloc. */
668 free (dtv
[modid
].pointer
.val
);
670 /* This module is loaded dynamically- We defer memory
672 dtv
[modid
].pointer
.is_static
= false;
673 dtv
[modid
].pointer
.val
= TLS_DTV_UNALLOCATED
;
675 if (modid
== req_modid
)
681 while ((listp
= listp
->next
) != NULL
);
683 /* This will be the new maximum generation counter. */
684 dtv
[0].counter
= new_gen
;
692 __attribute_noinline__
693 tls_get_addr_tail (GET_ADDR_ARGS
, dtv_t
*dtv
, struct link_map
*the_map
)
695 /* The allocation was deferred. Do it now. */
698 /* Find the link map for this module. */
699 size_t idx
= GET_ADDR_MODULE
;
700 struct dtv_slotinfo_list
*listp
= GL(dl_tls_dtv_slotinfo_list
);
702 while (idx
>= listp
->len
)
708 the_map
= listp
->slotinfo
[idx
].map
;
712 /* Make sure that, if a dlopen running in parallel forces the
713 variable into static storage, we'll wait until the address in the
714 static TLS block is set up, and use that. If we're undecided
715 yet, make sure we make the decision holding the lock as well. */
716 if (__builtin_expect (the_map
->l_tls_offset
717 != FORCED_DYNAMIC_TLS_OFFSET
, 0))
719 __rtld_lock_lock_recursive (GL(dl_load_lock
));
720 if (__builtin_expect (the_map
->l_tls_offset
== NO_TLS_OFFSET
, 1))
722 the_map
->l_tls_offset
= FORCED_DYNAMIC_TLS_OFFSET
;
723 __rtld_lock_unlock_recursive (GL(dl_load_lock
));
727 __rtld_lock_unlock_recursive (GL(dl_load_lock
));
728 if (__builtin_expect (the_map
->l_tls_offset
729 != FORCED_DYNAMIC_TLS_OFFSET
, 1))
731 void *p
= dtv
[GET_ADDR_MODULE
].pointer
.val
;
732 if (__builtin_expect (p
== TLS_DTV_UNALLOCATED
, 0))
735 return (char *) p
+ GET_ADDR_OFFSET
;
739 void *p
= dtv
[GET_ADDR_MODULE
].pointer
.val
= allocate_and_init (the_map
);
740 dtv
[GET_ADDR_MODULE
].pointer
.is_static
= false;
742 return (char *) p
+ GET_ADDR_OFFSET
;
746 static struct link_map
*
747 __attribute_noinline__
748 update_get_addr (GET_ADDR_ARGS
)
750 struct link_map
*the_map
= _dl_update_slotinfo (GET_ADDR_MODULE
);
751 dtv_t
*dtv
= THREAD_DTV ();
753 void *p
= dtv
[GET_ADDR_MODULE
].pointer
.val
;
755 if (__builtin_expect (p
== TLS_DTV_UNALLOCATED
, 0))
756 return tls_get_addr_tail (GET_ADDR_PARAM
, dtv
, the_map
);
758 return (void *) p
+ GET_ADDR_OFFSET
;
762 /* The generic dynamic and local dynamic model cannot be used in
763 statically linked applications. */
765 __tls_get_addr (GET_ADDR_ARGS
)
767 dtv_t
*dtv
= THREAD_DTV ();
769 if (__builtin_expect (dtv
[0].counter
!= GL(dl_tls_generation
), 0))
770 return update_get_addr (GET_ADDR_PARAM
);
772 void *p
= dtv
[GET_ADDR_MODULE
].pointer
.val
;
774 if (__builtin_expect (p
== TLS_DTV_UNALLOCATED
, 0))
775 return tls_get_addr_tail (GET_ADDR_PARAM
, dtv
, NULL
);
777 return (char *) p
+ GET_ADDR_OFFSET
;
782 /* Look up the module's TLS block as for __tls_get_addr,
783 but never touch anything. Return null if it's not allocated yet. */
785 _dl_tls_get_addr_soft (struct link_map
*l
)
787 if (__builtin_expect (l
->l_tls_modid
== 0, 0))
788 /* This module has no TLS segment. */
791 dtv_t
*dtv
= THREAD_DTV ();
792 if (__builtin_expect (dtv
[0].counter
!= GL(dl_tls_generation
), 0))
794 /* This thread's DTV is not completely current,
795 but it might already cover this module. */
797 if (l
->l_tls_modid
>= dtv
[-1].counter
)
801 size_t idx
= l
->l_tls_modid
;
802 struct dtv_slotinfo_list
*listp
= GL(dl_tls_dtv_slotinfo_list
);
803 while (idx
>= listp
->len
)
809 /* We've reached the slot for this module.
810 If its generation counter is higher than the DTV's,
811 this thread does not know about this module yet. */
812 if (dtv
[0].counter
< listp
->slotinfo
[idx
].gen
)
816 void *data
= dtv
[l
->l_tls_modid
].pointer
.val
;
817 if (__builtin_expect (data
== TLS_DTV_UNALLOCATED
, 0))
818 /* The DTV is current, but this thread has not yet needed
819 to allocate this module's segment. */
827 _dl_add_to_slotinfo (struct link_map
*l
)
829 /* Now that we know the object is loaded successfully add
830 modules containing TLS data to the dtv info table. We
831 might have to increase its size. */
832 struct dtv_slotinfo_list
*listp
;
833 struct dtv_slotinfo_list
*prevp
;
834 size_t idx
= l
->l_tls_modid
;
836 /* Find the place in the dtv slotinfo list. */
837 listp
= GL(dl_tls_dtv_slotinfo_list
);
838 prevp
= NULL
; /* Needed to shut up gcc. */
841 /* Does it fit in the array of this list element? */
842 if (idx
< listp
->len
)
848 while (listp
!= NULL
);
852 /* When we come here it means we have to add a new element
853 to the slotinfo list. And the new module must be in
857 listp
= prevp
->next
= (struct dtv_slotinfo_list
*)
858 malloc (sizeof (struct dtv_slotinfo_list
)
859 + TLS_SLOTINFO_SURPLUS
* sizeof (struct dtv_slotinfo
));
862 /* We ran out of memory. We will simply fail this
863 call but don't undo anything we did so far. The
864 application will crash or be terminated anyway very
867 /* We have to do this since some entries in the dtv
868 slotinfo array might already point to this
870 ++GL(dl_tls_generation
);
872 _dl_signal_error (ENOMEM
, "dlopen", NULL
, N_("\
873 cannot create TLS data structures"));
876 listp
->len
= TLS_SLOTINFO_SURPLUS
;
878 memset (listp
->slotinfo
, '\0',
879 TLS_SLOTINFO_SURPLUS
* sizeof (struct dtv_slotinfo
));
882 /* Add the information into the slotinfo data structure. */
883 listp
->slotinfo
[idx
].map
= l
;
884 listp
->slotinfo
[idx
].gen
= GL(dl_tls_generation
) + 1;