Changeset 8118303 for src/libcfa/concurrency/coroutines
- Timestamp:
- Jan 17, 2017, 5:13:47 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- c49bf54
- Parents:
- 7350ff97
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/coroutines
r7350ff97 r8118303 1 // - *- Mode: CFA -*-1 // - *- Mode: CFA - *- 2 2 // 3 3 // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo … … 18 18 #define COROUTINES_H 19 19 20 #include "assert" //20 #include "assert" 21 21 #include "invoke.h" 22 22 … … 26 26 // Anything that is resumed is a coroutine. 27 27 trait is_coroutine(dtype T) { 28 void co_main(T * this);29 coroutine * get_coroutine(T* this);28 void co_main(T * this); 29 coroutine * get_coroutine(T * this); 30 30 }; 31 31 32 32 //----------------------------------------------------------------------------- 33 33 // Ctors and dtors 34 void ?{}(coStack_t * this);35 void ?{}(coroutine * this);36 void ^?{}(coStack_t * this);37 void ^?{}(coroutine * this);34 void ?{}(coStack_t * this); 35 void ?{}(coroutine * this); 36 void ^?{}(coStack_t * this); 37 void ^?{}(coroutine * this); 38 38 39 39 //----------------------------------------------------------------------------- … … 42 42 43 43 forall(dtype T | is_coroutine(T)) 44 static inline void resume(T * cor);44 static inline void resume(T * cor); 45 45 46 46 forall(dtype T | is_coroutine(T)) 47 void prime(T * cor);47 void prime(T * cor); 48 48 49 49 //----------------------------------------------------------------------------- … … 53 53 extern "C" { 54 54 forall(dtype T | is_coroutine(T)) 55 void CtxInvokeCoroutine(T * this);55 void CtxInvokeCoroutine(T * this); 56 56 57 57 forall(dtype T | is_coroutine(T)) 58 void CtxStart(T * this, void (*invoke)(T*));58 void CtxStart(T * this, void ( *invoke)(T *)); 59 59 } 60 60 61 61 // Get current coroutine 62 extern coroutine * current_coroutine; //PRIVATE, never use directly63 static inline coroutine * this_coroutine(void) {62 extern coroutine * current_coroutine; //PRIVATE, never use directly 63 static inline coroutine * this_coroutine(void) { 64 64 return current_coroutine; 65 65 } 66 66 67 67 // Private wrappers for context switch and stack creation 68 extern void corCxtSw(coroutine * src, coroutine* dst);69 extern void create_stack( coStack_t * this, unsigned int storageSize );68 extern void corCxtSw(coroutine * src, coroutine * dst); 69 extern void create_stack( coStack_t * this, unsigned int storageSize ); 70 70 71 71 // Suspend implementation inlined for performance 72 72 static inline void suspend() { 73 coroutine * src = this_coroutine(); // optimization73 coroutine * src = this_coroutine(); // optimization 74 74 75 75 assertf( src->last != 0, … … 87 87 // Resume implementation inlined for performance 88 88 forall(dtype T | is_coroutine(T)) 89 static inline void resume(T * cor) {90 coroutine * src = this_coroutine(); // optimization91 coroutine * dst = get_coroutine(cor);89 static inline void resume(T * cor) { 90 coroutine * src = this_coroutine(); // optimization 91 coroutine * dst = get_coroutine(cor); 92 92 93 93 if( unlikely(!dst->stack.base) ) {
Note: See TracChangeset
for help on using the changeset viewer.