Changeset 40abf56 in mainline for uspace/lib/c/generic/fibril.c
- Timestamp:
- 2018-07-18T19:42:28Z (6 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9bde0d5
- Parents:
- 0b05082
- git-author:
- Jiří Zárevúcky <jiri.zarevucky@…> (2018-07-18 19:05:08)
- git-committer:
- Jiří Zárevúcky <jiri.zarevucky@…> (2018-07-18 19:42:28)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/fibril.c
r0b05082 r40abf56 50 50 #include "private/thread.h" 51 51 #include "private/fibril.h" 52 52 #include "private/libc.h" 53 53 54 54 /** … … 85 85 } 86 86 87 /** Setup fibril information into TCB structure 88 * 89 */ 90 fibril_t *fibril_setup(void) 91 { 92 tcb_t *tcb = tls_make(); 87 /** Allocate a fibril structure and TCB, but don't do anything else with it. */ 88 fibril_t *fibril_alloc(void) 89 { 90 tcb_t *tcb = tls_make(__progsymbols.elfstart); 93 91 if (!tcb) 94 92 return NULL; … … 102 100 tcb->fibril_data = fibril; 103 101 fibril->tcb = tcb; 104 105 /* 106 * We are called before __tcb_set(), so we need to use 107 * futex_down/up() instead of futex_lock/unlock() that 108 * may attempt to access TLS. 109 */ 110 futex_down(&fibril_futex); 111 list_append(&fibril->all_link, &fibril_list); 112 futex_up(&fibril_futex); 113 102 fibril->is_freeable = true; 103 104 fibril_setup(fibril); 114 105 return fibril; 106 } 107 108 /** 109 * Put the fibril into fibril_list. 110 */ 111 void fibril_setup(fibril_t *f) 112 { 113 futex_lock(&fibril_futex); 114 list_append(&f->all_link, &fibril_list); 115 futex_unlock(&fibril_futex); 115 116 } 116 117 … … 122 123 if (!locked) 123 124 futex_unlock(&fibril_futex); 124 tls_free(fibril->tcb); 125 free(fibril); 125 126 if (fibril->is_freeable) { 127 tls_free(fibril->tcb); 128 free(fibril); 129 } 126 130 } 127 131 … … 239 243 fibril_t *fibril; 240 244 241 fibril = fibril_ setup();245 fibril = fibril_alloc(); 242 246 if (fibril == NULL) 243 247 return 0; … … 248 252 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE | AS_AREA_GUARD | 249 253 AS_AREA_LATE_RESERVE, AS_AREA_UNPAGED); 250 if (fibril->stack == (void *) -1) {254 if (fibril->stack == AS_MAP_FAILED) { 251 255 fibril_teardown(fibril, false); 252 256 return 0; … … 324 328 fibril_t *fibril_self(void) 325 329 { 326 return __tcb_get()->fibril_data; 330 assert(__tcb_is_set()); 331 tcb_t *tcb = __tcb_get(); 332 assert(tcb->fibril_data); 333 return tcb->fibril_data; 327 334 } 328 335
Note:
See TracChangeset
for help on using the changeset viewer.