/// Worker Worker routine. /// This is the routine every worker thread runs. /// The worker thread continuously asks for Tasks and executes them. /// /// Note that worker threads are NOT guarenteed to ever call Worker.exit() /// before the program ends. void workerLoop ( Worker * me, void* args ) { task_worker_args* wargs = (task_worker_args*) args; TaskManager* tasks = wargs->tasks; TaskingScheduler * sched = wargs->scheduler; sched->onWorkerStart(); StateTimer::setThreadState( StateTimer::FINDWORK ); StateTimer::enterState_findwork(); Task nextTask; while ( true ) { // block until receive work or termination reached if (!tasks->getWork(&nextTask)) break; // quitting time sched->num_active_tasks++; StateTimer::setThreadState( StateTimer::USER ); StateTimer::enterState_user(); { GRAPPA_PROFILE( exectimer, "user_execution", "", GRAPPA_USER_GROUP ); nextTask.execute(); } StateTimer::setThreadState( StateTimer::FINDWORK ); sched->num_active_tasks--; sched->thread_yield( ); // yield to the scheduler } }