Ignore:
File:
1 edited

Legend:

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

    r31399f3 r58563585  
    3434 * Support for thread-local storage, as described in:
    3535 *      Drepper U.: ELF Handling For Thread-Local Storage, 2005
    36  *
    37  * Only static model is supported.
    38  */
     36 */
    3937
     38#include <align.h>
    4039#include <tls.h>
    4140#include <malloc.h>
    4241#include <str.h>
    43 #include <align.h>
    4442#include <unistd.h>
    4543
     44#ifdef CONFIG_RTLD
     45#include <rtld/rtld.h>
     46#endif
     47
     48size_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 */
     58void *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
    4667/** 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.
    5068 *
    5169 * @return Pointer to TCB.
     
    5674        tcb_t *tcb;
    5775        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
    5881       
    5982        tcb = tls_alloc_arch(&data, tls_size);
     
    7699void tls_free(tcb_t *tcb)
    77100{
    78         size_t tls_size = &_tbss_end - &_tdata_start;
    79         tls_free_arch(tcb, tls_size);
     101#ifdef CONFIG_RTLD
     102        free(tcb->dtv);
     103#endif
     104        tls_free_arch(tcb, tls_get_size());
    80105}
    81106
     
    89114tcb_t *tls_alloc_variant_1(void **data, size_t size)
    90115{
    91         tcb_t *result;
     116        tcb_t *tcb;
    92117
    93         result = malloc(sizeof(tcb_t) + size);
    94         if (!result)
     118        tcb = malloc(sizeof(tcb_t) + size);
     119        if (!tcb)
    95120                return NULL;
    96         *data = ((void *)result) + sizeof(tcb_t);
     121       
     122        *data = ((void *) tcb) + sizeof(tcb_t);
     123#ifdef CONFIG_RTLD
     124        tcb->dtv = NULL;
     125#endif
    97126
    98         return result;
     127        return tcb;
    99128}
    100129
     
    124153        size = ALIGN_UP(size, &_tls_alignment);
    125154        *data = memalign((uintptr_t) &_tls_alignment, sizeof(tcb_t) + size);
    126         if (!*data)
     155        if (*data == NULL)
    127156                return NULL;
    128157        tcb = (tcb_t *) (*data + size);
    129158        tcb->self = tcb;
     159#ifdef CONFIG_RTLD
     160        tcb->dtv = NULL;
     161#endif
    130162
    131163        return tcb;
Note: See TracChangeset for help on using the changeset viewer.