Changeset 7768b8d for libcfa/src/concurrency/kernel.cfa
- Timestamp:
- Nov 26, 2019, 3:19:20 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 30763fd
- Parents:
- 21184e3
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel.cfa
r21184e3 r7768b8d 210 210 this.name = name; 211 211 this.cltr = &cltr; 212 id = -1u; 212 213 terminated{ 0 }; 213 214 do_terminate = false; … … 239 240 this.preemption_rate = preemption_rate; 240 241 ready_queue{}; 241 ready_queue_lock{}; 242 243 procs{ __get }; 242 ready_lock{}; 243 244 244 idles{ __get }; 245 245 threads{ __get }; … … 263 263 // Because of a bug, we couldn't initialized the seed on construction 264 264 // Do it here 265 kernelTLS.rand_seed ^= rdtsc ();265 kernelTLS.rand_seed ^= rdtscl(); 266 266 267 267 processor * this = runner.proc; … … 270 270 __cfaabi_dbg_print_safe("Kernel : core %p starting\n", this); 271 271 272 doregister(this->cltr, this); 272 // register the processor unless it's the main thread which is handled in the boot sequence 273 if(this != mainProcessor) 274 this->id = doregister(this->cltr, this); 273 275 274 276 { … … 306 308 } 307 309 308 unregister(this->cltr, this);309 310 310 V( this->terminated ); 311 312 // unregister the processor unless it's the main thread which is handled in the boot sequence 313 if(this != mainProcessor) 314 unregister(this->cltr, this); 311 315 312 316 __cfaabi_dbg_print_safe("Kernel : core %p terminated\n", this); … … 505 509 506 510 with( *thrd->curr_cluster ) { 507 lock ( ready_queue_lock __cfaabi_dbg_ctx2 ); 508 bool was_empty = !(ready_queue != 0); 509 append( ready_queue, thrd ); 510 unlock( ready_queue_lock ); 511 ready_schedule_lock(*thrd->curr_cluster, kernelTLS.this_processor); 512 __atomic_acquire(&ready_queue.lock); 513 thrd->ts = rdtscl(); 514 bool was_empty = push( ready_queue, thrd ); 515 __atomic_unlock(&ready_queue.lock); 516 ready_schedule_unlock(*thrd->curr_cluster, kernelTLS.this_processor); 511 517 512 518 if(was_empty) { … … 529 535 thread_desc * nextThread(cluster * this) with( *this ) { 530 536 verify( ! kernelTLS.preemption_state.enabled ); 531 lock( ready_queue_lock __cfaabi_dbg_ctx2 ); 532 thread_desc * head = pop_head( ready_queue ); 533 unlock( ready_queue_lock ); 537 538 ready_schedule_lock(*this, kernelTLS.this_processor); 539 __atomic_acquire(&ready_queue.lock); 540 thread_desc * head; 541 __attribute__((unused)) bool _; 542 [head, _] = pop( ready_queue ); 543 __atomic_unlock(&ready_queue.lock); 544 ready_schedule_unlock(*this, kernelTLS.this_processor); 545 534 546 verify( ! kernelTLS.preemption_state.enabled ); 535 547 return head; … … 693 705 pending_preemption = false; 694 706 kernel_thread = pthread_self(); 707 id = -1u; 695 708 696 709 runner{ &this }; … … 702 715 mainProcessor = (processor *)&storage_mainProcessor; 703 716 (*mainProcessor){}; 717 718 mainProcessor->id = doregister(mainCluster, mainProcessor); 704 719 705 720 //initialize the global state variables … … 748 763 kernel_stop_preemption(); 749 764 765 unregister(mainCluster, mainProcessor); 766 750 767 // Destroy the main processor and its context in reverse order of construction 751 768 // These were manually constructed so we need manually destroy them 752 769 ^(mainProcessor->runner){}; 753 ^( mainProcessor){};770 ^(*mainProcessor){}; 754 771 755 772 // Final step, destroy the main thread since it is no longer needed 756 // Since we provided a stack to this taxk it will not destroy anything 757 ^(mainThread){}; 773 // Since we provided a stack to this task it will not destroy anything 774 ^(*mainThread){}; 775 776 ^(*mainCluster){}; 758 777 759 778 ^(__cfa_dbg_global_clusters.list){}; … … 771 790 with( *cltr ) { 772 791 lock (proc_list_lock __cfaabi_dbg_ctx2); 773 remove (procs, *this);774 792 push_front(idles, *this); 775 793 unlock (proc_list_lock); … … 785 803 lock (proc_list_lock __cfaabi_dbg_ctx2); 786 804 remove (idles, *this); 787 push_front(procs, *this);788 805 unlock (proc_list_lock); 789 806 } … … 926 943 } 927 944 928 void doregister( cluster * cltr, processor * proc ) {929 lock (cltr->proc_list_lock __cfaabi_dbg_ctx2);930 cltr->nprocessors += 1;931 push_front(cltr->procs, *proc);932 unlock (cltr->proc_list_lock);933 }934 935 void unregister( cluster * cltr, processor * proc ) {936 lock (cltr->proc_list_lock __cfaabi_dbg_ctx2);937 remove(cltr->procs, *proc );938 cltr->nprocessors -= 1;939 unlock(cltr->proc_list_lock);940 }941 942 945 //----------------------------------------------------------------------------- 943 946 // Debug
Note: See TracChangeset
for help on using the changeset viewer.