Ignore:
Timestamp:
Mar 29, 2026, 9:52:51 PM (9 days ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
e6e250d
Parents:
00675ed4
Message:

2nd attempt at harmonizing isOp functions, e.g., isEmpty, to C/C++ form empty

Location:
libcfa/src/concurrency
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/channel.hfa

    r00675ed4 r81ab5eb  
    117117                printf("Channel %p Producer Blocks: %lu,\tProducer Ops: %lu,\t%.2f%% of Producer ops blocked\n", &c, c_blocks, c_ops, ((double)c_blocks)/c_ops * 100);
    118118            #endif
    119                 verifyf( __handle_waituntil_OR( cons ) || __handle_waituntil_OR( prods ) || isEmpty( cons ) && isEmpty( prods ),
     119                verifyf( __handle_waituntil_OR( cons ) || __handle_waituntil_OR( prods ) || empty( cons ) && empty( prods ),
    120120                                 "Attempted to delete channel with waiting threads (Deadlock).\n" );
    121121                if ( size != 0 ) delete( buffer );
     
    123123        size_t get_count( channel(T) & chan ) with(chan) { return __atomic_load_n( &count, __ATOMIC_RELAXED ); }
    124124        size_t get_size( channel(T) & chan ) with(chan) { return __atomic_load_n( &size, __ATOMIC_RELAXED ); }
    125         bool has_waiters( channel(T) & chan ) with(chan) { return ! isEmpty( cons ) || ! isEmpty( prods ); }
    126         bool has_waiting_consumers( channel(T) & chan ) with(chan) { return ! isEmpty( cons ); }
    127         bool has_waiting_producers( channel(T) & chan ) with(chan) { return ! isEmpty( prods ); }
     125        bool has_waiters( channel(T) & chan ) with(chan) { return ! empty( cons ) || ! empty( prods ); }
     126        bool has_waiting_consumers( channel(T) & chan ) with(chan) { return ! empty( cons ); }
     127        bool has_waiting_producers( channel(T) & chan ) with(chan) { return ! empty( prods ); }
    128128
    129129        // closes the channel and notifies all blocked threads
     
    164164        void flush( channel(T) & chan, T elem ) with(chan) {
    165165                lock( mutex_lock );
    166                 while ( count == 0 && ! isEmpty( cons ) ) {
     166                while ( count == 0 && ! empty( cons ) ) {
    167167                        __cons_handoff( chan, elem );
    168168                }
     
    186186
    187187          ConsEmpty:
    188                 if ( ! isEmpty( cons ) ) {
     188                if ( ! empty( cons ) ) {
    189189                        if ( ! __handle_waituntil_OR( cons ) ) break ConsEmpty;
    190190                        __cons_handoff( chan, elem );
     
    233233                // buffer count must be zero if cons are blocked (also handles zero-size case)
    234234          ConsEmpty:
    235                 if ( ! isEmpty( cons ) ) {
     235                if ( ! empty( cons ) ) {
    236236                        if ( ! __handle_waituntil_OR( cons ) ) break ConsEmpty;
    237237                        __cons_handoff( chan, elem );
     
    261261                count -= 1;
    262262                front = (front + 1) % size;
    263                 if (count == size - 1 && ! isEmpty( prods ) ) {
     263                if (count == size - 1 && ! empty( prods ) ) {
    264264                        if ( ! __handle_waituntil_OR( prods ) ) return;
    265265                        __buf_insert( chan, *(T *)first( prods ).extra );  // do waiting producer work
     
    276276
    277277          ZeroSize:
    278                 if ( size == 0 && ! isEmpty( prods ) ) {
     278                if ( size == 0 && ! empty( prods ) ) {
    279279                        if ( ! __handle_waituntil_OR( prods ) ) break ZeroSize;
    280280                        __prods_handoff( chan, retval );
     
    332332                // have to check for the zero size channel case
    333333          ZeroSize:
    334                 if ( size == 0 && ! isEmpty( prods ) ) {
     334                if ( size == 0 && ! empty( prods ) ) {
    335335                        if ( ! __handle_waituntil_OR( prods ) ) break ZeroSize;
    336336                        __prods_handoff( chan, retval );
     
    384384        // special case of __handle_waituntil_OR, that does some work to avoid starvation/deadlock case
    385385        bool __handle_pending( dlist( select_node ) & queue, select_node & mine ) {
    386             while ( ! isEmpty( queue ) ) {
     386            while ( ! empty( queue ) ) {
    387387                // if node not a special OR case or if we win the special OR case race break
    388388                if ( ! first( queue ).clause_status || first( queue ).park_counter || __pending_set_other( first( queue ), mine, ((unsigned long int)(&(first( queue )))) ) )
     
    421421            if ( ! node.park_counter ) {
    422422                // are we special case OR and front of cons is also special case OR
    423                 if ( ! unlikely(closed) && ! isEmpty( prods ) && first( prods ).clause_status && ! first( prods ).park_counter ) {
     423                if ( ! unlikely(closed) && ! empty( prods ) && first( prods ).clause_status && ! first( prods ).park_counter ) {
    424424                    if ( ! __make_select_node_pending( node ) ) {
    425425                        unlock( mutex_lock );
     
    437437                }
    438438                // check if we can complete operation. If so race to establish winner in special OR case
    439                 if ( count != 0 || ! isEmpty( prods ) || unlikely(closed) ) {
     439                if ( count != 0 || ! empty( prods ) || unlikely(closed) ) {
    440440                    if ( ! __make_select_node_available( node ) ) { // we didn't win the race so give up on registering
    441441                        unlock( mutex_lock );
     
    453453            // have to check for the zero size channel case
    454454            ZeroSize:
    455                 if ( size == 0 && ! isEmpty( prods ) ) {
     455                if ( size == 0 && ! empty( prods ) ) {
    456456                        if ( ! __handle_waituntil_OR( prods ) ) break ZeroSize;
    457457                        __prods_handoff( *chan, *ret );
     
    522522            if ( ! node.park_counter ) {
    523523                // are we special case OR and front of cons is also special case OR
    524                 if ( ! unlikely(closed) && ! isEmpty( cons ) && first( cons ).clause_status && ! first( cons ).park_counter ) {
     524                if ( ! unlikely(closed) && ! empty( cons ) && first( cons ).clause_status && ! first( cons ).park_counter ) {
    525525                    if ( ! __make_select_node_pending( node ) ) {
    526526                        unlock( mutex_lock );
     
    537537                        }
    538538                        // check if we can complete operation. If so race to establish winner in special OR case
    539                         if ( count != size || ! isEmpty( cons ) || unlikely(closed) ) {
     539                        if ( count != size || ! empty( cons ) || unlikely(closed) ) {
    540540                                if ( ! __make_select_node_available( node ) ) { // we didn't win the race so give up on registering
    541541                                        unlock( mutex_lock );
     
    554554                // handle blocked consumer case via handoff (buffer is implicitly empty)
    555555    ConsEmpty:
    556                 if ( ! isEmpty( cons ) ) {
     556                if ( ! empty( cons ) ) {
    557557                        if ( ! __handle_waituntil_OR( cons ) ) break ConsEmpty;
    558558                        __cons_handoff( *chan, elem );
  • libcfa/src/concurrency/cofor.hfa

    r00675ed4 r81ab5eb  
    3333
    3434void main( cofor_runner & this ) with(this) {
    35     while ( ! done || ! isEmpty( items ) ) {
     35    while ( ! done || ! empty( items ) ) {
    3636                lock( mutex_lock );
    3737        runner_node * node = &remove_first( items );
  • libcfa/src/concurrency/future.hfa

    r00675ed4 r81ab5eb  
    1010// Created On       : Wed Jan 06 17:33:18 2021
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Nov 24 16:08:52 2025
    13 // Update Count     : 222
     12// Last Modified On : Sun Mar 29 21:13:04 2026
     13// Update Count     : 223
    1414//
    1515
     
    173173
    174174                bool fulfil$( future(T) & fut ) with( fut ) {   // helper
    175                         bool ret_val = ! isEmpty( waiters );
     175                        bool ret_val = ! empty( waiters );
    176176                        state = FUTURE_FULFILLED$;
    177                         while ( ! isEmpty( waiters ) ) {
     177                        while ( ! empty( waiters ) ) {
    178178                                if ( !__handle_waituntil_OR( waiters ) ) // handle special waituntil OR case
    179179                                        break; // if handle_OR returns false then waiters is empty so break
     
    211211                void reset( future(T) & fut ) with( fut ) {             // mark future as empty (for reuse)
    212212                        lock( lock );
    213                   if ( ! isEmpty( waiters ) ) abort( "Attempting to reset a future with blocked waiters" );
     213                  if ( ! empty( waiters ) ) abort( "Attempting to reset a future with blocked waiters" );
    214214                        state = FUTURE_EMPTY$;
    215215                        free( except );
  • libcfa/src/concurrency/io.cfa

    r00675ed4 r81ab5eb  
    594594                lock( queue.lock __cfaabi_dbg_ctx2 );
    595595                {
    596                         was_empty = isEmpty( queue.queue );
     596                        was_empty = empty( queue.queue );
    597597
    598598                        // Add our request to the list
     
    632632        // notify the arbiter that new allocations are available
    633633        static void __ioarbiter_notify( io_arbiter$ & this, io_context$ * ctx ) {
    634                 /* paranoid */ verify( ! isEmpty( this.pending.queue ) );
     634                /* paranoid */ verify( ! empty( this.pending.queue ) );
    635635                /* paranoid */ verify( __preemption_enabled() );
    636636
     
    642642                        // as long as there are pending allocations try to satisfy them
    643643                        // for simplicity do it in FIFO order
    644                         while( ! isEmpty( this.pending.queue ) ) {
     644                        while( ! empty( this.pending.queue ) ) {
    645645                                // get first pending allocs
    646646                                __u32 have = ctx->sq.free_ring.tail - ctx->sq.free_ring.head;
     
    727727                        // pop each operation one at a time.
    728728                        // There is no wait morphing because of the io sq ring
    729                         while( ! isEmpty( ctx.ext_sq.queue ) ) {
     729                        while( ! empty( ctx.ext_sq.queue ) ) {
    730730                                // drop the element from the queue
    731731                                __external_io & ei = (__external_io&)remove_first( ctx.ext_sq.queue );
  • libcfa/src/concurrency/kernel.cfa

    r00675ed4 r81ab5eb  
    1010// Created On       : Tue Jan 17 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Apr 25 07:02:42 2025
    13 // Update Count     : 82
     12// Last Modified On : Sun Mar 29 21:20:54 2026
     13// Update Count     : 83
    1414//
    1515
     
    785785                        // update the pointer to the head wait context
    786786                        struct __fd_waitctx * wctx = 0;
    787                         if ( ! isEmpty( this.idles )) wctx = &first( this. idles ).idle_wctx;
     787                        if ( ! empty( this.idles )) wctx = &first( this. idles ).idle_wctx;
    788788                        __atomic_store_n(&this.fdw, wctx, __ATOMIC_SEQ_CST);
    789789                }
  • libcfa/src/concurrency/select.hfa

    r00675ed4 r81ab5eb  
    1111// Created On       : Thu Jan 21 19:46:50 2023
    1212// Last Modified By : Peter A. Buhr
    13 // Last Modified On : Sun Nov 23 22:38:36 2025
    14 // Update Count     : 8
     13// Last Modified On : Sun Mar 29 21:12:52 2026
     14// Update Count     : 9
    1515//
    1616
     
    169169// Returns true if execution can continue normally and false if the queue has now been drained
    170170static inline bool __handle_waituntil_OR( dlist( select_node ) & queue ) {
    171         if ( isEmpty( queue ) ) return false;
     171        if ( empty( queue ) ) return false;
    172172        if ( first( queue ).clause_status && ! first( queue ).park_counter ) {
    173                 while ( ! isEmpty( queue ) ) {
     173                while ( ! empty( queue ) ) {
    174174                        // if node not a special OR case or if we win the special OR case race break
    175175                        if ( ! first( queue ).clause_status || first( queue ).park_counter || __make_select_node_available( first( queue ) ) )
Note: See TracChangeset for help on using the changeset viewer.