Changes in uspace/lib/c/generic/tls.c [d2bb25e7:31399f3] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/tls.c
rd2bb25e7 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 free(tcb->dtv);100 tls_free_arch(tcb, tls_ get_size());78 size_t tls_size = &_tbss_end - &_tdata_start; 79 tls_free_arch(tcb, tls_size); 101 80 } 102 81 … … 110 89 tcb_t *tls_alloc_variant_1(void **data, size_t size) 111 90 { 112 tcb_t * tcb;91 tcb_t *result; 113 92 114 tcb= malloc(sizeof(tcb_t) + size);115 if (! tcb)93 result = malloc(sizeof(tcb_t) + size); 94 if (!result) 116 95 return NULL; 117 *data = ((void *)tcb) + sizeof(tcb_t); 118 tcb->dtv = NULL; 96 *data = ((void *)result) + sizeof(tcb_t); 119 97 120 return tcb;98 return result; 121 99 } 122 100 … … 143 121 { 144 122 tcb_t *tcb; 145 146 *data = malloc(sizeof(tcb_t) + size); 147 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) 148 127 return NULL; 149 128 tcb = (tcb_t *) (*data + size); 150 129 tcb->self = tcb; 151 tcb->dtv = NULL;152 130 153 131 return tcb; … … 161 139 void tls_free_variant_2(tcb_t *tcb, size_t size) 162 140 { 141 size = ALIGN_UP(size, &_tls_alignment); 163 142 void *start = ((void *) tcb) - size; 164 143 free(start);
Note:
See TracChangeset
for help on using the changeset viewer.