Changes in uspace/lib/c/generic/fibril.c [c1b979a:4d11204] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/fibril.c
rc1b979a r4d11204 49 49 #include <assert.h> 50 50 #include <async.h> 51 #include <futex.h> 52 53 #ifdef FUTEX_UPGRADABLE 54 #include <rcu.h> 55 #endif 51 56 52 57 /** 53 58 * This futex serializes access to ready_list, 54 * serialized_list and manager_list.55 */ 56 static atomic_t fibril_futex = FUTEX_INITIALIZER;59 * serialized_list, manager_list and fibril_list. 60 */ 61 static futex_t fibril_futex = FUTEX_INITIALIZER; 57 62 58 63 static LIST_INITIALIZE(ready_list); … … 83 88 { 84 89 fibril_t *fibril = __tcb_get()->fibril_data; 90 91 #ifdef FUTEX_UPGRADABLE 92 rcu_register_fibril(); 93 #endif 85 94 86 95 /* Call the implementing function. */ … … 117 126 118 127 fibril->waits_for = NULL; 128 129 futex_lock(&fibril_futex); 119 130 list_append(&fibril->all_link, &fibril_list); 131 futex_unlock(&fibril_futex); 120 132 121 133 return fibril; 122 134 } 123 135 124 void fibril_teardown(fibril_t *fibril) 125 { 136 void fibril_teardown(fibril_t *fibril, bool locked) 137 { 138 if (!locked) 139 futex_lock(&fibril_futex); 126 140 list_remove(&fibril->all_link); 141 if (!locked) 142 futex_unlock(&fibril_futex); 127 143 tls_free(fibril->tcb); 128 144 free(fibril); … … 146 162 int retval = 0; 147 163 148 futex_ down(&fibril_futex);164 futex_lock(&fibril_futex); 149 165 150 166 if (stype == FIBRIL_PREEMPT && list_empty(&ready_list)) … … 168 184 if ((stype == FIBRIL_TO_MANAGER) || (stype == FIBRIL_FROM_DEAD)) { 169 185 while (list_empty(&manager_list)) { 170 futex_u p(&fibril_futex);186 futex_unlock(&fibril_futex); 171 187 async_create_manager(); 172 futex_ down(&fibril_futex);188 futex_lock(&fibril_futex); 173 189 } 174 190 } … … 199 215 as_area_destroy(stack); 200 216 } 201 fibril_teardown(srcf->clean_after_me );217 fibril_teardown(srcf->clean_after_me, true); 202 218 srcf->clean_after_me = NULL; 203 219 } 204 220 205 return 1; /* futex_u palready done here */221 return 1; /* futex_unlock already done here */ 206 222 } 207 223 … … 246 262 list_remove(&dstf->link); 247 263 248 futex_up(&fibril_futex); 264 futex_unlock(&fibril_futex); 265 266 #ifdef FUTEX_UPGRADABLE 267 if (stype == FIBRIL_FROM_DEAD) { 268 rcu_deregister_fibril(); 269 } 270 #endif 271 249 272 context_restore(&dstf->ctx); 250 273 /* not reached */ 251 274 252 275 ret_0: 253 futex_u p(&fibril_futex);276 futex_unlock(&fibril_futex); 254 277 return retval; 255 278 } … … 278 301 AS_AREA_LATE_RESERVE); 279 302 if (fibril->stack == (void *) -1) { 280 fibril_teardown(fibril );303 fibril_teardown(fibril, false); 281 304 return 0; 282 305 } … … 305 328 306 329 as_area_destroy(fibril->stack); 307 fibril_teardown(fibril );330 fibril_teardown(fibril, false); 308 331 } 309 332 … … 318 341 fibril_t *fibril = (fibril_t *) fid; 319 342 320 futex_ down(&fibril_futex);343 futex_lock(&fibril_futex); 321 344 322 345 if ((fibril->flags & FIBRIL_SERIALIZED)) … … 325 348 list_append(&fibril->link, &ready_list); 326 349 327 futex_u p(&fibril_futex);350 futex_unlock(&fibril_futex); 328 351 } 329 352 … … 338 361 fibril_t *fibril = (fibril_t *) fid; 339 362 340 futex_ down(&fibril_futex);363 futex_lock(&fibril_futex); 341 364 list_append(&fibril->link, &manager_list); 342 futex_u p(&fibril_futex);365 futex_unlock(&fibril_futex); 343 366 } 344 367 … … 346 369 void fibril_remove_manager(void) 347 370 { 348 futex_ down(&fibril_futex);371 futex_lock(&fibril_futex); 349 372 350 373 if (!list_empty(&manager_list)) 351 374 list_remove(list_first(&manager_list)); 352 375 353 futex_u p(&fibril_futex);376 futex_unlock(&fibril_futex); 354 377 } 355 378
Note:
See TracChangeset
for help on using the changeset viewer.