- File:
-
- 1 edited
-
src/libcfa/concurrency/invoke.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/invoke.c
r0157ca7 r8761006c 28 28 // Called from the kernel when starting a coroutine or task so must switch back to user mode. 29 29 30 extern void __suspend_ no_inline__F___1(void);31 extern void __ signal_termination__F_P7sthread__1(struct thread*);30 extern void __suspend_internal(void); 31 extern void __thread_signal_termination(struct thread*); 32 32 33 33 void CtxInvokeCoroutine( … … 41 41 42 42 if(cor->state == Primed) { 43 __suspend_ no_inline__F___1();43 __suspend_internal(); 44 44 } 45 45 … … 52 52 53 53 //Final suspend, should never return 54 __suspend_ no_inline__F___1();55 a ssertf(false,"Resumed dead coroutine");54 __suspend_internal(); 55 abortf("Resumed dead coroutine"); 56 56 } 57 57 … … 61 61 void *this 62 62 ) { 63 // LIB_DEBUG_PRINTF("Invoke Thread : Received %p (main %p, get_t %p)\n", this, main, get_thread); 64 65 __suspend_no_inline__F___1(); 63 __suspend_internal(); 66 64 67 65 struct thread* thrd = get_thread( this ); … … 72 70 main( this ); 73 71 74 __ signal_termination__F_P7sthread__1(thrd);72 __thread_signal_termination(thrd); 75 73 76 74 //Final suspend, should never return 77 __suspend_ no_inline__F___1();78 a ssertf(false,"Resumed dead thread");75 __suspend_internal(); 76 abortf("Resumed dead thread"); 79 77 } 80 78 … … 111 109 struct FakeStack { 112 110 void *fixedRegisters[5]; // fixed registers rbx, r12, r13, r14, r15 113 void *rturn; // where to go on return from uSwitch 111 uint32_t mxcr; // SSE Status and Control bits (control bits are preserved across function calls) 112 uint16_t fcw; // X97 FPU control word (preserved across function calls) 113 void *rturn; // where to go on return from uSwitch 114 114 void *dummyReturn; // NULL return address to provide proper alignment 115 115 }; … … 122 122 ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->fixedRegisters[0] = this; 123 123 ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->fixedRegisters[1] = invoke; 124 ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->mxcr = 0x1F80; //Vol. 2A 3-520 125 ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->fcw = 0x037F; //Vol. 1 8-7 124 126 #else 125 127 #error Only __i386__ and __x86_64__ is supported for threads in cfa
Note:
See TracChangeset
for help on using the changeset viewer.