Changeset 4e83bb7
- Timestamp:
- Jun 23, 2022, 1:41:29 PM (2 years ago)
- Branches:
- ADT, ast-experimental, master, pthread-emulation, qualifiedEnum
- Children:
- d28524a
- Parents:
- 1dbbef6
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
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 } -
tests/unified_locking/.expect/pthread_locks.txt
r1dbbef6 r4e83bb7 5 5 Start Test 3: lock and condition variable multiple acquire and wait/notify 6 6 Done Test 3 7 Start Test 4: lock and condition variable single timed wait/notify 8 Done Test 4 -
tests/unified_locking/pthread_locks.cfa
r1dbbef6 r4e83bb7 3 3 #include <stdlib.hfa> 4 4 #include <thread.hfa> 5 #include <time.h> 6 #include <stdlib.hfa> 5 7 6 const unsigned int num_times = 50 000;8 const unsigned int num_times = 50; 7 9 8 10 simple_owner_lock l; 9 11 pthread_cond_var( simple_owner_lock ) c; 12 13 owner_lock l2; 14 condition_variable( owner_lock ) c2; 10 15 11 16 volatile int counter = 0; … … 59 64 } 60 65 66 thread Wait_Time_Signal_1 {}; 67 68 void main( Wait_Time_Signal_1 & this ) { 69 for (unsigned int i = 0; i < num_times; i++) { 70 lock(l); 71 if(empty(c) || random(10) >= 9 ) { 72 timespec t; 73 clock_gettime(CLOCK_REALTIME, &t); 74 timespec waitTime{0,1}; 75 bool woken = wait(c,l, t + waitTime); 76 }else{ 77 notify_one(c); 78 } 79 unlock(l); 80 } 81 } 82 61 83 int main() { 62 processor p[ 3];84 processor p[1]; 63 85 printf("Start Test 1: lock and condition variable single wait/notify\n"); 64 86 { … … 78 100 } 79 101 printf("Done Test 3\n"); 102 103 printf("Start Test 4: lock and condition variable single timed wait/notify\n"); 104 { 105 Wait_Time_Signal_1 t1[2]; 106 } 107 printf("Done Test 4\n"); 80 108 }
Note: See TracChangeset
for help on using the changeset viewer.