Changeset b7d6a36 for libcfa/src/concurrency
- Timestamp:
- Feb 20, 2020, 4:15:51 PM (6 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:
- 6a490b2
- Parents:
- dca5802 (diff), 2cbfe92 (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. - Location:
- libcfa/src/concurrency
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/CtxSwitch-x86_64.S
rdca5802 rb7d6a36 87 87 CtxInvokeStub: 88 88 movq %rbx, %rdi 89 jmp *%r12 89 movq %r12, %rsi 90 jmp *%r13 90 91 .size CtxInvokeStub, .-CtxInvokeStub 91 92 -
libcfa/src/concurrency/alarm.cfa
rdca5802 rb7d6a36 10 10 // Created On : Fri Jun 2 11:31:25 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Dec 3 22:47:24 201913 // Update Count : 6 812 // Last Modified On : Sun Jan 5 08:41:36 2020 13 // Update Count : 69 14 14 // 15 15 … … 39 39 40 40 void __kernel_set_timer( Duration alarm ) { 41 verifyf(alarm >= 1`us || alarm == 0, "Setting timer to < 1us (%jins)", alarm .tv);41 verifyf(alarm >= 1`us || alarm == 0, "Setting timer to < 1us (%jins)", alarm`ns); 42 42 setitimer( ITIMER_REAL, &(itimerval){ alarm }, 0p ); 43 43 } -
libcfa/src/concurrency/coroutine.cfa
rdca5802 rb7d6a36 10 10 // Created On : Mon Nov 28 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T hu Dec 5 14:37:29 201913 // Update Count : 1 512 // Last Modified On : Tue Feb 4 12:29:25 2020 13 // Update Count : 16 14 14 // 15 15 … … 89 89 } 90 90 91 void ?{}( coroutine_desc & this, const char * name, void * storage, size_t storageSize ) with( this ) {91 void ?{}( coroutine_desc & this, const char name[], void * storage, size_t storageSize ) with( this ) { 92 92 (this.context){0p, 0p}; 93 93 (this.stack){storage, storageSize}; … … 187 187 // is not inline (We can't inline Cforall in C) 188 188 extern "C" { 189 void __suspend_internal(void) { 190 suspend(); 191 } 192 193 void __leave_coroutine( coroutine_desc * src ) { 189 void __leave_coroutine( struct coroutine_desc * src ) { 194 190 coroutine_desc * starter = src->cancellation != 0 ? src->last : src->starter; 195 191 … … 207 203 CoroutineCtxSwitch( src, starter ); 208 204 } 205 206 struct coroutine_desc * __finish_coroutine(void) { 207 struct coroutine_desc * cor = kernelTLS.this_thread->curr_cor; 208 209 if(cor->state == Primed) { 210 suspend(); 211 } 212 213 cor->state = Active; 214 215 return cor; 216 } 209 217 } 210 218 -
libcfa/src/concurrency/coroutine.hfa
rdca5802 rb7d6a36 10 10 // Created On : Mon Nov 28 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Dec 3 22:47:58 201913 // Update Count : 1 012 // Last Modified On : Tue Feb 4 12:29:26 2020 13 // Update Count : 11 14 14 // 15 15 … … 35 35 // void ^?{}( coStack_t & this ); 36 36 37 void ?{}( coroutine_desc & this, const char * name, void * storage, size_t storageSize );37 void ?{}( coroutine_desc & this, const char name[], void * storage, size_t storageSize ); 38 38 void ^?{}( coroutine_desc & this ); 39 39 … … 41 41 static inline void ?{}( coroutine_desc & this, size_t stackSize) { this{ "Anonymous Coroutine", 0p, stackSize }; } 42 42 static inline void ?{}( coroutine_desc & this, void * storage, size_t storageSize ) { this{ "Anonymous Coroutine", storage, storageSize }; } 43 static inline void ?{}( coroutine_desc & this, const char * name) { this{ name, 0p, 0 }; }44 static inline void ?{}( coroutine_desc & this, const char * name, size_t stackSize ) { this{ name, 0p, stackSize }; }43 static inline void ?{}( coroutine_desc & this, const char name[]) { this{ name, 0p, 0 }; } 44 static inline void ?{}( coroutine_desc & this, const char name[], size_t stackSize ) { this{ name, 0p, stackSize }; } 45 45 46 46 //----------------------------------------------------------------------------- … … 61 61 // Start coroutine routines 62 62 extern "C" { 63 forall(dtype T | is_coroutine(T)) 64 void CtxInvokeCoroutine(T * this); 63 void CtxInvokeCoroutine(void (*main)(void *), void * this); 65 64 66 forall(dtype T | is_coroutine(T))67 void CtxStart(T * this, void ( *invoke)(T*));65 forall(dtype T) 66 void CtxStart(void (*main)(T &), struct coroutine_desc * cor, T & this, void (*invoke)(void (*main)(void *), void *)); 68 67 69 68 extern void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage, struct coroutine_desc *) __attribute__ ((__noreturn__)); … … 129 128 130 129 if( unlikely(dst->context.SP == 0p) ) { 130 TL_GET( this_thread )->curr_cor = dst; 131 131 __stack_prepare(&dst->stack, 65000); 132 CtxStart(&cor, CtxInvokeCoroutine); 132 CtxStart(main, dst, cor, CtxInvokeCoroutine); 133 TL_GET( this_thread )->curr_cor = src; 133 134 } 134 135 -
libcfa/src/concurrency/invoke.c
rdca5802 rb7d6a36 29 29 // Called from the kernel when starting a coroutine or task so must switch back to user mode. 30 30 31 extern void __suspend_internal(void); 32 extern void __leave_coroutine( struct coroutine_desc * ); 33 extern void __finish_creation( struct thread_desc * ); 34 extern void __leave_thread_monitor( struct thread_desc * this ); 31 extern void __leave_coroutine ( struct coroutine_desc * ); 32 extern struct coroutine_desc * __finish_coroutine(void); 33 extern void __leave_thread_monitor(); 35 34 extern void disable_interrupts() OPTIONAL_THREAD; 36 35 extern void enable_interrupts( __cfaabi_dbg_ctx_param ); … … 38 37 void CtxInvokeCoroutine( 39 38 void (*main)(void *), 40 struct coroutine_desc *(*get_coroutine)(void *),41 39 void *this 42 40 ) { 43 struct coroutine_desc* cor = get_coroutine( this ); 41 // Finish setting up the coroutine by setting its state 42 struct coroutine_desc * cor = __finish_coroutine(); 44 43 45 if(cor->state == Primed) { 46 __suspend_internal(); 47 } 48 49 cor->state = Active; 50 44 // Call the main of the coroutine 51 45 main( this ); 52 46 … … 83 77 84 78 void CtxInvokeThread( 85 void (*dtor)(void *),86 79 void (*main)(void *), 87 struct thread_desc *(*get_thread)(void *),88 80 void *this 89 81 ) { 90 // Fetch the thread handle from the user defined thread structure91 struct thread_desc* thrd = get_thread( this );92 93 // First suspend, once the thread arrives here,94 // the function pointer to main can be invalidated without risk95 __finish_creation( thrd );96 97 82 // Officially start the thread by enabling preemption 98 83 enable_interrupts( __cfaabi_dbg_ctx ); … … 108 93 // The order of these 4 operations is very important 109 94 //Final suspend, should never return 110 __leave_thread_monitor( thrd);95 __leave_thread_monitor(); 111 96 __cabi_abort( "Resumed dead thread" ); 112 97 } 113 98 114 115 99 void CtxStart( 116 100 void (*main)(void *), 117 struct coroutine_desc * (*get_coroutine)(void *),101 struct coroutine_desc * cor, 118 102 void *this, 119 103 void (*invoke)(void *) 120 104 ) { 121 struct coroutine_desc * cor = get_coroutine( this );122 105 struct __stack_t * stack = cor->stack.storage; 123 106 … … 138 121 139 122 fs->dummyReturn = NULL; 140 fs->argument[0] = this; // argument to invoke 123 fs->argument[0] = main; // argument to invoke 124 fs->argument[1] = this; // argument to invoke 141 125 fs->rturn = invoke; 142 126 … … 156 140 fs->dummyReturn = NULL; 157 141 fs->rturn = CtxInvokeStub; 158 fs->fixedRegisters[0] = this; 159 fs->fixedRegisters[1] = invoke; 142 fs->fixedRegisters[0] = main; 143 fs->fixedRegisters[1] = this; 144 fs->fixedRegisters[2] = invoke; 160 145 161 146 #elif defined( __ARM_ARCH ) 162 147 #error ARM needs to be upgrade to use to parameters like X86/X64 (A.K.A. : I broke this and do not know how to fix it) 163 148 struct FakeStack { 164 149 float fpRegs[16]; // floating point registers -
libcfa/src/concurrency/kernel.cfa
rdca5802 rb7d6a36 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T hu Dec 5 16:25:52 201913 // Update Count : 5 212 // Last Modified On : Tue Feb 4 13:03:15 2020 13 // Update Count : 58 14 14 // 15 15 … … 210 210 211 211 static void start(processor * this); 212 void ?{}(processor & this, const char * name, cluster & cltr) with( this ) {212 void ?{}(processor & this, const char name[], cluster & cltr) with( this ) { 213 213 this.name = name; 214 214 this.cltr = &cltr; … … 240 240 } 241 241 242 void ?{}(cluster & this, const char * name, Duration preemption_rate) with( this ) {242 void ?{}(cluster & this, const char name[], Duration preemption_rate) with( this ) { 243 243 this.name = name; 244 244 this.preemption_rate = preemption_rate; … … 454 454 } 455 455 456 static void Abort( int ret, const char * func) {456 static void Abort( int ret, const char func[] ) { 457 457 if ( ret ) { // pthread routines return errno values 458 458 abort( "%s : internal error, error(%d) %s.", func, ret, strerror( ret ) ); … … 503 503 verify( ! kernelTLS.preemption_state.enabled ); 504 504 505 kernelTLS.this_thread->curr_cor = dst; 505 506 __stack_prepare( &dst->stack, 65000 ); 506 CtxStart( &this->runner, CtxInvokeCoroutine);507 CtxStart(main, dst, this->runner, CtxInvokeCoroutine); 507 508 508 509 verify( ! kernelTLS.preemption_state.enabled ); … … 518 519 CtxSwitch( &src->context, &dst->context ); 519 520 // when CtxSwitch returns we are back in the src coroutine 521 522 mainThread->curr_cor = &mainThread->self_cor; 520 523 521 524 // set state of new coroutine to active … … 864 867 sigemptyset( &mask ); 865 868 sigaddset( &mask, SIGALRM ); // block SIGALRM signals 866 sigsuspend( &mask ); // block the processor to prevent further damage during abort 867 _exit( EXIT_FAILURE ); // if processor unblocks before it is killed, terminate it 869 sigaddset( &mask, SIGUSR1 ); // block SIGALRM signals 870 sigsuspend( &mask ); // block the processor to prevent further damage during abort 871 _exit( EXIT_FAILURE ); // if processor unblocks before it is killed, terminate it 868 872 } 869 873 else { … … 986 990 __cfaabi_dbg_debug_do( 987 991 extern "C" { 988 void __cfaabi_dbg_record(__spinlock_t & this, const char * prev_name) {992 void __cfaabi_dbg_record(__spinlock_t & this, const char prev_name[]) { 989 993 this.prev_name = prev_name; 990 994 this.prev_thrd = kernelTLS.this_thread; -
libcfa/src/concurrency/kernel.hfa
rdca5802 rb7d6a36 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Dec 4 07:54:51 201913 // Update Count : 1812 // Last Modified On : Tue Feb 4 12:29:26 2020 13 // Update Count : 22 14 14 // 15 15 … … 151 151 }; 152 152 153 void ?{}(processor & this, const char * name, struct cluster & cltr);153 void ?{}(processor & this, const char name[], struct cluster & cltr); 154 154 void ^?{}(processor & this); 155 155 156 156 static inline void ?{}(processor & this) { this{ "Anonymous Processor", *mainCluster}; } 157 157 static inline void ?{}(processor & this, struct cluster & cltr) { this{ "Anonymous Processor", cltr}; } 158 static inline void ?{}(processor & this, const char * name) { this{name, *mainCluster }; }158 static inline void ?{}(processor & this, const char name[]) { this{name, *mainCluster }; } 159 159 160 160 static inline [processor *&, processor *& ] __get( processor & this ) { … … 344 344 extern Duration default_preemption(); 345 345 346 void ?{} (cluster & this, const char * name, Duration preemption_rate);346 void ?{} (cluster & this, const char name[], Duration preemption_rate); 347 347 void ^?{}(cluster & this); 348 348 349 349 static inline void ?{} (cluster & this) { this{"Anonymous Cluster", default_preemption()}; } 350 350 static inline void ?{} (cluster & this, Duration preemption_rate) { this{"Anonymous Cluster", preemption_rate}; } 351 static inline void ?{} (cluster & this, const char * name) { this{name, default_preemption()}; }351 static inline void ?{} (cluster & this, const char name[]) { this{name, default_preemption()}; } 352 352 353 353 static inline [cluster *&, cluster *& ] __get( cluster & this ) { -
libcfa/src/concurrency/kernel_private.hfa
rdca5802 rb7d6a36 88 88 // Threads 89 89 extern "C" { 90 forall(dtype T | is_thread(T)) 91 void CtxInvokeThread(T * this); 90 void CtxInvokeThread(void (*main)(void *), void * this); 92 91 } 93 92 -
libcfa/src/concurrency/monitor.cfa
rdca5802 rb7d6a36 243 243 // last routine called by a thread. 244 244 // Should never return 245 void __leave_thread_monitor( thread_desc * thrd ) { 245 void __leave_thread_monitor() { 246 thread_desc * thrd = TL_GET( this_thread ); 246 247 monitor_desc * this = &thrd->self_mon; 247 248 -
libcfa/src/concurrency/thread.cfa
rdca5802 rb7d6a36 59 59 void ?{}( scoped(T)& this ) with( this ) { 60 60 handle{}; 61 __thrd_start(handle );61 __thrd_start(handle, main); 62 62 } 63 63 … … 65 65 void ?{}( scoped(T)& this, P params ) with( this ) { 66 66 handle{ params }; 67 __thrd_start(handle );67 __thrd_start(handle, main); 68 68 } 69 69 … … 76 76 // Starting and stopping threads 77 77 forall( dtype T | is_thread(T) ) 78 void __thrd_start( T & this) {78 void __thrd_start( T & this, void (*main_p)(T &) ) { 79 79 thread_desc * this_thrd = get_thread(this); 80 thread_desc * curr_thrd = TL_GET( this_thread );81 80 82 81 disable_interrupts(); 83 CtxStart(&this, CtxInvokeThread); 82 CtxStart(main_p, get_coroutine(this), this, CtxInvokeThread); 83 84 84 this_thrd->context.[SP, FP] = this_thrd->self_cor.context.[SP, FP]; 85 85 verify( this_thrd->context.SP ); 86 CtxSwitch( &curr_thrd->context, &this_thrd->context );87 86 88 87 ScheduleThread(this_thrd); 89 88 enable_interrupts( __cfaabi_dbg_ctx ); 90 }91 92 extern "C" {93 // KERNEL ONLY94 void __finish_creation(thread_desc * this) {95 // set new coroutine that the processor is executing96 // and context switch to it97 verify( kernelTLS.this_thread != this );98 verify( kernelTLS.this_thread->context.SP );99 CtxSwitch( &this->context, &kernelTLS.this_thread->context );100 }101 89 } 102 90 -
libcfa/src/concurrency/thread.hfa
rdca5802 rb7d6a36 54 54 55 55 forall( dtype T | is_thread(T) ) 56 void __thrd_start( T & this );56 void __thrd_start( T & this, void (*)(T &) ); 57 57 58 58 //-----------------------------------------------------------------------------
Note:
See TracChangeset
for help on using the changeset viewer.