Changeset 4e83bb7 for libcfa/src/concurrency
- Timestamp:
- Jun 23, 2022, 1:41:29 PM (3 years ago)
- Branches:
- ADT, ast-experimental, master, pthread-emulation, qualifiedEnum
- Children:
- d28524a
- Parents:
- 1dbbef6
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified libcfa/src/concurrency/locks.cfa ¶
r1dbbef6 r4e83bb7 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 240 239 // this check is necessary to avoid a race condition since this timeout handler 241 240 // may still be called after a thread has been removed from the queue but … … 347 346 size_t recursion_count = queue_and_get_recursion(this, &info); 348 347 alarm_node_wrap(L) node_wrap = { t, 0`s, callback, &this, &info }; 348 unlock( lock ); 349 350 // registers alarm outside cond lock to avoid deadlock 349 351 register_self( &node_wrap.alarm_node ); 350 unlock( lock );351 352 352 353 // blocks here … … 437 438 if ( ret ) { 438 439 info_thread(L) & popped = try_pop_front( blocked_threads ); 440 popped.signalled = true; 439 441 on_notify(*popped.lock, popped.t); 440 442 } … … 448 450 while( ! blocked_threads`isEmpty ) { 449 451 info_thread(L) & popped = try_pop_front( blocked_threads ); 452 popped.signalled = true; 450 453 on_notify(*popped.lock, popped.t); 451 454 } … … 469 472 size_t recursion_count = queue_and_get_recursion(this, &info); 470 473 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 deadlock 471 477 register_self( &node_wrap.alarm_node ); 472 unlock( lock );473 478 474 479 // blocks here … … 500 505 return i.signalled; 501 506 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 502 517 bool wait( pthread_cond_var(L) & this, L & l, timespec t ) { 503 Duration d = { t }; 504 WAIT_TIME( 0, &l , d ) 518 PTHREAD_WAIT_TIME( 0, &l , getDuration( t ) ) 505 519 } 506 520 507 521 bool wait( pthread_cond_var(L) & this, L & l, uintptr_t info, timespec t ) { 508 Duration d = { t }; 509 WAIT_TIME( info, &l , d ) 522 PTHREAD_WAIT_TIME( info, &l , getDuration( t ) ) 510 523 } 511 524 }
Note: See TracChangeset
for help on using the changeset viewer.