- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel.cfa (modified) (20 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.cfa
r56e5b24 r1f45c7d 110 110 #endif 111 111 112 extern thread$* mainThread;112 extern $thread * mainThread; 113 113 extern processor * mainProcessor; 114 114 115 115 //----------------------------------------------------------------------------- 116 116 // Kernel Scheduling logic 117 static thread$* __next_thread(cluster * this);118 static thread$* __next_thread_slow(cluster * this);119 static inline bool __must_unpark( thread$* thrd ) __attribute((nonnull(1)));120 static void __run_thread(processor * this, thread$* dst);117 static $thread * __next_thread(cluster * this); 118 static $thread * __next_thread_slow(cluster * this); 119 static inline bool __must_unpark( $thread * thrd ) __attribute((nonnull(1))); 120 static void __run_thread(processor * this, $thread * dst); 121 121 static void __wake_one(cluster * cltr); 122 122 … … 181 181 __cfadbg_print_safe(runtime_core, "Kernel : core %p started\n", this); 182 182 183 thread$* readyThread = 0p;183 $thread * readyThread = 0p; 184 184 MAIN_LOOP: 185 185 for() { … … 231 231 __cfadbg_print_safe(runtime_core, "Kernel : core %p waiting on eventfd %d\n", this, this->idle); 232 232 233 { 234 eventfd_t val; 235 ssize_t ret = read( this->idle, &val, sizeof(val) ); 236 if(ret < 0) { 237 switch((int)errno) { 238 case EAGAIN: 239 #if EAGAIN != EWOULDBLOCK 240 case EWOULDBLOCK: 241 #endif 242 case EINTR: 243 // No need to do anything special here, just assume it's a legitimate wake-up 244 break; 245 default: 246 abort( "KERNEL : internal error, read failure on idle eventfd, error(%d) %s.", (int)errno, strerror( (int)errno ) ); 247 } 248 } 249 } 233 __disable_interrupts_hard(); 234 eventfd_t val; 235 eventfd_read( this->idle, &val ); 236 __enable_interrupts_hard(); 250 237 251 238 #if !defined(__CFA_NO_STATISTICS__) … … 401 388 // runThread runs a thread by context switching 402 389 // from the processor coroutine to the target thread 403 static void __run_thread(processor * this, thread$* thrd_dst) {390 static void __run_thread(processor * this, $thread * thrd_dst) { 404 391 /* paranoid */ verify( ! __preemption_enabled() ); 405 392 /* paranoid */ verifyf( thrd_dst->state == Ready || thrd_dst->preempted != __NO_PREEMPTION, "state : %d, preempted %d\n", thrd_dst->state, thrd_dst->preempted); … … 419 406 __cfadbg_print_safe(runtime_core, "Kernel : core %p running thread %p (%s)\n", this, thrd_dst, thrd_dst->self_cor.name); 420 407 421 coroutine$* proc_cor = get_coroutine(this->runner);408 $coroutine * proc_cor = get_coroutine(this->runner); 422 409 423 410 // set state of processor coroutine to inactive … … 438 425 /* paranoid */ verify( thrd_dst->context.SP ); 439 426 /* paranoid */ verify( thrd_dst->state != Halted ); 440 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ) || thrd_dst->curr_cor == proc_cor || thrd_dst->corctx_flag, "ERROR : Destination thread$%p has been corrupted.\n StackPointer too small.\n", thrd_dst ); // add escape condition if we are setting up the processor441 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit) || thrd_dst->curr_cor == proc_cor || thrd_dst->corctx_flag, "ERROR : Destination thread$%p has been corrupted.\n StackPointer too large.\n", thrd_dst ); // add escape condition if we are setting up the processor427 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ) || thrd_dst->curr_cor == proc_cor || thrd_dst->corctx_flag, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too small.\n", thrd_dst ); // add escape condition if we are setting up the processor 428 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit) || thrd_dst->curr_cor == proc_cor || thrd_dst->corctx_flag, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too large.\n", thrd_dst ); // add escape condition if we are setting up the processor 442 429 /* paranoid */ verify( 0x0D15EA5E0D15EA5Ep == thrd_dst->canary ); 443 430 … … 451 438 452 439 /* paranoid */ verify( 0x0D15EA5E0D15EA5Ep == thrd_dst->canary ); 453 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit) || thrd_dst->corctx_flag, "ERROR : Destination thread$%p has been corrupted.\n StackPointer too large.\n", thrd_dst );454 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ) || thrd_dst->corctx_flag, "ERROR : Destination thread$%p has been corrupted.\n StackPointer too small.\n", thrd_dst );440 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit) || thrd_dst->corctx_flag, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too large.\n", thrd_dst ); 441 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ) || thrd_dst->corctx_flag, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too small.\n", thrd_dst ); 455 442 /* paranoid */ verify( thrd_dst->context.SP ); 456 443 /* paranoid */ verify( thrd_dst->curr_cluster == this->cltr ); … … 518 505 void returnToKernel() { 519 506 /* paranoid */ verify( ! __preemption_enabled() ); 520 coroutine$* proc_cor = get_coroutine(kernelTLS().this_processor->runner);521 thread$* thrd_src = kernelTLS().this_thread;507 $coroutine * proc_cor = get_coroutine(kernelTLS().this_processor->runner); 508 $thread * thrd_src = kernelTLS().this_thread; 522 509 523 510 __STATS( thrd_src->last_proc = kernelTLS().this_processor; ) … … 547 534 548 535 /* paranoid */ verify( ! __preemption_enabled() ); 549 /* paranoid */ verifyf( ((uintptr_t)thrd_src->context.SP) < ((uintptr_t)__get_stack(thrd_src->curr_cor)->base ) || thrd_src->corctx_flag, "ERROR : Returning thread$%p has been corrupted.\n StackPointer too small.\n", thrd_src );550 /* paranoid */ verifyf( ((uintptr_t)thrd_src->context.SP) > ((uintptr_t)__get_stack(thrd_src->curr_cor)->limit) || thrd_src->corctx_flag, "ERROR : Returning thread$%p has been corrupted.\n StackPointer too large.\n", thrd_src );536 /* paranoid */ verifyf( ((uintptr_t)thrd_src->context.SP) < ((uintptr_t)__get_stack(thrd_src->curr_cor)->base ) || thrd_src->corctx_flag, "ERROR : Returning $thread %p has been corrupted.\n StackPointer too small.\n", thrd_src ); 537 /* paranoid */ verifyf( ((uintptr_t)thrd_src->context.SP) > ((uintptr_t)__get_stack(thrd_src->curr_cor)->limit) || thrd_src->corctx_flag, "ERROR : Returning $thread %p has been corrupted.\n StackPointer too large.\n", thrd_src ); 551 538 } 552 539 … … 554 541 // Scheduler routines 555 542 // KERNEL ONLY 556 static void __schedule_thread( thread$* thrd ) {543 static void __schedule_thread( $thread * thrd ) { 557 544 /* paranoid */ verify( ! __preemption_enabled() ); 558 545 /* paranoid */ verify( ready_schedule_islocked()); … … 602 589 } 603 590 604 void schedule_thread$( thread$* thrd ) {591 void schedule_thread$( $thread * thrd ) { 605 592 ready_schedule_lock(); 606 593 __schedule_thread( thrd ); … … 609 596 610 597 // KERNEL ONLY 611 static inline thread$* __next_thread(cluster * this) with( *this ) {598 static inline $thread * __next_thread(cluster * this) with( *this ) { 612 599 /* paranoid */ verify( ! __preemption_enabled() ); 613 600 614 601 ready_schedule_lock(); 615 thread$* thrd = pop_fast( this );602 $thread * thrd = pop_fast( this ); 616 603 ready_schedule_unlock(); 617 604 … … 621 608 622 609 // KERNEL ONLY 623 static inline thread$* __next_thread_slow(cluster * this) with( *this ) {610 static inline $thread * __next_thread_slow(cluster * this) with( *this ) { 624 611 /* paranoid */ verify( ! __preemption_enabled() ); 625 612 626 613 ready_schedule_lock(); 627 thread$* thrd;614 $thread * thrd; 628 615 for(25) { 629 616 thrd = pop_slow( this ); … … 639 626 } 640 627 641 static inline bool __must_unpark( thread$* thrd ) {628 static inline bool __must_unpark( $thread * thrd ) { 642 629 int old_ticket = __atomic_fetch_add(&thrd->ticket, 1, __ATOMIC_SEQ_CST); 643 630 switch(old_ticket) { … … 655 642 } 656 643 657 void __kernel_unpark( thread$* thrd ) {644 void __kernel_unpark( $thread * thrd ) { 658 645 /* paranoid */ verify( ! __preemption_enabled() ); 659 646 /* paranoid */ verify( ready_schedule_islocked()); … … 670 657 } 671 658 672 void unpark( thread$* thrd ) {659 void unpark( $thread * thrd ) { 673 660 if( !thrd ) return; 674 661 … … 694 681 // Should never return 695 682 void __cfactx_thrd_leave() { 696 thread$* thrd = active_thread();697 monitor$* this = &thrd->self_mon;683 $thread * thrd = active_thread(); 684 $monitor * this = &thrd->self_mon; 698 685 699 686 // Lock the monitor now … … 707 694 /* paranoid */ verify( kernelTLS().this_thread == thrd ); 708 695 /* paranoid */ verify( thrd->context.SP ); 709 /* paranoid */ verifyf( ((uintptr_t)thrd->context.SP) > ((uintptr_t)__get_stack(thrd->curr_cor)->limit), "ERROR : thread$%p has been corrupted.\n StackPointer too large.\n", thrd );710 /* paranoid */ verifyf( ((uintptr_t)thrd->context.SP) < ((uintptr_t)__get_stack(thrd->curr_cor)->base ), "ERROR : thread$%p has been corrupted.\n StackPointer too small.\n", thrd );696 /* paranoid */ verifyf( ((uintptr_t)thrd->context.SP) > ((uintptr_t)__get_stack(thrd->curr_cor)->limit), "ERROR : $thread %p has been corrupted.\n StackPointer too large.\n", thrd ); 697 /* paranoid */ verifyf( ((uintptr_t)thrd->context.SP) < ((uintptr_t)__get_stack(thrd->curr_cor)->base ), "ERROR : $thread %p has been corrupted.\n StackPointer too small.\n", thrd ); 711 698 712 699 thrd->state = Halting; … … 726 713 bool force_yield( __Preemption_Reason reason ) { 727 714 __disable_interrupts_checked(); 728 thread$* thrd = kernelTLS().this_thread;715 $thread * thrd = kernelTLS().this_thread; 729 716 /* paranoid */ verify(thrd->state == Active); 730 717 … … 838 825 //============================================================================================= 839 826 void __kernel_abort_msg( char * abort_text, int abort_text_size ) { 840 thread$* thrd = __cfaabi_tls.this_thread;827 $thread * thrd = __cfaabi_tls.this_thread; 841 828 842 829 if(thrd) {
Note:
See TracChangeset
for help on using the changeset viewer.