Ignore:
File:
1 edited

Legend:

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

    r58563585 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
    8158       
    8259        tcb = tls_alloc_arch(&data, tls_size);
     
    9976void tls_free(tcb_t *tcb)
    10077{
    101 #ifdef CONFIG_RTLD
    102         free(tcb->dtv);
    103 #endif
    104         tls_free_arch(tcb, tls_get_size());
     78        size_t tls_size = &_tbss_end - &_tdata_start;
     79        tls_free_arch(tcb, tls_size);
    10580}
    10681
     
    11489tcb_t *tls_alloc_variant_1(void **data, size_t size)
    11590{
    116         tcb_t *tcb;
     91        tcb_t *result;
    11792
    118         tcb = malloc(sizeof(tcb_t) + size);
    119         if (!tcb)
     93        result = malloc(sizeof(tcb_t) + size);
     94        if (!result)
    12095                return NULL;
    121        
    122         *data = ((void *) tcb) + sizeof(tcb_t);
    123 #ifdef CONFIG_RTLD
    124         tcb->dtv = NULL;
    125 #endif
     96        *data = ((void *)result) + sizeof(tcb_t);
    12697
    127         return tcb;
     98        return result;
    12899}
    129100
     
    153124        size = ALIGN_UP(size, &_tls_alignment);
    154125        *data = memalign((uintptr_t) &_tls_alignment, sizeof(tcb_t) + size);
    155         if (*data == NULL)
     126        if (!*data)
    156127                return NULL;
    157128        tcb = (tcb_t *) (*data + size);
    158129        tcb->self = tcb;
    159 #ifdef CONFIG_RTLD
    160         tcb->dtv = NULL;
    161 #endif
    162130
    163131        return tcb;
Note: See TracChangeset for help on using the changeset viewer.