Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/tls.c

    r118a872 r31399f3  
    3434 * Support for thread-local storage, as described in:
    3535 *      Drepper U.: ELF Handling For Thread-Local Storage, 2005
    36  */
     36 *
     37 * Only static model is supported.
     38 */
    3739
    38 #include <align.h>
    3940#include <tls.h>
    4041#include <malloc.h>
    4142#include <str.h>
     43#include <align.h>
    4244#include <unistd.h>
    4345
    44 #ifdef CONFIG_RTLD
    45 #include <rtld/rtld.h>
    46 #endif
    47 
    48 size_t tls_get_size(void)
    49 {
    50 #ifdef CONFIG_RTLD
    51         if (runtime_env != NULL)
    52                 return runtime_env->tls_size;
    53 #endif
    54         return &_tbss_end - &_tdata_start;
    55 }
    56 
    57 /** Get address of static TLS block */
    58 void *tls_get(void)
    59 {
    60 #ifdef CONFIG_TLS_VARIANT_1
    61         return (uint8_t *)__tcb_get() + sizeof(tcb_t);
    62 #else /* CONFIG_TLS_VARIANT_2 */
    63         return (uint8_t *)__tcb_get() - tls_get_size();
    64 #endif
    65 }
    66 
    6746/** Create TLS (Thread Local Storage) data structures.
     47 *
     48 * The code requires, that sections .tdata and .tbss are adjacent. It may be
     49 * changed in the future.
    6850 *
    6951 * @return Pointer to TCB.
     
    7456        tcb_t *tcb;
    7557        size_t tls_size = &_tbss_end - &_tdata_start;
    76 
    77 #ifdef CONFIG_RTLD
    78         if (runtime_env != NULL)
    79                 return rtld_tls_make(runtime_env);
    80 #endif
     58       
    8159        tcb = tls_alloc_arch(&data, tls_size);
    8260        if (!tcb)
    8361                return NULL;
    84 
     62       
    8563        /*
    8664         * Copy thread local data from the initialization image.
     
    9876void tls_free(tcb_t *tcb)
    9977{
    100 #ifdef CONFIG_RTLD
    101         free(tcb->dtv);
    102 #endif
    103         tls_free_arch(tcb, tls_get_size());
     78        size_t tls_size = &_tbss_end - &_tdata_start;
     79        tls_free_arch(tcb, tls_size);
    10480}
    10581
     
    11389tcb_t *tls_alloc_variant_1(void **data, size_t size)
    11490{
    115         tcb_t *tcb;
     91        tcb_t *result;
    11692
    117         tcb = malloc(sizeof(tcb_t) + size);
    118         if (!tcb)
     93        result = malloc(sizeof(tcb_t) + size);
     94        if (!result)
    11995                return NULL;
    120         *data = ((void *)tcb) + sizeof(tcb_t);
    121 #ifdef CONFIG_RTLD
    122         tcb->dtv = NULL;
    123 #endif
     96        *data = ((void *)result) + sizeof(tcb_t);
    12497
    125         return tcb;
     98        return result;
    12699}
    127100
     
    148121{
    149122        tcb_t *tcb;
    150 
     123       
    151124        size = ALIGN_UP(size, &_tls_alignment);
    152125        *data = memalign((uintptr_t) &_tls_alignment, sizeof(tcb_t) + size);
    153         if (*data == NULL)
     126        if (!*data)
    154127                return NULL;
    155128        tcb = (tcb_t *) (*data + size);
    156129        tcb->self = tcb;
    157 #ifdef CONFIG_RTLD
    158         tcb->dtv = NULL;
    159 #endif
    160130
    161131        return tcb;
Note: See TracChangeset for help on using the changeset viewer.