- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/kernel.c
r09800e9 ra1a17a74 49 49 thread_desc * mainThread; 50 50 51 struct { __dllist_t(cluster ) list; __spinlock_t lock; } global_clusters;51 struct { __dllist_t(cluster ) list; __spinlock_t lock; } global_clusters; 52 52 53 53 //----------------------------------------------------------------------------- … … 257 257 // its final actions must be executed from the kernel 258 258 void finishRunning(processor * this) with( this->finish ) { 259 verify( ! kernelTLS.preemption_state.enabled ); 260 choose( action_code ) { 261 case No_Action: 262 break; 263 case Release: 259 if( action_code == Release ) { 260 verify( ! kernelTLS.preemption_state.enabled ); 264 261 unlock( *lock ); 265 case Schedule: 262 } 263 else if( action_code == Schedule ) { 266 264 ScheduleThread( thrd ); 267 case Release_Schedule: 265 } 266 else if( action_code == Release_Schedule ) { 267 verify( ! kernelTLS.preemption_state.enabled ); 268 268 unlock( *lock ); 269 269 ScheduleThread( thrd ); 270 case Release_Multi: 270 } 271 else if( action_code == Release_Multi ) { 272 verify( ! kernelTLS.preemption_state.enabled ); 271 273 for(int i = 0; i < lock_count; i++) { 272 274 unlock( *locks[i] ); 273 275 } 274 case Release_Multi_Schedule: 276 } 277 else if( action_code == Release_Multi_Schedule ) { 275 278 for(int i = 0; i < lock_count; i++) { 276 279 unlock( *locks[i] ); … … 279 282 ScheduleThread( thrds[i] ); 280 283 } 281 case Callback: 282 callback(); 283 default: 284 abort("KERNEL ERROR: Unexpected action to run after thread"); 284 } 285 else { 286 assert(action_code == No_Action); 285 287 } 286 288 } … … 495 497 } 496 498 497 void BlockInternal(__finish_callback_fptr_t callback) {498 disable_interrupts();499 with( *kernelTLS.this_processor ) {500 finish.action_code = Callback;501 finish.callback = callback;502 }503 504 verify( ! kernelTLS.preemption_state.enabled );505 returnToKernel();506 verify( ! kernelTLS.preemption_state.enabled );507 508 enable_interrupts( __cfaabi_dbg_ctx );509 }510 511 499 // KERNEL ONLY 512 500 void LeaveThread(__spinlock_t * lock, thread_desc * thrd) {
Note:
See TracChangeset
for help on using the changeset viewer.