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