Ignore:
Timestamp:
May 15, 2023, 1:14:42 PM (16 months ago)
Author:
caparsons <caparson@…>
Branches:
ADT, ast-experimental, master
Children:
629c95a
Parents:
8cb06b6
Message:

cleanup up locks files and fixed a minor whitespace issue in preemption.cfa

File:
1 edited

Legend:

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

    r8cb06b6 r5a05946  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // locks.hfa -- LIBCFATHREAD
     7// locks.cfa -- LIBCFATHREAD
    88// Runtime locks that used with the runtime thread system.
    99//
     
    113113        return ret;
    114114}
    115 
    116 // static void pop_and_set_new_owner( blocking_lock & this ) with( this ) {
    117 //      thread$ * t = &try_pop_front( blocked_threads );
    118 //      owner = t;
    119 //      recursion_count = ( t ? 1 : 0 );
    120 //      if ( t ) wait_count--;
    121 //      unpark( t );
    122 // }
    123115
    124116static inline void pop_node( blocking_lock & this ) with( this ) {
     
    388380                insert_last( blocked_threads, *i );
    389381                count++;
    390                 // size_t recursion_count = 0;
    391                 // if (i->lock) {
    392                 //      // if lock was passed get recursion count to reset to after waking thread
    393                 //      recursion_count = on_wait( *i->lock );
    394                 // }
    395                 // return recursion_count;
    396382        }
    397383
    398384    static size_t block_and_get_recursion( info_thread(L) & i, __cfa_pre_park pp_fn, void * pp_datum ) {
    399385        size_t recursion_count = 0;
    400                 if ( i.lock ) {
    401                         // if lock was passed get recursion count to reset to after waking thread
     386                if ( i.lock ) // if lock was passed get recursion count to reset to after waking thread
    402387                        recursion_count = on_wait( *i.lock, pp_fn, pp_datum ); // this call blocks
    403                 } else pre_park_then_park( pp_fn, pp_datum );
     388                else
     389            pre_park_then_park( pp_fn, pp_datum );
    404390        return recursion_count;
    405391    }
     
    410396                lock( lock __cfaabi_dbg_ctx2 );
    411397        enqueue_thread( this, &i );
    412                 // size_t recursion_count = queue_and_get_recursion( this, &i );
    413398                unlock( lock );
    414399
    415400                // blocks here
    416401        size_t recursion_count = block_and_get_recursion( i );
    417                 // park( );
    418402
    419403                // resets recursion count here after waking
     
    431415                lock( lock __cfaabi_dbg_ctx2 );
    432416        enqueue_thread( this, &info );
    433                 // size_t recursion_count = queue_and_get_recursion( this, &info );
    434417                alarm_node_wrap(L) node_wrap = { t, 0`s, callback, &this, &info };
    435418                unlock( lock );
    436419
    437                 // registers alarm outside cond lock to avoid deadlock
    438                 // register_self( &node_wrap.alarm_node );
    439 
    440                 // blocks here
     420                // blocks here and registers alarm node before blocking after releasing locks to avoid deadlock
    441421        size_t recursion_count = block_and_get_recursion( info, cond_alarm_register, (void *)(&node_wrap.alarm_node) );
    442422                // park();
     
    548528        bool empty ( pthread_cond_var(L) & this ) with(this) { return blocked_threads`isEmpty; }
    549529
    550         // static size_t queue_and_get_recursion( pthread_cond_var(L) & this, info_thread(L) * i ) with(this) {
    551         //      // add info_thread to waiting queue
    552         //      insert_last( blocked_threads, *i );
    553         //      size_t recursion_count = 0;
    554         //      recursion_count = on_wait( *i->lock );
    555         //      return recursion_count;
    556         // }
    557        
    558530        static void queue_info_thread_timeout( pthread_cond_var(L) & this, info_thread(L) & info, Duration t, Alarm_Callback callback ) with(this) {
    559531                lock( lock __cfaabi_dbg_ctx2 );
    560                 // size_t recursion_count = queue_and_get_recursion(this, &info);
    561532        insert_last( blocked_threads, info );
    562533                pthread_alarm_node_wrap(L) node_wrap = { t, 0`s, callback, &this, &info };
    563534                unlock( lock );
    564535
    565                 // registers alarm outside cond lock to avoid deadlock
    566                 // register_self( &node_wrap.alarm_node ); // C_TODO: fix race: registers itself and then alarm handler calls on_notify before block_and_get_recursion is run
    567 
    568                 // blocks here
     536                // blocks here and registers alarm node before blocking after releasing locks to avoid deadlock
    569537        size_t recursion_count = block_and_get_recursion( info, cond_alarm_register, (void *)(&node_wrap.alarm_node) );
    570                 // park();
    571 
    572                 // unregisters alarm so it doesn't go off if this happens first
     538
     539                // unregisters alarm so it doesn't go off if signal happens first
    573540                unregister_self( &node_wrap.alarm_node );
    574541
     
    585552                info_thread( L ) i = { active_thread(), info, &l };
    586553        insert_last( blocked_threads, i );
    587                 // size_t recursion_count = queue_and_get_recursion( this, &i );
    588554                unlock( lock );
    589555
    590556        // blocks here
    591557                size_t recursion_count = block_and_get_recursion( i );
    592                 // park();
     558
    593559                on_wakeup( *i.lock, recursion_count );
    594560        }
     
    679645        return thrd != 0p;
    680646}
     647
Note: See TracChangeset for help on using the changeset viewer.