- File:
-
- 1 edited
-
libcfa/src/concurrency/locks.cfa (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/locks.cfa
r4e83bb7 rae06e0b 237 237 // This pthread_cond_var member is called from the kernel, and therefore, cannot block, but it can spin. 238 238 lock( cond->lock __cfaabi_dbg_ctx2 ); 239 239 240 // this check is necessary to avoid a race condition since this timeout handler 240 241 // may still be called after a thread has been removed from the queue but … … 346 347 size_t recursion_count = queue_and_get_recursion(this, &info); 347 348 alarm_node_wrap(L) node_wrap = { t, 0`s, callback, &this, &info }; 348 unlock( lock );349 350 // registers alarm outside cond lock to avoid deadlock351 349 register_self( &node_wrap.alarm_node ); 350 unlock( lock ); 352 351 353 352 // blocks here … … 438 437 if ( ret ) { 439 438 info_thread(L) & popped = try_pop_front( blocked_threads ); 440 popped.signalled = true;441 439 on_notify(*popped.lock, popped.t); 442 440 } … … 450 448 while( ! blocked_threads`isEmpty ) { 451 449 info_thread(L) & popped = try_pop_front( blocked_threads ); 452 popped.signalled = true;453 450 on_notify(*popped.lock, popped.t); 454 451 } … … 472 469 size_t recursion_count = queue_and_get_recursion(this, &info); 473 470 pthread_alarm_node_wrap(L) node_wrap = { t, 0`s, callback, &this, &info }; 474 unlock( lock );475 476 // registers alarm outside cond lock to avoid deadlock477 471 register_self( &node_wrap.alarm_node ); 472 unlock( lock ); 478 473 479 474 // blocks here … … 505 500 return i.signalled; 506 501 507 Duration getDuration(timespec t) {508 timespec currTime;509 clock_gettime(CLOCK_REALTIME, &currTime);510 Duration waitUntil = { t };511 Duration currDur = { currTime };512 if ( currDur >= waitUntil ) return currDur - waitUntil;513 Duration zero = { 0 };514 return zero;515 }516 517 502 bool wait( pthread_cond_var(L) & this, L & l, timespec t ) { 518 PTHREAD_WAIT_TIME( 0, &l , getDuration( t ) ) 503 Duration d = { t }; 504 WAIT_TIME( 0, &l , d ) 519 505 } 520 506 521 507 bool wait( pthread_cond_var(L) & this, L & l, uintptr_t info, timespec t ) { 522 PTHREAD_WAIT_TIME( info, &l , getDuration( t ) ) 508 Duration d = { t }; 509 WAIT_TIME( info, &l , d ) 523 510 } 524 511 }
Note:
See TracChangeset
for help on using the changeset viewer.