- File:
-
- 1 edited
-
libcfa/src/concurrency/thread.cfa (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/thread.cfa
r5b2b42e r8c50aed 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 32 25 //----------------------------------------------------------------------------- 33 26 // Thread ctors and dtors … … 36 29 self_cor{ name, storage, storageSize }; 37 30 state = Start; 31 preempted = __NO_PREEMPTION; 38 32 curr_cor = &self_cor; 39 33 self_mon.owner = &this; … … 55 49 } 56 50 51 //----------------------------------------------------------------------------- 52 // Starting and stopping threads 53 forall( dtype T | is_thread(T) ) 54 void __thrd_start( T & this, void (*main_p)(T &) ) { 55 thread_desc * this_thrd = get_thread(this); 56 57 disable_interrupts(); 58 CtxStart(main_p, get_coroutine(this), this, CtxInvokeThread); 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 keyword 57 69 forall( dtype T | sized(T) | is_thread(T) | { void ?{}(T&); } ) 58 70 void ?{}( scoped(T)& this ) with( this ) { … … 72 84 } 73 85 74 //-----------------------------------------------------------------------------75 // Starting and stopping threads76 forall( dtype T | is_thread(T) )77 void __thrd_start( T & this, void (*main_p)(T &) ) {78 thread_desc * this_thrd = get_thread(this);79 80 disable_interrupts();81 CtxStart(main_p, get_coroutine(this), this, CtxInvokeThread);82 83 this_thrd->context.[SP, FP] = this_thrd->self_cor.context.[SP, FP];84 verify( this_thrd->context.SP );85 86 ScheduleThread(this_thrd);87 enable_interrupts( __cfaabi_dbg_ctx );88 }89 90 void yield( void ) {91 // Safety note : This could cause some false positives due to preemption92 verify( TL_GET( preemption_state.enabled ) );93 BlockInternal( TL_GET( this_thread ) );94 // Safety note : This could cause some false positives due to preemption95 verify( TL_GET( preemption_state.enabled ) );96 }97 98 void yield( unsigned times ) {99 for( unsigned i = 0; i < times; i++ ) {100 yield();101 }102 }103 104 86 // Local Variables: // 105 87 // mode: c //
Note:
See TracChangeset
for help on using the changeset viewer.