Changeset 28e58fd for src/libcfa/concurrency/kernel.c
- Timestamp:
- Aug 25, 2017, 10:38:34 AM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 800d275
- Parents:
- af08051 (diff), 3eab308c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/kernel.c
raf08051 r28e58fd 73 73 }; 74 74 75 void ?{}( current_stack_info_t *this ) {76 CtxGet( this ->ctx );77 this ->base = this->ctx.FP;78 this ->storage = this->ctx.SP;75 void ?{}( current_stack_info_t & this ) { 76 CtxGet( this.ctx ); 77 this.base = this.ctx.FP; 78 this.storage = this.ctx.SP; 79 79 80 80 rlimit r; 81 81 getrlimit( RLIMIT_STACK, &r); 82 this ->size = r.rlim_cur;83 84 this ->limit = (void *)(((intptr_t)this->base) - this->size);85 this ->context = &storage_mainThreadCtx;86 this ->top = this->base;87 } 88 89 void ?{}( coStack_t *this, current_stack_info_t * info) {90 this ->size = info->size;91 this ->storage = info->storage;92 this ->limit = info->limit;93 this ->base = info->base;94 this ->context = info->context;95 this ->top = info->top;96 this ->userStack = true;97 } 98 99 void ?{}( coroutine_desc *this, current_stack_info_t * info) {100 ( &this->stack){ info };101 this ->name = "Main Thread";102 this ->errno_ = 0;103 this ->state = Start;104 } 105 106 void ?{}( thread_desc *this, current_stack_info_t * info) {107 ( &this->cor){ info };82 this.size = r.rlim_cur; 83 84 this.limit = (void *)(((intptr_t)this.base) - this.size); 85 this.context = &storage_mainThreadCtx; 86 this.top = this.base; 87 } 88 89 void ?{}( coStack_t & this, current_stack_info_t * info) { 90 this.size = info->size; 91 this.storage = info->storage; 92 this.limit = info->limit; 93 this.base = info->base; 94 this.context = info->context; 95 this.top = info->top; 96 this.userStack = true; 97 } 98 99 void ?{}( coroutine_desc & this, current_stack_info_t * info) { 100 (this.stack){ info }; 101 this.name = "Main Thread"; 102 this.errno_ = 0; 103 this.state = Start; 104 } 105 106 void ?{}( thread_desc & this, current_stack_info_t * info) { 107 (this.cor){ info }; 108 108 } 109 109 110 110 //----------------------------------------------------------------------------- 111 111 // Processor coroutine 112 void ?{}(processorCtx_t *this, processor * proc) {113 ( &this->__cor){ "Processor" };114 this ->proc = proc;115 proc->runner = this;116 } 117 118 void ?{}(processorCtx_t *this, processor * proc, current_stack_info_t * info) {119 ( &this->__cor){ info };120 this ->proc = proc;121 proc->runner = this;122 } 123 124 void ?{}(processor *this) {112 void ?{}(processorCtx_t & this, processor * proc) { 113 (this.__cor){ "Processor" }; 114 this.proc = proc; 115 proc->runner = &this; 116 } 117 118 void ?{}(processorCtx_t & this, processor * proc, current_stack_info_t * info) { 119 (this.__cor){ info }; 120 this.proc = proc; 121 proc->runner = &this; 122 } 123 124 void ?{}(processor & this) { 125 125 this{ mainCluster }; 126 126 } 127 127 128 void ?{}(processor *this, cluster * cltr) {129 this ->cltr = cltr;130 ( &this->terminated){ 0 };131 this ->do_terminate = false;132 this ->preemption_alarm = NULL;133 this ->pending_preemption = false;134 135 start( this );136 } 137 138 void ?{}(processor * this, cluster * cltr, processorCtx_t *runner) {139 this ->cltr = cltr;140 ( &this->terminated){ 0 };141 this ->do_terminate = false;142 this ->preemption_alarm = NULL;143 this ->pending_preemption = false;144 this ->kernel_thread = pthread_self();145 146 this ->runner =runner;147 LIB_DEBUG_PRINT_SAFE("Kernel : constructing main processor context %p\n", runner);148 runner{ this };149 } 150 151 void ^?{}(processor *this) {152 if( ! this ->do_terminate ) {153 LIB_DEBUG_PRINT_SAFE("Kernel : core %p signaling termination\n", this);154 this ->do_terminate = true;155 P( &this ->terminated );156 pthread_join( this ->kernel_thread, NULL );157 } 158 } 159 160 void ?{}(cluster *this) {161 ( &this->ready_queue ){};162 ( &this->ready_queue_lock ){};163 164 this ->preemption = default_preemption();165 } 166 167 void ^?{}(cluster *this) {128 void ?{}(processor & this, cluster * cltr) { 129 this.cltr = cltr; 130 (this.terminated){ 0 }; 131 this.do_terminate = false; 132 this.preemption_alarm = NULL; 133 this.pending_preemption = false; 134 135 start( &this ); 136 } 137 138 void ?{}(processor & this, cluster * cltr, processorCtx_t & runner) { 139 this.cltr = cltr; 140 (this.terminated){ 0 }; 141 this.do_terminate = false; 142 this.preemption_alarm = NULL; 143 this.pending_preemption = false; 144 this.kernel_thread = pthread_self(); 145 146 this.runner = &runner; 147 LIB_DEBUG_PRINT_SAFE("Kernel : constructing main processor context %p\n", &runner); 148 runner{ &this }; 149 } 150 151 void ^?{}(processor & this) { 152 if( ! this.do_terminate ) { 153 LIB_DEBUG_PRINT_SAFE("Kernel : core %p signaling termination\n", &this); 154 this.do_terminate = true; 155 P( &this.terminated ); 156 pthread_join( this.kernel_thread, NULL ); 157 } 158 } 159 160 void ?{}(cluster & this) { 161 ( this.ready_queue ){}; 162 ( this.ready_queue_lock ){}; 163 164 this.preemption = default_preemption(); 165 } 166 167 void ^?{}(cluster & this) { 168 168 169 169 } … … 173 173 //============================================================================================= 174 174 //Main of the processor contexts 175 void main(processorCtx_t *runner) {176 processor * this = runner ->proc;175 void main(processorCtx_t & runner) { 176 processor * this = runner.proc; 177 177 178 178 LIB_DEBUG_PRINT_SAFE("Kernel : core %p starting\n", this); … … 219 219 // from the processor coroutine to the target thread 220 220 void runThread(processor * this, thread_desc * dst) { 221 coroutine_desc * proc_cor = get_coroutine( this->runner);221 coroutine_desc * proc_cor = get_coroutine(*this->runner); 222 222 coroutine_desc * thrd_cor = get_coroutine(dst); 223 223 … … 301 301 // appropriate stack. 302 302 proc_cor_storage.__cor.state = Active; 303 main( &proc_cor_storage );303 main( proc_cor_storage ); 304 304 proc_cor_storage.__cor.state = Halted; 305 305 … … 441 441 mainThread = (thread_desc *)&storage_mainThread; 442 442 current_stack_info_t info; 443 mainThread{ &info };443 (*mainThread){ &info }; 444 444 445 445 LIB_DEBUG_PRINT_SAFE("Kernel : Main thread ready\n"); … … 447 447 // Initialize the main cluster 448 448 mainCluster = (cluster *)&storage_mainCluster; 449 mainCluster{};449 (*mainCluster){}; 450 450 451 451 LIB_DEBUG_PRINT_SAFE("Kernel : main cluster ready\n"); … … 454 454 // (the coroutine that contains the processing control flow) 455 455 mainProcessor = (processor *)&storage_mainProcessor; 456 mainProcessor{ mainCluster,(processorCtx_t *)&storage_mainProcessorCtx };456 (*mainProcessor){ mainCluster, *(processorCtx_t *)&storage_mainProcessorCtx }; 457 457 458 458 //initialize the global state variables … … 471 471 // context. Hence, the main thread does not begin through CtxInvokeThread, like all other threads. The trick here is that 472 472 // mainThread is on the ready queue when this call is made. 473 resume( mainProcessor->runner );473 resume( *mainProcessor->runner ); 474 474 475 475 … … 499 499 // Destroy the main processor and its context in reverse order of construction 500 500 // These were manually constructed so we need manually destroy them 501 ^( mainProcessor->runner){};501 ^(*mainProcessor->runner){}; 502 502 ^(mainProcessor){}; 503 503 … … 567 567 //----------------------------------------------------------------------------- 568 568 // Locks 569 void ?{}( spinlock *this ) {570 this ->lock = 0;571 } 572 void ^?{}( spinlock *this ) {569 void ?{}( spinlock & this ) { 570 this.lock = 0; 571 } 572 void ^?{}( spinlock & this ) { 573 573 574 574 } … … 604 604 } 605 605 606 void ?{}( semaphore *this, int count = 1 ) {607 ( &this->lock){};608 this ->count = count;609 ( &this->waiting){};610 } 611 void ^?{}(semaphore *this) {}606 void ?{}( semaphore & this, int count = 1 ) { 607 (this.lock){}; 608 this.count = count; 609 (this.waiting){}; 610 } 611 void ^?{}(semaphore & this) {} 612 612 613 613 void P(semaphore * this) { … … 643 643 //----------------------------------------------------------------------------- 644 644 // Queues 645 void ?{}( __thread_queue_t *this ) {646 this ->head = NULL;647 this ->tail = &this->head;645 void ?{}( __thread_queue_t & this ) { 646 this.head = NULL; 647 this.tail = &this.head; 648 648 } 649 649 … … 666 666 } 667 667 668 void ?{}( __condition_stack_t *this ) {669 this ->top = NULL;668 void ?{}( __condition_stack_t & this ) { 669 this.top = NULL; 670 670 } 671 671
Note:
See TracChangeset
for help on using the changeset viewer.