Ignore:
File:
1 edited

Legend:

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

    r0b33412 r4aa2fb2  
    5959// Global state
    6060
    61 volatile thread_local processor * this_processor;
    62 volatile thread_local unsigned short disable_preempt_count;
     61thread_local processor * this_processor;
    6362
    6463coroutine_desc * this_coroutine(void) {
     
    143142        this->preemption_alarm = NULL;
    144143        this->preemption = default_preemption();
     144        this->disable_preempt_count = 1;                //Start with interrupts disabled
    145145        this->pending_preemption = false;
    146146
     
    154154        (&this->terminated){};
    155155        this->is_terminated = false;
    156         this->preemption_alarm = NULL;
    157         this->preemption = default_preemption();
     156        this->disable_preempt_count = 0;
    158157        this->pending_preemption = false;
    159         this->kernel_thread = pthread_self();
    160158
    161159        this->runner = runner;
    162         LIB_DEBUG_PRINT_SAFE("Kernel : constructing system processor context %p\n", runner);
     160        LIB_DEBUG_PRINT_SAFE("Kernel : constructing processor context %p\n", runner);
    163161        runner{ this };
    164162}
    165 
    166 LIB_DEBUG_DO( bool validate( alarm_list_t * this ); )
    167163
    168164void ?{}(system_proc_t * this, cluster * cltr, processorCtx_t * runner) {
     
    172168
    173169        (&this->proc){ cltr, runner };
    174 
    175         verify( validate( &this->alarms ) );
    176170}
    177171
     
    215209                        if(readyThread)
    216210                        {
    217                                 verify( disable_preempt_count > 0 );
    218 
    219211                                runThread(this, readyThread);
    220 
    221                                 verify( disable_preempt_count > 0 );
    222212
    223213                                //Some actions need to be taken from the kernel
     
    299289        processor * proc = (processor *) arg;
    300290        this_processor = proc;
    301         disable_preempt_count = 1;
    302291        // SKULLDUGGERY: We want to create a context for the processor coroutine
    303292        // which is needed for the 2-step context switch. However, there is no reason
     
    333322void start(processor * this) {
    334323        LIB_DEBUG_PRINT_SAFE("Kernel : Starting core %p\n", this);
    335 
    336         // SIGALRM must only be caught by the system processor
    337         sigset_t old_mask;
    338         bool is_system_proc = this_processor == &systemProcessor->proc;
    339         if ( is_system_proc ) {
    340                 // Child kernel-thread inherits the signal mask from the parent kernel-thread. So one special case for the
    341                 // system processor creating the user processor => toggle the blocking SIGALRM on system processor, create user
    342                 // processor, and toggle back (below) previous signal mask of the system processor.
    343 
    344                 sigset_t new_mask;
    345                 sigemptyset( &new_mask );
    346                 sigemptyset( &old_mask );
    347                 sigaddset( &new_mask, SIGALRM );
    348 
    349                 if ( sigprocmask( SIG_BLOCK, &new_mask, &old_mask ) == -1 ) {
    350                         abortf( "internal error, sigprocmask" );
    351                 }
    352 
    353                 assert( ! sigismember( &old_mask, SIGALRM ) );
    354         }
    355 
     324       
    356325        pthread_create( &this->kernel_thread, NULL, CtxInvokeProcessor, (void*)this );
    357 
    358         // Toggle back previous signal mask of system processor.
    359         if ( is_system_proc ) {
    360                 if ( sigprocmask( SIG_SETMASK, &old_mask, NULL ) == -1 ) {
    361                         abortf( "internal error, sigprocmask" );
    362                 } // if
    363         } // if
    364326
    365327        LIB_DEBUG_PRINT_SAFE("Kernel : core %p started\n", this);       
     
    385347}
    386348
    387 void BlockInternal() {
    388         disable_interrupts();
    389         verify( disable_preempt_count > 0 );
     349void ScheduleInternal() {
    390350        suspend();
    391         verify( disable_preempt_count > 0 );
    392         enable_interrupts( __PRETTY_FUNCTION__ );
    393 }
    394 
    395 void BlockInternal( spinlock * lock ) {
    396         disable_interrupts();
     351}
     352
     353void ScheduleInternal( spinlock * lock ) {
    397354        this_processor->finish.action_code = Release;
    398355        this_processor->finish.lock = lock;
    399 
    400         verify( disable_preempt_count > 0 );
    401356        suspend();
    402         verify( disable_preempt_count > 0 );
    403 
    404         enable_interrupts( __PRETTY_FUNCTION__ );
    405 }
    406 
    407 void BlockInternal( thread_desc * thrd ) {
    408         disable_interrupts();
     357}
     358
     359void ScheduleInternal( thread_desc * thrd ) {
    409360        this_processor->finish.action_code = Schedule;
    410361        this_processor->finish.thrd = thrd;
    411 
    412         verify( disable_preempt_count > 0 );
    413362        suspend();
    414         verify( disable_preempt_count > 0 );
    415 
    416         enable_interrupts( __PRETTY_FUNCTION__ );
    417 }
    418 
    419 void BlockInternal( spinlock * lock, thread_desc * thrd ) {
    420         disable_interrupts();
     363}
     364
     365void ScheduleInternal( spinlock * lock, thread_desc * thrd ) {
    421366        this_processor->finish.action_code = Release_Schedule;
    422367        this_processor->finish.lock = lock;
    423368        this_processor->finish.thrd = thrd;
    424 
    425         verify( disable_preempt_count > 0 );
    426369        suspend();
    427         verify( disable_preempt_count > 0 );
    428 
    429         enable_interrupts( __PRETTY_FUNCTION__ );
    430 }
    431 
    432 void BlockInternal(spinlock ** locks, unsigned short count) {
    433         disable_interrupts();
     370}
     371
     372void ScheduleInternal(spinlock ** locks, unsigned short count) {
    434373        this_processor->finish.action_code = Release_Multi;
    435374        this_processor->finish.locks = locks;
    436375        this_processor->finish.lock_count = count;
    437 
    438         verify( disable_preempt_count > 0 );
    439376        suspend();
    440         verify( disable_preempt_count > 0 );
    441 
    442         enable_interrupts( __PRETTY_FUNCTION__ );
    443 }
    444 
    445 void BlockInternal(spinlock ** locks, unsigned short lock_count, thread_desc ** thrds, unsigned short thrd_count) {
    446         disable_interrupts();
     377}
     378
     379void ScheduleInternal(spinlock ** locks, unsigned short lock_count, thread_desc ** thrds, unsigned short thrd_count) {
    447380        this_processor->finish.action_code = Release_Multi_Schedule;
    448381        this_processor->finish.locks = locks;
     
    450383        this_processor->finish.thrds = thrds;
    451384        this_processor->finish.thrd_count = thrd_count;
    452 
    453         verify( disable_preempt_count > 0 );
    454385        suspend();
    455         verify( disable_preempt_count > 0 );
    456 
    457         enable_interrupts( __PRETTY_FUNCTION__ );
    458386}
    459387
     
    475403        LIB_DEBUG_PRINT_SAFE("Kernel : Main thread ready\n");
    476404
     405        // Enable preemption
     406        kernel_start_preemption();
     407
    477408        // Initialize the system cluster
    478409        systemCluster = (cluster *)&systemCluster_storage;
     
    494425        this_processor->current_thread = mainThread;
    495426        this_processor->current_coroutine = &mainThread->cor;
    496         disable_preempt_count = 1;
    497 
    498         // Enable preemption
    499         kernel_start_preemption();
    500427
    501428        // SKULLDUGGERY: Force a context switch to the system processor to set the main thread's context to the current UNIX
     
    508435        // THE SYSTEM IS NOW COMPLETELY RUNNING
    509436        LIB_DEBUG_PRINT_SAFE("Kernel : Started\n--------------------------------------------------\n\n");
    510 
    511         enable_interrupts( __PRETTY_FUNCTION__ );
    512437}
    513438
    514439void kernel_shutdown(void) {
    515440        LIB_DEBUG_PRINT_SAFE("\n--------------------------------------------------\nKernel : Shutting down\n");
    516 
    517         disable_interrupts();
    518441
    519442        // SKULLDUGGERY: Notify the systemProcessor it needs to terminates.
     
    524447
    525448        // THE SYSTEM IS NOW COMPLETELY STOPPED
    526 
    527         // Disable preemption
    528         kernel_stop_preemption();
    529449
    530450        // Destroy the system processor and its context in reverse order of construction
     
    630550        if( !this->cond ) {
    631551                append( &this->blocked, this_thread() );
    632                 BlockInternal( &this->lock );
    633         }
    634         else {
    635                 unlock( &this->lock );
    636         }
     552                ScheduleInternal( &this->lock );
     553                lock( &this->lock );
     554        }
     555        unlock( &this->lock );
    637556}
    638557
     
    642561                this->cond = true;
    643562
    644                 disable_interrupts();
    645563                thread_desc * it;
    646564                while( it = pop_head( &this->blocked) ) {
    647565                        ScheduleThread( it );
    648566                }
    649                 enable_interrupts( __PRETTY_FUNCTION__ );
    650567        }
    651568        unlock( &this->lock );
Note: See TracChangeset for help on using the changeset viewer.