- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/preemption.c
r8cb529e rd6ff3ff 66 66 67 67 void tick_preemption() { 68 // LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Ticking preemption\n" ); 69 68 70 alarm_list_t * alarms = &systemProcessor->alarms; 69 71 __cfa_time_t currtime = __kernel_get_time(); 70 71 // LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Ticking preemption @ %llu\n", currtime );72 72 while( alarms->head && alarms->head->alarm < currtime ) { 73 73 alarm_node_t * node = pop(alarms); … … 83 83 verify( validate( alarms ) ); 84 84 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; 89 87 insert( alarms, node ); 90 88 } … … 103 101 104 102 void update_preemption( processor * this, __cfa_time_t duration ) { 105 LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Processor : %p updating preemption to %l lu\n", this, duration );103 LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Processor : %p updating preemption to %lu\n", this, duration ); 106 104 107 105 alarm_node_t * alarm = this->preemption_alarm; … … 275 273 siginfo_t info; 276 274 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 ) 281 279 { 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 295 299 LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread stopping\n"); 296 300 return NULL;
Note: See TracChangeset
for help on using the changeset viewer.