- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/coroutine.cfa
r76e069f r58b6d1b 22 22 #include <string.h> 23 23 #include <unistd.h> 24 // use this define to make unwind.h play nice, definetely a hack25 #define HIDE_EXPORTS26 #include <unwind.h>27 #undef HIDE_EXPORTS28 24 #include <sys/mman.h> 29 25 } … … 33 29 #define __CFA_INVOKE_PRIVATE__ 34 30 #include "invoke.h" 35 36 extern "C" {37 void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage) __attribute__ ((__noreturn__));38 static void _CtxCoroutine_UnwindCleanup(_Unwind_Reason_Code, struct _Unwind_Exception *) __attribute__ ((__noreturn__));39 static void _CtxCoroutine_UnwindCleanup(_Unwind_Reason_Code, struct _Unwind_Exception *) {40 abort();41 }42 }43 31 44 32 //----------------------------------------------------------------------------- … … 79 67 starter = NULL; 80 68 last = NULL; 81 cancellation = NULL;82 69 } 83 70 84 void ^?{}(coroutine_desc& this) { 85 if(this.state != Halted) { 86 coroutine_desc * src = TL_GET( this_coroutine ); 87 coroutine_desc * dst = &this; 88 89 struct _Unwind_Exception storage; 90 storage.exception_class = -1; 91 storage.exception_cleanup = _CtxCoroutine_UnwindCleanup; 92 this.cancellation = &storage; 93 this.last = src; 94 95 // not resuming self ? 96 if ( src == dst ) { 97 abort( "Attempt by coroutine %.256s (%p) to terminate itself.\n", src->name, src ); 98 } 99 100 CoroutineCtxSwitch( src, dst ); 101 } 102 } 71 void ^?{}(coroutine_desc& this) {} 103 72 104 73 // Part of the Public API … … 136 105 // Safety note : This could cause some false positives due to preemption 137 106 verify( TL_GET( preemption_state.enabled ) || TL_GET( this_processor )->do_terminate ); 138 139 if( unlikely(src->cancellation != NULL) ) {140 _CtxCoroutine_Unwind(src->cancellation);141 }142 107 } //ctxSwitchDirect 143 108 … … 197 162 } 198 163 199 void __leave_coroutine( ) {164 void __leave_coroutine(void) { 200 165 coroutine_desc * src = TL_GET( this_coroutine ); // optimization 201 coroutine_desc * starter = src->cancellation != 0 ? src->last : src->starter;202 166 203 src->state = Halted; 204 205 assertf( starter != 0, 167 assertf( src->starter != 0, 206 168 "Attempt to suspend/leave coroutine \"%.256s\" (%p) that has never been resumed.\n" 207 169 "Possible cause is a suspend executed in a member called by a coroutine user rather than by the coroutine main.", 208 170 src->name, src ); 209 assertf( s tarter->state != Halted,171 assertf( src->starter->state != Halted, 210 172 "Attempt by coroutine \"%.256s\" (%p) to suspend/leave back to terminated coroutine \"%.256s\" (%p).\n" 211 173 "Possible cause is terminated coroutine's main routine has already returned.", 212 src->name, src, s tarter->name,starter );174 src->name, src, src->starter->name, src->starter ); 213 175 214 CoroutineCtxSwitch( src, s tarter );176 CoroutineCtxSwitch( src, src->starter ); 215 177 } 216 178 }
Note: See TracChangeset
for help on using the changeset viewer.