Changes in uspace/lib/c/generic/tls.c [3a9414e:31399f3] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/tls.c
r3a9414e r31399f3 34 34 * Support for thread-local storage, as described in: 35 35 * Drepper U.: ELF Handling For Thread-Local Storage, 2005 36 */ 36 * 37 * Only static model is supported. 38 */ 37 39 38 40 #include <tls.h> 39 41 #include <malloc.h> 40 42 #include <str.h> 43 #include <align.h> 41 44 #include <unistd.h> 42 45 43 #ifdef CONFIG_RTLD44 #include <rtld/rtld.h>45 #endif46 47 size_t tls_get_size(void)48 {49 #ifdef CONFIG_RTLD50 if (runtime_env != NULL)51 return runtime_env->tls_size;52 #endif53 return &_tbss_end - &_tdata_start;54 }55 56 /** Get address of static TLS block */57 void *tls_get(void)58 {59 #ifdef CONFIG_TLS_VARIANT_160 return (uint8_t *)__tcb_get() + sizeof(tcb_t);61 #else /* CONFIG_TLS_VARIANT_2 */62 return (uint8_t *)__tcb_get() - tls_get_size();63 #endif64 }65 66 46 /** 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. 67 50 * 68 51 * @return Pointer to TCB. … … 73 56 tcb_t *tcb; 74 57 size_t tls_size = &_tbss_end - &_tdata_start; 75 76 #ifdef CONFIG_RTLD 77 if (runtime_env != NULL) 78 return rtld_tls_make(runtime_env); 79 #endif 58 80 59 tcb = tls_alloc_arch(&data, tls_size); 81 60 if (!tcb) 82 61 return NULL; 83 62 84 63 /* 85 64 * Copy thread local data from the initialization image. … … 97 76 void tls_free(tcb_t *tcb) 98 77 { 99 #ifdef CONFIG_RTLD 100 free(tcb->dtv); 101 #endif 102 tls_free_arch(tcb, tls_get_size()); 78 size_t tls_size = &_tbss_end - &_tdata_start; 79 tls_free_arch(tcb, tls_size); 103 80 } 104 81 … … 112 89 tcb_t *tls_alloc_variant_1(void **data, size_t size) 113 90 { 114 tcb_t * tcb;91 tcb_t *result; 115 92 116 tcb= malloc(sizeof(tcb_t) + size);117 if (! tcb)93 result = malloc(sizeof(tcb_t) + size); 94 if (!result) 118 95 return NULL; 119 *data = ((void *)tcb) + sizeof(tcb_t); 120 #ifdef CONFIG_RTLD 121 tcb->dtv = NULL; 122 #endif 96 *data = ((void *)result) + sizeof(tcb_t); 123 97 124 return tcb;98 return result; 125 99 } 126 100 … … 147 121 { 148 122 tcb_t *tcb; 149 150 *data = malloc(sizeof(tcb_t) + size); 151 if (*data == NULL) 123 124 size = ALIGN_UP(size, &_tls_alignment); 125 *data = memalign((uintptr_t) &_tls_alignment, sizeof(tcb_t) + size); 126 if (!*data) 152 127 return NULL; 153 128 tcb = (tcb_t *) (*data + size); 154 129 tcb->self = tcb; 155 #ifdef CONFIG_RTLD156 tcb->dtv = NULL;157 #endif158 130 159 131 return tcb; … … 167 139 void tls_free_variant_2(tcb_t *tcb, size_t size) 168 140 { 141 size = ALIGN_UP(size, &_tls_alignment); 169 142 void *start = ((void *) tcb) - size; 170 143 free(start);
Note:
See TracChangeset
for help on using the changeset viewer.