Changes in / [52ffa30:d97c3a4]
- Files:
-
- 1 added
- 1 deleted
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
automake/cfa.m4
r52ffa30 rd97c3a4 73 73 "arm" ) cannon_arch_name="arm";; 74 74 "ARM" ) cannon_arch_name="arm";; 75 "armv7l" ) cannon_arch_name="arm";;76 75 *) 77 76 >&2 echo "Unkown architecture " $arch_name; -
configure
r52ffa30 rd97c3a4 3550 3550 "arm" ) cannon_arch_name="arm";; 3551 3551 "ARM" ) cannon_arch_name="arm";; 3552 "armv7l" ) cannon_arch_name="arm";;3553 3552 *) 3554 3553 >&2 echo "Unkown architecture " $arch_name; … … 3591 3590 "arm" ) cannon_arch_name="arm";; 3592 3591 "ARM" ) cannon_arch_name="arm";; 3593 "armv7l" ) cannon_arch_name="arm";;3594 3592 *) 3595 3593 >&2 echo "Unkown architecture " $arch_name; -
libcfa/src/concurrency/coroutine.cfa
r52ffa30 rd97c3a4 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 } -
libcfa/src/concurrency/invoke.c
r52ffa30 rd97c3a4 17 17 #include <stdlib.h> 18 18 #include <stdio.h> 19 #include <unwind.h>20 19 21 20 #include "invoke.h" … … 51 50 main( this ); 52 51 52 cor->state = Halted; 53 53 54 //Final suspend, should never return 54 55 __leave_coroutine(); 55 56 __cabi_abort( "Resumed dead coroutine" ); 56 }57 58 static _Unwind_Reason_Code _CtxCoroutine_UnwindStop(59 __attribute((__unused__)) int version,60 _Unwind_Action actions,61 __attribute((__unused__)) _Unwind_Exception_Class exceptionClass,62 __attribute((__unused__)) struct _Unwind_Exception * unwind_exception,63 __attribute((__unused__)) struct _Unwind_Context * context,64 __attribute((__unused__)) void * param65 ) {66 if( actions & _UA_END_OF_STACK ) {67 // We finished unwinding the coroutine,68 // leave it69 __leave_coroutine();70 __cabi_abort( "Resumed dead coroutine" );71 }72 if( actions & _UA_CLEANUP_PHASE ) return _URC_NO_REASON;73 74 return _URC_FATAL_PHASE2_ERROR;75 }76 77 void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage) __attribute__ ((__noreturn__));78 void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage) {79 _Unwind_Reason_Code ret = _Unwind_ForcedUnwind( storage, _CtxCoroutine_UnwindStop, NULL );80 printf("UNWIND ERROR %d after force unwind\n", ret);81 abort();82 57 } 83 58 -
libcfa/src/concurrency/invoke.h
r52ffa30 rd97c3a4 80 80 81 81 struct coroutine_desc { 82 // stack information of the coroutine 83 struct coStack_t stack; 84 85 // textual name for coroutine/task, initialized by uC++ generated code 86 const char * name; 87 88 // copy of global UNIX variable errno 89 int errno_; 90 91 // current execution status for coroutine 92 enum coroutine_state state; 93 // first coroutine to resume this one 94 struct coroutine_desc * starter; 95 96 // last coroutine to resume this one 97 struct coroutine_desc * last; 98 99 // If non-null stack must be unwound with this exception 100 struct _Unwind_Exception * cancellation; 101 102 }; 103 104 // struct which calls the monitor is accepting 82 struct coStack_t stack; // stack information of the coroutine 83 const char * name; // textual name for coroutine/task, initialized by uC++ generated code 84 int errno_; // copy of global UNIX variable errno 85 enum coroutine_state state; // current execution status for coroutine 86 struct coroutine_desc * starter; // first coroutine to resume this one 87 struct coroutine_desc * last; // last coroutine to resume this one 88 }; 89 105 90 struct __waitfor_mask_t { 106 91 // the index of the accepted function, -1 if none -
tests/coroutine/pingpong.cfa
r52ffa30 rd97c3a4 24 24 25 25 void ?{}( PingPong & this, const char * name, unsigned int N, PingPong & part ) { 26 (this.__cor){name};27 26 this.name = name; 28 27 this.N = N; -
tests/test.py
r52ffa30 rd97c3a4 19 19 20 20 def matchTest(path): 21 match = re.search(" ^%s\/([\w\/\-_]*).expect\/([\w\-_]+)(\.[\w\-_]+)?\.txt$" % settings.SRCDIR, path)21 match = re.search("%s\/([\w\/\-_]*).expect\/([\w\-_]+)(\.[\w\-_]+)?\.txt" % settings.SRCDIR, path) 22 22 if match : 23 23 test = Test()
Note: See TracChangeset
for help on using the changeset viewer.