Changes in src/libcfa/concurrency/kernel.c [0c78741:c81ebf9]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/kernel.c
r0c78741 rc81ebf9 36 36 //CFA Includes 37 37 #include "libhdr.h" 38 #include "preemption.h" 38 39 39 40 //Private includes … … 47 48 KERNEL_STORAGE(processorCtx_t, systemProcessorCtx); 48 49 KERNEL_STORAGE(cluster, systemCluster); 49 KERNEL_STORAGE( processor, systemProcessor);50 KERNEL_STORAGE(system_proc_t, systemProcessor); 50 51 KERNEL_STORAGE(thread_desc, mainThread); 51 52 KERNEL_STORAGE(machine_context_t, mainThread_context); 52 53 53 54 cluster * systemCluster; 54 processor* systemProcessor;55 system_proc_t * systemProcessor; 55 56 thread_desc * mainThread; 56 57 … … 118 119 // Processor coroutine 119 120 void ?{}(processorCtx_t * this, processor * proc) { 120 (&this->__cor){ };121 (&this->__cor){ "Processor" }; 121 122 this->proc = proc; 122 123 proc->runner = this; … … 139 140 (&this->terminated){}; 140 141 this->is_terminated = false; 142 this->preemption_alarm = NULL; 143 this->preemption = default_preemption(); 144 this->disable_preempt_count = 1; //Start with interrupts disabled 145 this->pending_preemption = false; 141 146 142 147 start( this ); … … 149 154 (&this->terminated){}; 150 155 this->is_terminated = false; 156 this->disable_preempt_count = 0; 157 this->pending_preemption = false; 151 158 152 159 this->runner = runner; 153 160 LIB_DEBUG_PRINT_SAFE("Kernel : constructing processor context %p\n", runner); 154 161 runner{ this }; 162 } 163 164 void ?{}(system_proc_t * this, cluster * cltr, processorCtx_t * runner) { 165 (&this->alarms){}; 166 (&this->alarm_lock){}; 167 this->pending_alarm = false; 168 169 (&this->proc){ cltr, runner }; 155 170 } 156 171 … … 178 193 void main(processorCtx_t * runner) { 179 194 processor * this = runner->proc; 195 180 196 LIB_DEBUG_PRINT_SAFE("Kernel : core %p starting\n", this); 181 197 182 thread_desc * readyThread = NULL;183 for( unsigned int spin_count = 0; ! this->is_terminated; spin_count++ )184 198 { 185 readyThread = nextThread( this->cltr ); 186 187 if(readyThread) 199 // Setup preemption data 200 preemption_scope scope = { this }; 201 202 LIB_DEBUG_PRINT_SAFE("Kernel : core %p started\n", this); 203 204 thread_desc * readyThread = NULL; 205 for( unsigned int spin_count = 0; ! this->is_terminated; spin_count++ ) 188 206 { 189 runThread(this, readyThread); 190 191 //Some actions need to be taken from the kernel 192 finishRunning(this); 193 194 spin_count = 0; 195 } 196 else 197 { 198 spin(this, &spin_count); 199 } 200 } 201 202 LIB_DEBUG_PRINT_SAFE("Kernel : core %p unlocking thread\n", this); 207 readyThread = nextThread( this->cltr ); 208 209 if(readyThread) 210 { 211 runThread(this, readyThread); 212 213 //Some actions need to be taken from the kernel 214 finishRunning(this); 215 216 spin_count = 0; 217 } 218 else 219 { 220 spin(this, &spin_count); 221 } 222 } 223 224 LIB_DEBUG_PRINT_SAFE("Kernel : core %p stopping\n", this); 225 } 226 203 227 signal( &this->terminated ); 204 228 LIB_DEBUG_PRINT_SAFE("Kernel : core %p terminated\n", this); … … 299 323 LIB_DEBUG_PRINT_SAFE("Kernel : Starting core %p\n", this); 300 324 301 // pthread_attr_t attributes;302 // pthread_attr_init( &attributes );303 304 325 pthread_create( &this->kernel_thread, NULL, CtxInvokeProcessor, (void*)this ); 305 306 // pthread_attr_destroy( &attributes );307 326 308 327 LIB_DEBUG_PRINT_SAFE("Kernel : core %p started\n", this); … … 316 335 assertf( thrd->next == NULL, "Expected null got %p", thrd->next ); 317 336 318 lock( &systemProcessor-> cltr->lock );319 append( &systemProcessor-> cltr->ready_queue, thrd );320 unlock( &systemProcessor-> cltr->lock );337 lock( &systemProcessor->proc.cltr->lock ); 338 append( &systemProcessor->proc.cltr->ready_queue, thrd ); 339 unlock( &systemProcessor->proc.cltr->lock ); 321 340 } 322 341 … … 367 386 } 368 387 388 //============================================================================================= 389 // Kernel Setup logic 390 //============================================================================================= 369 391 //----------------------------------------------------------------------------- 370 392 // Kernel boot procedures … … 379 401 mainThread{ &info }; 380 402 403 LIB_DEBUG_PRINT_SAFE("Kernel : Main thread ready\n"); 404 405 // Enable preemption 406 kernel_start_preemption(); 407 381 408 // Initialize the system cluster 382 409 systemCluster = (cluster *)&systemCluster_storage; 383 410 systemCluster{}; 384 411 412 LIB_DEBUG_PRINT_SAFE("Kernel : System cluster ready\n"); 413 385 414 // Initialize the system processor and the system processor ctx 386 415 // (the coroutine that contains the processing control flow) 387 systemProcessor = ( processor*)&systemProcessor_storage;416 systemProcessor = (system_proc_t *)&systemProcessor_storage; 388 417 systemProcessor{ systemCluster, (processorCtx_t *)&systemProcessorCtx_storage }; 389 418 390 419 // Add the main thread to the ready queue 391 // once resume is called on systemProcessor-> ctxthe mainThread needs to be scheduled like any normal thread420 // once resume is called on systemProcessor->runner the mainThread needs to be scheduled like any normal thread 392 421 ScheduleThread(mainThread); 393 422 394 423 //initialize the global state variables 395 this_processor = systemProcessor;424 this_processor = &systemProcessor->proc; 396 425 this_processor->current_thread = mainThread; 397 426 this_processor->current_coroutine = &mainThread->cor; … … 400 429 // context. Hence, the main thread does not begin through CtxInvokeThread, like all other threads. The trick here is that 401 430 // mainThread is on the ready queue when this call is made. 402 resume( systemProcessor->runner);431 resume( systemProcessor->proc.runner ); 403 432 404 433 … … 414 443 // When its coroutine terminates, it return control to the mainThread 415 444 // which is currently here 416 systemProcessor-> is_terminated = true;445 systemProcessor->proc.is_terminated = true; 417 446 suspend(); 418 447 … … 421 450 // Destroy the system processor and its context in reverse order of construction 422 451 // These were manually constructed so we need manually destroy them 423 ^(systemProcessor-> runner){};452 ^(systemProcessor->proc.runner){}; 424 453 ^(systemProcessor){}; 425 454 … … 484 513 } 485 514 515 //============================================================================================= 516 // Kernel Utilities 517 //============================================================================================= 486 518 //----------------------------------------------------------------------------- 487 519 // Locks … … 491 523 void ^?{}( spinlock * this ) { 492 524 525 } 526 527 bool try_lock( spinlock * this ) { 528 return this->lock == 0 && __sync_lock_test_and_set_4( &this->lock, 1 ) == 0; 493 529 } 494 530
Note:
See TracChangeset
for help on using the changeset viewer.