Changeset c4c5de5 in mainline for libc/generic/thread.c
- Timestamp:
- 2006-03-24T14:29:19Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8fe1cdb
- Parents:
- 520492a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libc/generic/thread.c
r520492a rc4c5de5 33 33 #include <kernel/proc/uarg.h> 34 34 #include <psthread.h> 35 #include <string.h> 35 36 36 37 #include <stdio.h> 37 void * __make_tls(void) 38 39 extern char _tdata_start; 40 extern char _tdata_end; 41 extern char _tbss_start; 42 extern char _tbss_end; 43 44 /** Create Thread Local storage area, return pointer to TCB(ThreadControlBlock) 45 * 46 * !! The code requires, that sections .tdata and .tbss are adjacent. 47 * It may be changed in the future. 48 */ 49 tcb_t * __make_tls(void) 38 50 { 39 psthread_data_t *pt; 51 void *data; 52 tcb_t *tcb; 53 size_t tls_size = &_tbss_end - &_tdata_start; 54 55 tcb = __alloc_tls(&data, tls_size); 56 57 memcpy(data, &_tdata_start, &_tdata_end - &_tdata_start); 58 memset(data + (&_tbss_start-&_tdata_start), &_tbss_end-&_tbss_start, 0); 40 59 41 pt = malloc(sizeof(psthread_data_t)); 42 pt->self = pt; 43 44 return pt; 60 return tcb; 45 61 } 46 62 47 void __free_tls( void *tls)63 void __free_tls(tcb_t *tcb) 48 64 { 49 free(tls); 65 size_t tls_size = &_tbss_end - &_tdata_start; 66 __free_tls_arch(tcb, tls_size); 50 67 } 51 68 … … 61 78 void __thread_main(uspace_arg_t *uarg) 62 79 { 80 tcb_t *tcb; 63 81 /* This should initialize the area according to TLS specicification */ 64 __tls_set(__make_tls()); 82 tcb = __make_tls(); 83 __tcb_set(tcb); 84 psthread_setup(tcb); 65 85 66 86 uarg->uspace_thread_function(uarg->uspace_thread_arg); … … 68 88 free(uarg); 69 89 70 __free_tls(__tls_get()); 90 psthread_teardown(tcb->pst_data); 91 __free_tls(tcb); 71 92 72 93 thread_exit(0);
Note:
See TracChangeset
for help on using the changeset viewer.