- File:
-
- 1 edited
-
libcfa/src/concurrency/coroutine.hfa (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/coroutine.hfa
r73abe95 r212c2187 46 46 //----------------------------------------------------------------------------- 47 47 // Public coroutine API 48 static inline void suspend( );48 static inline void suspend(void); 49 49 50 50 forall(dtype T | is_coroutine(T)) … … 71 71 72 72 // Suspend implementation inlined for performance 73 static inline void suspend( ) {73 static inline void suspend(void) { 74 74 // optimization : read TLS once and reuse it 75 75 // Safety note: this is preemption safe since if … … 77 77 // will also migrate which means this value will 78 78 // stay in syn with the TLS 79 coroutine_desc * src = TL_GET( this_ coroutine );79 coroutine_desc * src = TL_GET( this_thread )->curr_cor; 80 80 81 81 assertf( src->last != 0, … … 99 99 // will also migrate which means this value will 100 100 // stay in syn with the TLS 101 coroutine_desc * src = TL_GET( this_ coroutine );101 coroutine_desc * src = TL_GET( this_thread )->curr_cor; 102 102 coroutine_desc * dst = get_coroutine(cor); 103 103 … … 129 129 // will also migrate which means this value will 130 130 // stay in syn with the TLS 131 coroutine_desc * src = TL_GET( this_ coroutine );131 coroutine_desc * src = TL_GET( this_thread )->curr_cor; 132 132 133 133 // not resuming self ? … … 146 146 } 147 147 148 149 150 // static inline bool suspend_checkpoint(void) { 151 // // optimization : read TLS once and reuse it 152 // // Safety note: this is preemption safe since if 153 // // preemption occurs after this line, the pointer 154 // // will also migrate which means this value will 155 // // stay in syn with the TLS 156 // // set state of current coroutine to inactive 157 // this->state = Checkpoint; 158 159 // // context switch to specified coroutine 160 // assert( src->stack.context ); 161 162 // CtxStore(src->stack.context); 163 164 // bool ret = this->state == Checkpoint; 165 166 // // set state of new coroutine to active 167 // src->state = Active; 168 169 // enable_interrupts( __cfaabi_dbg_ctx ); 170 // // Safety note : This could cause some false positives due to preemption 171 // verify( TL_GET( preemption_state.enabled ) || TL_GET( this_processor )->do_terminate ); 172 173 // if( unlikely(src->cancellation != NULL) ) { 174 // _CtxCoroutine_Unwind(src->cancellation); 175 // } 176 177 // return ret; 178 // } 179 180 // static inline void suspend_return(void) { 181 // // optimization : read TLS once and reuse it 182 // // Safety note: this is preemption safe since if 183 // // preemption occurs after this line, the pointer 184 // // will also migrate which means this value will 185 // // stay in syn with the TLS 186 // coroutine_desc * src = TL_GET( this_thread )->curr_cor; 187 188 // assertf( src->last != 0, 189 // "Attempt to suspend coroutine \"%.256s\" (%p) that has never been resumed.\n" 190 // "Possible cause is a suspend executed in a member called by a coroutine user rather than by the coroutine main.", 191 // src->name, src ); 192 // assertf( src->last->state != Halted, 193 // "Attempt by coroutine \"%.256s\" (%p) to suspend back to terminated coroutine \"%.256s\" (%p).\n" 194 // "Possible cause is terminated coroutine's main routine has already returned.", 195 // src->name, src, src->last->name, src->last ); 196 197 // // Safety note : Preemption must be disabled here since kernelTLS.this_coroutine must always be up to date 198 // verify( TL_GET( preemption_state.enabled ) || TL_GET( this_processor )->do_terminate ); 199 // disable_interrupts(); 200 201 // // set state of current coroutine to inactive 202 // src->state = src->state == Halted ? Halted : Inactive; 203 204 // // set new coroutine that task is executing 205 // kernelTLS.this_coroutine = dst; 206 207 // // context switch to specified coroutine 208 // assert( src->stack.context ); 209 // CtxRet( src->stack.context ); 210 211 // abort(); 212 // } 213 148 214 // Local Variables: // 149 215 // mode: c //
Note:
See TracChangeset
for help on using the changeset viewer.