Changes in src/libcfa/concurrency/kernel.c [77e6fcb:e15df4c]
- File:
-
- 1 edited
-
src/libcfa/concurrency/kernel.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/kernel.c
r77e6fcb re15df4c 15 15 // 16 16 17 //Start and stop routine for the kernel, declared first to make sure they run first18 void kernel_startup(void) __attribute__((constructor(101)));19 void kernel_shutdown(void) __attribute__((destructor(101)));20 21 17 //Header 22 18 #include "kernel" … … 43 39 }; 44 40 45 DECL_COROUTINE(processorCtx_t) ;41 DECL_COROUTINE(processorCtx_t) 46 42 47 43 #define KERNEL_STORAGE(T,X) static char X##_storage[sizeof(T)] … … 56 52 processor * systemProcessor; 57 53 thread * mainThread; 54 55 void kernel_startup(void) __attribute__((constructor(101))); 56 void kernel_shutdown(void) __attribute__((destructor(101))); 58 57 59 58 //----------------------------------------------------------------------------- … … 185 184 void main(processorCtx_t * ctx); 186 185 thread * nextThread(cluster * this); 187 void scheduleInternal(processor * this, thread * dst);186 void runThread(processor * this, thread * dst); 188 187 void spin(processor * this, unsigned int * spin_count); 189 188 … … 198 197 199 198 if(readyThread) { 200 scheduleInternal(this, readyThread);199 runThread(this, readyThread); 201 200 spin_count = 0; 202 201 } else { … … 210 209 } 211 210 212 //Declarations for scheduleInternal 213 extern void ThreadCtxSwitch(coroutine * src, coroutine * dst); 214 215 // scheduleInternal runs a thread by context switching 216 // from the processor coroutine to the target thread 217 void scheduleInternal(processor * this, thread * dst) { 218 // coroutine * proc_ctx = get_coroutine(this->ctx); 219 // coroutine * thrd_ctx = get_coroutine(dst); 220 221 // //Update global state 222 // this->current_thread = dst; 223 224 // // Context Switch to the thread 225 // ThreadCtxSwitch(proc_ctx, thrd_ctx); 226 // // when ThreadCtxSwitch returns we are back in the processor coroutine 227 211 void runThread(processor * this, thread * dst) { 228 212 coroutine * proc_ctx = get_coroutine(this->ctx); 229 213 coroutine * thrd_ctx = get_coroutine(dst); 230 thrd_ctx->last = proc_ctx; 231 232 // context switch to specified coroutine 233 // Which is now the current_coroutine 234 LIB_DEBUG_PRINTF("Kernel : switching to ctx %p (from %p, current %p)\n", thrd_ctx, proc_ctx, this->current_coroutine); 235 this->current_thread = dst; 236 this->current_coroutine = thrd_ctx; 237 CtxSwitch( proc_ctx->stack.context, thrd_ctx->stack.context ); 238 this->current_coroutine = proc_ctx; 239 LIB_DEBUG_PRINTF("Kernel : returned from ctx %p (to %p, current %p)\n", thrd_ctx, proc_ctx, this->current_coroutine); 240 241 // when CtxSwitch returns we are back in the processor coroutine 242 } 243 244 // Handles spinning logic 245 // TODO : find some strategy to put cores to sleep after some time 214 thrd_ctx->last = proc_ctx; 215 216 // context switch to specified coroutine 217 // Which is now the current_coroutine 218 // LIB_DEBUG_PRINTF("Kernel : switching to ctx %p (from %p, current %p)\n", thrd_ctx, proc_ctx, current_coroutine); 219 this->current_thread = dst; 220 this->current_coroutine = thrd_ctx; 221 CtxSwitch( proc_ctx->stack.context, thrd_ctx->stack.context ); 222 this->current_coroutine = proc_ctx; 223 // LIB_DEBUG_PRINTF("Kernel : returned from ctx %p (to %p, current %p)\n", thrd_ctx, proc_ctx, current_coroutine); 224 225 // when CtxSwitch returns we are back in the processor coroutine 226 } 227 246 228 void spin(processor * this, unsigned int * spin_count) { 247 229 (*spin_count)++; 248 230 } 249 231 250 // Context invoker for processors251 // This is the entry point for processors (kernel threads)252 // It effectively constructs a coroutine by stealing the pthread stack253 232 void * CtxInvokeProcessor(void * arg) { 254 233 processor * proc = (processor *) arg; … … 262 241 processorCtx_t proc_cor_storage = { proc, &info }; 263 242 264 //Set global state265 243 proc->current_coroutine = &proc->ctx->c; 266 244 proc->current_thread = NULL; 267 245 246 LIB_DEBUG_PRINTF("Kernel : core %p created (%p)\n", proc, proc->ctx); 247 248 // LIB_DEBUG_PRINTF("Kernel : core base : %p \n", info.base ); 249 // LIB_DEBUG_PRINTF("Kernel : core storage : %p \n", info.storage ); 250 // LIB_DEBUG_PRINTF("Kernel : core size : %x \n", info.size ); 251 // LIB_DEBUG_PRINTF("Kernel : core limit : %p \n", info.limit ); 252 // LIB_DEBUG_PRINTF("Kernel : core context : %p \n", info.context ); 253 // LIB_DEBUG_PRINTF("Kernel : core top : %p \n", info.top ); 254 268 255 //We now have a proper context from which to schedule threads 269 LIB_DEBUG_PRINTF("Kernel : core %p created (%p)\n", proc, proc->ctx);270 256 271 257 // SKULLDUGGERY: Since the coroutine doesn't have its own stack, we can't … … 278 264 proc_cor_storage.c.notHalted = false; 279 265 280 // Main routine of the core returned, the core is now fully terminated281 266 LIB_DEBUG_PRINTF("Kernel : core %p main ended (%p)\n", proc, proc->ctx); 282 267
Note:
See TracChangeset
for help on using the changeset viewer.