- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.cfa
r58688bf r8fc652e0 122 122 // Because of a bug, we couldn't initialized the seed on construction 123 123 // Do it here 124 kernelTLS.rand_seed ^= rdtscl();125 kernelTLS.ready_rng.fwd_seed = 25214903917_l64u * (rdtscl() ^ (uintptr_t)&runner);124 __cfaabi_tls.rand_seed ^= rdtscl(); 125 __cfaabi_tls.ready_rng.fwd_seed = 25214903917_l64u * (rdtscl() ^ (uintptr_t)&runner); 126 126 __tls_rand_advance_bck(); 127 127 … … 217 217 // and it make sense for it to be set in all other cases except here 218 218 // fake it 219 kernelTLS.this_thread = mainThread;219 __cfaabi_tls.this_thread = mainThread; 220 220 } 221 221 … … 230 230 // from the processor coroutine to the target thread 231 231 static void __run_thread(processor * this, $thread * thrd_dst) { 232 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);232 /* paranoid */ verify( ! __preemption_enabled() ); 233 233 /* paranoid */ verifyf( thrd_dst->state == Ready || thrd_dst->preempted != __NO_PREEMPTION, "state : %d, preempted %d\n", thrd_dst->state, thrd_dst->preempted); 234 234 /* paranoid */ verifyf( thrd_dst->link.next == 0p, "Expected null got %p", thrd_dst->link.next ); … … 247 247 248 248 // Update global state 249 kernelTLS .this_thread = thrd_dst;250 251 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);252 /* paranoid */ verify( kernelTLS .this_thread == thrd_dst );249 kernelTLS().this_thread = thrd_dst; 250 251 /* paranoid */ verify( ! __preemption_enabled() ); 252 /* paranoid */ verify( kernelTLS().this_thread == thrd_dst ); 253 253 /* paranoid */ verify( thrd_dst->context.SP ); 254 254 /* paranoid */ verify( thrd_dst->state != Halted ); … … 267 267 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ), "ERROR : Destination $thread %p has been corrupted.\n StackPointer too small.\n", thrd_dst ); 268 268 /* paranoid */ verify( thrd_dst->context.SP ); 269 /* paranoid */ verify( kernelTLS .this_thread == thrd_dst );270 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);269 /* paranoid */ verify( kernelTLS().this_thread == thrd_dst ); 270 /* paranoid */ verify( ! __preemption_enabled() ); 271 271 272 272 // Reset global state 273 kernelTLS .this_thread = 0p;273 kernelTLS().this_thread = 0p; 274 274 275 275 // We just finished running a thread, there are a few things that could have happened. … … 315 315 proc_cor->state = Active; 316 316 317 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);317 /* paranoid */ verify( ! __preemption_enabled() ); 318 318 } 319 319 320 320 // KERNEL_ONLY 321 321 void returnToKernel() { 322 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);323 $coroutine * proc_cor = get_coroutine(kernelTLS .this_processor->runner);324 $thread * thrd_src = kernelTLS .this_thread;322 /* paranoid */ verify( ! __preemption_enabled() ); 323 $coroutine * proc_cor = get_coroutine(kernelTLS().this_processor->runner); 324 $thread * thrd_src = kernelTLS().this_thread; 325 325 326 326 #if !defined(__CFA_NO_STATISTICS__) 327 struct processor * last_proc = kernelTLS .this_processor;327 struct processor * last_proc = kernelTLS().this_processor; 328 328 #endif 329 329 … … 345 345 346 346 #if !defined(__CFA_NO_STATISTICS__) 347 if(last_proc != kernelTLS .this_processor) {347 if(last_proc != kernelTLS().this_processor) { 348 348 __tls_stats()->ready.threads.migration++; 349 349 } 350 350 #endif 351 351 352 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);352 /* paranoid */ verify( ! __preemption_enabled() ); 353 353 /* paranoid */ verifyf( ((uintptr_t)thrd_src->context.SP) < ((uintptr_t)__get_stack(thrd_src->curr_cor)->base ), "ERROR : Returning $thread %p has been corrupted.\n StackPointer too small.\n", thrd_src ); 354 354 /* paranoid */ verifyf( ((uintptr_t)thrd_src->context.SP) > ((uintptr_t)__get_stack(thrd_src->curr_cor)->limit), "ERROR : Returning $thread %p has been corrupted.\n StackPointer too large.\n", thrd_src ); … … 359 359 // KERNEL ONLY 360 360 void __schedule_thread( $thread * thrd ) { 361 /* paranoid */ verify( ! __preemption_enabled() ); 361 362 /* paranoid */ verify( thrd ); 362 363 /* paranoid */ verify( thrd->state != Halted ); 363 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 364 /* paranoid */ verify( kernelTLS.this_proc_id ); 364 /* paranoid */ verify( kernelTLS().this_proc_id ); 365 365 /* paranoid */ #if defined( __CFA_WITH_VERIFY__ ) 366 366 /* paranoid */ if( thrd->state == Blocked || thrd->state == Start ) assertf( thrd->preempted == __NO_PREEMPTION, … … 380 380 ready_schedule_unlock(); 381 381 382 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);382 /* paranoid */ verify( ! __preemption_enabled() ); 383 383 } 384 384 385 385 // KERNEL ONLY 386 386 static inline $thread * __next_thread(cluster * this) with( *this ) { 387 /* paranoid */ verify( kernelTLS.this_proc_id);388 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );387 /* paranoid */ verify( ! __preemption_enabled() ); 388 /* paranoid */ verify( kernelTLS().this_proc_id ); 389 389 390 390 ready_schedule_lock(); … … 392 392 ready_schedule_unlock(); 393 393 394 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );395 /* paranoid */ verify( kernelTLS.this_proc_id);394 /* paranoid */ verify( kernelTLS().this_proc_id ); 395 /* paranoid */ verify( ! __preemption_enabled() ); 396 396 return thrd; 397 397 } … … 399 399 // KERNEL ONLY 400 400 static inline $thread * __next_thread_slow(cluster * this) with( *this ) { 401 /* paranoid */ verify( kernelTLS.this_proc_id);402 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );401 /* paranoid */ verify( ! __preemption_enabled() ); 402 /* paranoid */ verify( kernelTLS().this_proc_id ); 403 403 404 404 ready_schedule_lock(); … … 406 406 ready_schedule_unlock(); 407 407 408 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );409 /* paranoid */ verify( kernelTLS.this_proc_id);408 /* paranoid */ verify( kernelTLS().this_proc_id ); 409 /* paranoid */ verify( ! __preemption_enabled() ); 410 410 return thrd; 411 411 } … … 414 414 if( !thrd ) return; 415 415 416 /* paranoid */ verify( kernelTLS.this_proc_id );417 bool full = kernelTLS.this_proc_id->full_proc;418 if(full) disable_interrupts();419 420 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );421 416 int old_ticket = __atomic_fetch_add(&thrd->ticket, 1, __ATOMIC_SEQ_CST); 422 417 switch(old_ticket) { … … 428 423 /* paranoid */ verify( thrd->state == Blocked ); 429 424 430 // Wake lost the race, 431 __schedule_thread( thrd ); 425 { 426 /* paranoid */ verify( publicTLS_get(this_proc_id) ); 427 bool full = publicTLS_get(this_proc_id)->full_proc; 428 if(full) disable_interrupts(); 429 430 /* paranoid */ verify( ! __preemption_enabled() ); 431 432 // Wake lost the race, 433 __schedule_thread( thrd ); 434 435 /* paranoid */ verify( ! __preemption_enabled() ); 436 437 if(full) enable_interrupts( __cfaabi_dbg_ctx ); 438 /* paranoid */ verify( publicTLS_get(this_proc_id) ); 439 } 440 432 441 break; 433 442 default: … … 435 444 abort("Thread %p (%s) has mismatch park/unpark\n", thrd, thrd->self_cor.name); 436 445 } 437 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );438 439 if(full) enable_interrupts( __cfaabi_dbg_ctx );440 /* paranoid */ verify( kernelTLS.this_proc_id );441 446 } 442 447 443 448 void park( void ) { 444 /* paranoid */ verify( kernelTLS.preemption_state.enabled);449 /* paranoid */ verify( __preemption_enabled() ); 445 450 disable_interrupts(); 446 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);447 /* paranoid */ verify( kernelTLS .this_thread->preempted == __NO_PREEMPTION );451 /* paranoid */ verify( ! __preemption_enabled() ); 452 /* paranoid */ verify( kernelTLS().this_thread->preempted == __NO_PREEMPTION ); 448 453 449 454 returnToKernel(); 450 455 451 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);456 /* paranoid */ verify( ! __preemption_enabled() ); 452 457 enable_interrupts( __cfaabi_dbg_ctx ); 453 /* paranoid */ verify( kernelTLS.preemption_state.enabled);458 /* paranoid */ verify( __preemption_enabled() ); 454 459 455 460 } … … 460 465 // Should never return 461 466 void __cfactx_thrd_leave() { 462 $thread * thrd = TL_GET( this_thread);467 $thread * thrd = active_thread(); 463 468 $monitor * this = &thrd->self_mon; 464 469 … … 473 478 474 479 // Leave the thread 475 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);480 /* paranoid */ verify( ! __preemption_enabled() ); 476 481 returnToKernel(); 477 482 abort(); … … 483 488 // KERNEL ONLY 484 489 bool force_yield( __Preemption_Reason reason ) { 485 /* paranoid */ verify( kernelTLS.preemption_state.enabled);490 /* paranoid */ verify( __preemption_enabled() ); 486 491 disable_interrupts(); 487 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);488 489 $thread * thrd = kernelTLS .this_thread;492 /* paranoid */ verify( ! __preemption_enabled() ); 493 494 $thread * thrd = kernelTLS().this_thread; 490 495 /* paranoid */ verify(thrd->state == Active); 491 496 … … 501 506 } 502 507 503 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);508 /* paranoid */ verify( ! __preemption_enabled() ); 504 509 enable_interrupts_noPoll(); 505 /* paranoid */ verify( kernelTLS.preemption_state.enabled);510 /* paranoid */ verify( __preemption_enabled() ); 506 511 507 512 return preempted; … … 513 518 // Wake a thread from the front if there are any 514 519 static void __wake_one(cluster * this) { 515 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);520 /* paranoid */ verify( ! __preemption_enabled() ); 516 521 /* paranoid */ verify( ready_schedule_islocked() ); 517 522 … … 533 538 534 539 /* paranoid */ verify( ready_schedule_islocked() ); 535 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);540 /* paranoid */ verify( ! __preemption_enabled() ); 536 541 537 542 return; … … 543 548 544 549 disable_interrupts(); 545 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);550 /* paranoid */ verify( ! __preemption_enabled() ); 546 551 post( this->idle ); 547 552 enable_interrupts( __cfaabi_dbg_ctx ); … … 549 554 550 555 static void push (__cluster_idles & this, processor & proc) { 551 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);556 /* paranoid */ verify( ! __preemption_enabled() ); 552 557 lock( this ); 553 558 this.idle++; … … 556 561 insert_first(this.list, proc); 557 562 unlock( this ); 558 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);563 /* paranoid */ verify( ! __preemption_enabled() ); 559 564 } 560 565 561 566 static void remove(__cluster_idles & this, processor & proc) { 562 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);567 /* paranoid */ verify( ! __preemption_enabled() ); 563 568 lock( this ); 564 569 this.idle--; … … 567 572 remove(proc); 568 573 unlock( this ); 569 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);574 /* paranoid */ verify( ! __preemption_enabled() ); 570 575 } 571 576 … … 611 616 } 612 617 613 return kernelTLS.this_thread;618 return __cfaabi_tls.this_thread; 614 619 } 615 620 … … 636 641 637 642 int kernel_abort_lastframe( void ) __attribute__ ((__nothrow__)) { 638 return get_coroutine(kernelTLS .this_thread) == get_coroutine(mainThread) ? 4 : 2;643 return get_coroutine(kernelTLS().this_thread) == get_coroutine(mainThread) ? 4 : 2; 639 644 } 640 645 … … 668 673 if ( count < 0 ) { 669 674 // queue current task 670 append( waiting, kernelTLS.this_thread);675 append( waiting, active_thread() ); 671 676 672 677 // atomically release spin lock and block … … 718 723 void __cfaabi_dbg_record_lock(__spinlock_t & this, const char prev_name[]) { 719 724 this.prev_name = prev_name; 720 this.prev_thrd = kernelTLS .this_thread;725 this.prev_thrd = kernelTLS().this_thread; 721 726 } 722 727 }
Note: See TracChangeset
for help on using the changeset viewer.