Changeset a35b458 in mainline for uspace/lib/c/generic/fibril.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/fibril.c
r3061bc1 ra35b458 77 77 rcu_register_fibril(); 78 78 #endif 79 79 80 80 /* Call the implementing function. */ 81 81 fibril->retval = fibril->func(fibril->arg); 82 82 83 83 futex_down(&async_futex); 84 84 fibril_switch(FIBRIL_FROM_DEAD); … … 94 94 if (!tcb) 95 95 return NULL; 96 96 97 97 fibril_t *fibril = malloc(sizeof(fibril_t)); 98 98 if (!fibril) { … … 100 100 return NULL; 101 101 } 102 102 103 103 tcb->fibril_data = fibril; 104 104 fibril->tcb = tcb; 105 105 106 106 fibril->func = NULL; 107 107 fibril->arg = NULL; … … 110 110 fibril->retval = 0; 111 111 fibril->flags = 0; 112 112 113 113 fibril->waits_for = NULL; 114 114 … … 123 123 list_append(&fibril->all_link, &fibril_list); 124 124 futex_up(&fibril_futex); 125 125 126 126 return fibril; 127 127 } … … 176 176 break; 177 177 } 178 178 179 179 fibril_t *srcf = __tcb_get()->fibril_data; 180 180 if (stype != FIBRIL_FROM_DEAD) { 181 181 182 182 /* Save current state */ 183 183 if (!context_save(&srcf->ctx)) { … … 202 202 srcf->clean_after_me = NULL; 203 203 } 204 204 205 205 return 1; /* futex_unlock already done here */ 206 206 } 207 207 208 208 /* Put the current fibril into the correct run list */ 209 209 switch (stype) { … … 226 226 } 227 227 } 228 228 229 229 fibril_t *dstf; 230 230 … … 235 235 dstf = list_get_instance(list_first(&manager_list), fibril_t, 236 236 link); 237 237 238 238 if (stype == FIBRIL_FROM_DEAD) 239 239 dstf->clean_after_me = srcf; … … 246 246 247 247 list_remove(&dstf->link); 248 248 249 249 futex_unlock(&fibril_futex); 250 250 251 251 #ifdef FUTEX_UPGRADABLE 252 252 if (stype == FIBRIL_FROM_DEAD) { … … 254 254 } 255 255 #endif 256 256 257 257 context_restore(&dstf->ctx); 258 258 /* not reached */ … … 271 271 { 272 272 fibril_t *fibril; 273 273 274 274 fibril = fibril_setup(); 275 275 if (fibril == NULL) 276 276 return 0; 277 277 278 278 size_t stack_size = (stksz == FIBRIL_DFLT_STK_SIZE) ? 279 279 stack_size_get() : stksz; … … 285 285 return 0; 286 286 } 287 287 288 288 fibril->func = func; 289 289 fibril->arg = arg; … … 307 307 { 308 308 fibril_t *fibril = (fibril_t *) fid; 309 309 310 310 as_area_destroy(fibril->stack); 311 311 fibril_teardown(fibril, false); … … 321 321 { 322 322 fibril_t *fibril = (fibril_t *) fid; 323 323 324 324 futex_lock(&fibril_futex); 325 325 list_append(&fibril->link, &ready_list); … … 336 336 { 337 337 fibril_t *fibril = (fibril_t *) fid; 338 338 339 339 futex_lock(&fibril_futex); 340 340 list_append(&fibril->link, &manager_list);
Note:
See TracChangeset
for help on using the changeset viewer.