- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/thread.cfa
rac2b598 r2026bb6 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 09:17:49 201913 // Update Count : 912 // Last Modified On : Fri Mar 30 17:19:52 2018 13 // Update Count : 8 14 14 // 15 15 … … 23 23 #include "invoke.h" 24 24 25 extern "C" { 26 #include <fenv.h> 27 #include <stddef.h> 28 } 29 30 //extern volatile thread_local processor * this_processor; 31 25 32 //----------------------------------------------------------------------------- 26 33 // Thread ctors and dtors 27 void ?{}( $thread& this, const char * const name, cluster & cl, void * storage, size_t storageSize ) with( this ) {28 context{ 0p, 0p};34 void ?{}(thread_desc & this, const char * const name, cluster & cl, void * storage, size_t storageSize ) with( this ) { 35 context{ NULL, NULL }; 29 36 self_cor{ name, storage, storageSize }; 30 37 state = Start; 31 preempted = __NO_PREEMPTION;32 38 curr_cor = &self_cor; 33 39 self_mon.owner = &this; … … 35 41 self_mon_p = &self_mon; 36 42 curr_cluster = &cl; 37 next = 0p;43 next = NULL; 38 44 39 node.next = 0p;40 node.prev = 0p;45 node.next = NULL; 46 node.prev = NULL; 41 47 doregister(curr_cluster, this); 42 48 … … 44 50 } 45 51 46 void ^?{}( $thread& this) with( this ) {52 void ^?{}(thread_desc& this) with( this ) { 47 53 unregister(curr_cluster, this); 48 54 ^self_cor{}; 49 55 } 50 56 51 //-----------------------------------------------------------------------------52 // Starting and stopping threads53 forall( dtype T | is_thread(T) )54 void __thrd_start( T & this, void (*main_p)(T &) ) {55 $thread * this_thrd = get_thread(this);56 57 disable_interrupts();58 __cfactx_start(main_p, get_coroutine(this), this, __cfactx_invoke_thread);59 60 this_thrd->context.[SP, FP] = this_thrd->self_cor.context.[SP, FP];61 verify( this_thrd->context.SP );62 63 __schedule_thread(this_thrd);64 enable_interrupts( __cfaabi_dbg_ctx );65 }66 67 //-----------------------------------------------------------------------------68 // Support for threads that don't ues the thread keyword69 57 forall( dtype T | sized(T) | is_thread(T) | { void ?{}(T&); } ) 70 58 void ?{}( scoped(T)& this ) with( this ) { 71 59 handle{}; 72 __thrd_start(handle , main);60 __thrd_start(handle); 73 61 } 74 62 … … 76 64 void ?{}( scoped(T)& this, P params ) with( this ) { 77 65 handle{ params }; 78 __thrd_start(handle , main);66 __thrd_start(handle); 79 67 } 80 68 … … 84 72 } 85 73 74 //----------------------------------------------------------------------------- 75 // Starting and stopping threads 76 forall( dtype T | is_thread(T) ) 77 void __thrd_start( T& this ) { 78 thread_desc * this_thrd = get_thread(this); 79 thread_desc * curr_thrd = TL_GET( this_thread ); 80 81 disable_interrupts(); 82 CtxStart(&this, CtxInvokeThread); 83 this_thrd->context.[SP, FP] = this_thrd->self_cor.context.[SP, FP]; 84 verify( this_thrd->context.SP ); 85 CtxSwitch( &curr_thrd->context, &this_thrd->context ); 86 87 ScheduleThread(this_thrd); 88 enable_interrupts( __cfaabi_dbg_ctx ); 89 } 90 91 extern "C" { 92 // KERNEL ONLY 93 void __finish_creation(thread_desc * this) { 94 // set new coroutine that the processor is executing 95 // and context switch to it 96 verify( kernelTLS.this_thread != this ); 97 verify( kernelTLS.this_thread->context.SP ); 98 CtxSwitch( &this->context, &kernelTLS.this_thread->context ); 99 } 100 } 101 102 void yield( void ) { 103 // Safety note : This could cause some false positives due to preemption 104 verify( TL_GET( preemption_state.enabled ) ); 105 BlockInternal( TL_GET( this_thread ) ); 106 // Safety note : This could cause some false positives due to preemption 107 verify( TL_GET( preemption_state.enabled ) ); 108 } 109 110 void yield( unsigned times ) { 111 for( unsigned i = 0; i < times; i++ ) { 112 yield(); 113 } 114 } 115 86 116 // Local Variables: // 87 117 // mode: c //
Note:
See TracChangeset
for help on using the changeset viewer.