Ignore:
Timestamp:
Nov 7, 2025, 8:30:59 AM (5 days ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Parents:
0048327
Message:

update semaphore lock

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/locks.cfa

    r0048327 rb94579a  
    587587// Semaphore, counting
    588588
    589 // PRIVATE
    590 
    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 list
    597         }
    598         unlock( lock$ );
    599         if ( doUnpark ) unpark( thrd );                                         // make new owner
    600         return thrd;
    601 }
    602 
    603 // PUBLIC
    604 
    605589void ?{}( semaphore & sem, ssize_t count = 1 ) with( sem ) {
    606590        count$ = count;
     
    613597        count$ -= 1;
    614598        if ( count$ < 0 ) {                                                                     // in use ?
    615                 append( waiting$, active_thread() );                            // queue current task
    616                 unlock( lock$ );                                                                        // atomically release spin lock and block
     599                append( waiting$, active_thread() );                    // queue current task
     600                unlock( lock$ );                                                                // atomically release spin lock and block
    617601                park();
    618602                return false;
     
    629613                } // if
    630614        } else {
    631                 V( sem );                                                                               // V other semaphore
     615                V( lock );                                                                              // V mutex semaphore
    632616                count$ -= 1;
    633617        } // if
     
    654638}
    655639
    656 bool V( semaphore & sem ) with( sem ) {
     640thread$ * V( semaphore & sem, const bool doUnpark ) with( sem ) {
    657641        thread$ * thrd = 0p;
    658642        lock( lock$ __cfaabi_dbg_ctx2 );
     
    662646        }
    663647        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;
    667650}
    668651
Note: See TracChangeset for help on using the changeset viewer.