- File:
-
- 1 edited
-
libcfa/src/concurrency/invoke.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/invoke.c
r09f357ec r2026bb6 29 29 // Called from the kernel when starting a coroutine or task so must switch back to user mode. 30 30 31 extern void __leave_coroutine ( struct coroutine_desc * ); 32 extern struct coroutine_desc * __finish_coroutine(void); 33 extern void __leave_thread_monitor(); 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 ); 34 35 extern void disable_interrupts() OPTIONAL_THREAD; 35 36 extern void enable_interrupts( __cfaabi_dbg_ctx_param ); … … 37 38 void CtxInvokeCoroutine( 38 39 void (*main)(void *), 40 struct coroutine_desc *(*get_coroutine)(void *), 39 41 void *this 40 42 ) { 41 // Finish setting up the coroutine by setting its state 42 struct coroutine_desc * cor = __finish_coroutine(); 43 struct coroutine_desc* cor = get_coroutine( this ); 43 44 44 // Call the main of the coroutine 45 if(cor->state == Primed) { 46 __suspend_internal(); 47 } 48 49 cor->state = Active; 50 45 51 main( this ); 46 52 … … 77 83 78 84 void CtxInvokeThread( 85 void (*dtor)(void *), 79 86 void (*main)(void *), 87 struct thread_desc *(*get_thread)(void *), 80 88 void *this 81 89 ) { 90 // Fetch the thread handle from the user defined thread structure 91 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 risk 95 __finish_creation( thrd ); 96 82 97 // Officially start the thread by enabling preemption 83 98 enable_interrupts( __cfaabi_dbg_ctx ); … … 93 108 // The order of these 4 operations is very important 94 109 //Final suspend, should never return 95 __leave_thread_monitor( );110 __leave_thread_monitor( thrd ); 96 111 __cabi_abort( "Resumed dead thread" ); 97 112 } 98 113 114 99 115 void CtxStart( 100 116 void (*main)(void *), 101 struct coroutine_desc * cor,117 struct coroutine_desc *(*get_coroutine)(void *), 102 118 void *this, 103 119 void (*invoke)(void *) 104 120 ) { 121 struct coroutine_desc * cor = get_coroutine( this ); 105 122 struct __stack_t * stack = cor->stack.storage; 106 123 … … 121 138 122 139 fs->dummyReturn = NULL; 123 fs->argument[0] = main; // argument to invoke 124 fs->argument[1] = this; // argument to invoke 140 fs->argument[0] = this; // argument to invoke 125 141 fs->rturn = invoke; 126 142 … … 140 156 fs->dummyReturn = NULL; 141 157 fs->rturn = CtxInvokeStub; 142 fs->fixedRegisters[0] = main; 143 fs->fixedRegisters[1] = this; 144 fs->fixedRegisters[2] = invoke; 158 fs->fixedRegisters[0] = this; 159 fs->fixedRegisters[1] = invoke; 145 160 146 161 #elif defined( __ARM_ARCH ) 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) 162 148 163 struct FakeStack { 149 164 float fpRegs[16]; // floating point registers
Note:
See TracChangeset
for help on using the changeset viewer.