Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/concurrency/kernel.c

    r09800e9 ra1a17a74  
    4949thread_desc * mainThread;
    5050
    51 struct { __dllist_t(cluster) list; __spinlock_t lock; } global_clusters;
     51struct { __dllist_t(cluster    ) list; __spinlock_t lock; } global_clusters;
    5252
    5353//-----------------------------------------------------------------------------
     
    257257// its final actions must be executed from the kernel
    258258void finishRunning(processor * this) with( this->finish ) {
    259         verify( ! kernelTLS.preemption_state.enabled );
    260         choose( action_code ) {
    261         case No_Action:
    262                 break;
    263         case Release:
     259        if( action_code == Release ) {
     260                verify( ! kernelTLS.preemption_state.enabled );
    264261                unlock( *lock );
    265         case Schedule:
     262        }
     263        else if( action_code == Schedule ) {
    266264                ScheduleThread( thrd );
    267         case Release_Schedule:
     265        }
     266        else if( action_code == Release_Schedule ) {
     267                verify( ! kernelTLS.preemption_state.enabled );
    268268                unlock( *lock );
    269269                ScheduleThread( thrd );
    270         case Release_Multi:
     270        }
     271        else if( action_code == Release_Multi ) {
     272                verify( ! kernelTLS.preemption_state.enabled );
    271273                for(int i = 0; i < lock_count; i++) {
    272274                        unlock( *locks[i] );
    273275                }
    274         case Release_Multi_Schedule:
     276        }
     277        else if( action_code == Release_Multi_Schedule ) {
    275278                for(int i = 0; i < lock_count; i++) {
    276279                        unlock( *locks[i] );
     
    279282                        ScheduleThread( thrds[i] );
    280283                }
    281         case Callback:
    282                 callback();
    283         default:
    284                 abort("KERNEL ERROR: Unexpected action to run after thread");
     284        }
     285        else {
     286                assert(action_code == No_Action);
    285287        }
    286288}
     
    495497}
    496498
    497 void BlockInternal(__finish_callback_fptr_t callback) {
    498         disable_interrupts();
    499         with( *kernelTLS.this_processor ) {
    500                 finish.action_code = Callback;
    501                 finish.callback    = callback;
    502         }
    503 
    504         verify( ! kernelTLS.preemption_state.enabled );
    505         returnToKernel();
    506         verify( ! kernelTLS.preemption_state.enabled );
    507 
    508         enable_interrupts( __cfaabi_dbg_ctx );
    509 }
    510 
    511499// KERNEL ONLY
    512500void LeaveThread(__spinlock_t * lock, thread_desc * thrd) {
Note: See TracChangeset for help on using the changeset viewer.