Changeset b94579a for libcfa/src/concurrency
- Timestamp:
- Nov 7, 2025, 8:30:59 AM (4 days ago)
- Branches:
- master
- Parents:
- 0048327
- Location:
- libcfa/src/concurrency
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/locks.cfa
r0048327 rb94579a 587 587 // Semaphore, counting 588 588 589 // PRIVATE590 591 thread$ * V( semaphore & sem, const bool doUnpark ) with( sem ) {592 thread$ * thrd = 0p;593 lock( lock$ __cfaabi_dbg_ctx2 );594 count$ += 1;595 if ( count$ <= 0 ) {596 thrd = pop_head( waiting$ ); // remove task at head of waiting list597 }598 unlock( lock$ );599 if ( doUnpark ) unpark( thrd ); // make new owner600 return thrd;601 }602 603 // PUBLIC604 605 589 void ?{}( semaphore & sem, ssize_t count = 1 ) with( sem ) { 606 590 count$ = count; … … 613 597 count$ -= 1; 614 598 if ( count$ < 0 ) { // in use ? 615 append( waiting$, active_thread() ); // queue current task616 unlock( lock$ ); // atomically release spin lock and block599 append( waiting$, active_thread() ); // queue current task 600 unlock( lock$ ); // atomically release spin lock and block 617 601 park(); 618 602 return false; … … 629 613 } // if 630 614 } else { 631 V( sem ); // V othersemaphore615 V( lock ); // V mutex semaphore 632 616 count$ -= 1; 633 617 } // if … … 654 638 } 655 639 656 bool V( semaphore & sem) with( sem ) {640 thread$ * V( semaphore & sem, const bool doUnpark ) with( sem ) { 657 641 thread$ * thrd = 0p; 658 642 lock( lock$ __cfaabi_dbg_ctx2 ); … … 662 646 } 663 647 unlock( lock$ ); 664 if ( true ) unpark( thrd ); // make new owner 665 // thread$ * thrd = V(sem, true); 666 return thrd != 0p; 648 if ( doUnpark ) unpark( thrd ); // make new owner 649 return thrd; 667 650 } 668 651 -
libcfa/src/concurrency/locks.hfa
r0048327 rb94579a 11 11 // Created On : Thu Jan 21 19:46:50 2021 12 12 // Last Modified By : Peter A. Buhr 13 // Last Modified On : Fri Oct 31 09:20:22202514 // Update Count : 5913 // Last Modified On : Wed Nov 5 10:27:45 2025 14 // Update Count : 61 15 15 // 16 16 … … 91 91 }; 92 92 93 // PRIVATE94 //thread$ * V( semaphore & sem, bool );95 96 // PUBLIC97 93 void ?{}( semaphore & sem, ssize_t count = 1 ); 98 94 // Return values are used for composition. Calling threads know if a thread is unblocked, which can be useful for … … 103 99 bool try_P( semaphore & sem ); 104 100 static inline bool P( semaphore & sem, semaphore & lock, uintptr_t shadow ) { active_thread()->shadow$ = shadow; return P( sem, lock ); } 105 bool V( semaphore & sem ); 101 thread$ * V( semaphore & sem, const bool doUnpark = true ); 102 static inline bool V( semaphore & sem ) with( sem ) { return V( sem, true ) != 0p; } 106 103 bool V( semaphore & sem, size_t count ); 107 104 static inline uintptr_t front( semaphore & sem ) with( sem ) { // return shadow information for first waiting thread
Note:
See TracChangeset
for help on using the changeset viewer.