Ignore:
File:
1 edited

Legend:

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

    r8cb529e rd6ff3ff  
    6666
    6767void tick_preemption() {
     68        // LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Ticking preemption\n" );
     69
    6870        alarm_list_t * alarms = &systemProcessor->alarms;
    6971        __cfa_time_t currtime = __kernel_get_time();
    70 
    71         // LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Ticking preemption @ %llu\n", currtime );
    7272        while( alarms->head && alarms->head->alarm < currtime ) {
    7373                alarm_node_t * node = pop(alarms);
     
    8383                verify( validate( alarms ) );
    8484
    85                 __cfa_time_t period = node->period;
    86                 if( period > 0 ) {
    87                         node->alarm = currtime + period;
    88                         // LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Reinsert %p @ %llu (%llu + %llu)\n", node, node->alarm, currtime, period );
     85                if( node->period > 0 ) {
     86                        node->alarm = currtime + node->period;
    8987                        insert( alarms, node );
    9088                }
     
    103101
    104102void update_preemption( processor * this, __cfa_time_t duration ) {
    105         LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Processor : %p updating preemption to %llu\n", this, duration );
     103        LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Processor : %p updating preemption to %lu\n", this, duration );
    106104
    107105        alarm_node_t * alarm = this->preemption_alarm;
     
    275273                siginfo_t info;
    276274                int sig = sigwaitinfo( &mask, &info );
    277                 assertf(sig == SIGALRM, "Kernel Internal Error, sigwait: Unexpected signal %d (%d : %d)\n", sig, info.si_code, info.si_value.sival_int);
    278 
    279                 LIB_DEBUG_PRINT_SAFE("Kernel : Caught alarm from %d with %d\n", info.si_code, info.si_value.sival_int );
    280                 switch( info.si_code )
     275                if( sig < 0 ) {
     276                        abortf( "internal error, sigwait" );
     277                }
     278                else if( sig == SIGALRM )
    281279                {
    282                 case SI_TIMER:
    283                 case SI_KERNEL:
    284                         LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread tick\n");
    285                         lock( &systemProcessor->alarm_lock DEBUG_CTX2 );
    286                         tick_preemption();
    287                         unlock( &systemProcessor->alarm_lock );
    288                         break;
    289                 case SI_QUEUE:
    290                         goto EXIT;
    291                 }
    292         }
    293 
    294 EXIT:
     280                        LIB_DEBUG_PRINT_SAFE("Kernel : Caught signal %d (%d)\n", sig, info.si_value.sival_int );
     281                        if( info.si_value.sival_int == 0 )
     282                        {
     283                                LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread tick\n");
     284                                lock( &systemProcessor->alarm_lock DEBUG_CTX2 );
     285                                tick_preemption();
     286                                unlock( &systemProcessor->alarm_lock );
     287                        }
     288                        else if( info.si_value.sival_int == 1 )
     289                        {
     290                                break;
     291                        }
     292                }
     293                else
     294                {
     295                        LIB_DEBUG_PRINT_SAFE("Kernel : Unexpected signal %d (%d)\n", sig, info.si_value.sival_int);
     296                }
     297        }
     298
    295299        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread stopping\n");
    296300        return NULL;
Note: See TracChangeset for help on using the changeset viewer.