Changes in uspace/lib/c/generic/tls.c [31399f3:58563585] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/tls.c
r31399f3 r58563585 34 34 * Support for thread-local storage, as described in: 35 35 * Drepper U.: ELF Handling For Thread-Local Storage, 2005 36 * 37 * Only static model is supported. 38 */ 36 */ 39 37 38 #include <align.h> 40 39 #include <tls.h> 41 40 #include <malloc.h> 42 41 #include <str.h> 43 #include <align.h>44 42 #include <unistd.h> 45 43 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 46 67 /** Create TLS (Thread Local Storage) data structures. 47 *48 * The code requires, that sections .tdata and .tbss are adjacent. It may be49 * changed in the future.50 68 * 51 69 * @return Pointer to TCB. … … 56 74 tcb_t *tcb; 57 75 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 81 59 82 tcb = tls_alloc_arch(&data, tls_size); … … 76 99 void tls_free(tcb_t *tcb) 77 100 { 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()); 80 105 } 81 106 … … 89 114 tcb_t *tls_alloc_variant_1(void **data, size_t size) 90 115 { 91 tcb_t * result;116 tcb_t *tcb; 92 117 93 result= malloc(sizeof(tcb_t) + size);94 if (! result)118 tcb = malloc(sizeof(tcb_t) + size); 119 if (!tcb) 95 120 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 97 126 98 return result;127 return tcb; 99 128 } 100 129 … … 124 153 size = ALIGN_UP(size, &_tls_alignment); 125 154 *data = memalign((uintptr_t) &_tls_alignment, sizeof(tcb_t) + size); 126 if ( !*data)155 if (*data == NULL) 127 156 return NULL; 128 157 tcb = (tcb_t *) (*data + size); 129 158 tcb->self = tcb; 159 #ifdef CONFIG_RTLD 160 tcb->dtv = NULL; 161 #endif 130 162 131 163 return tcb;
Note:
See TracChangeset
for help on using the changeset viewer.