# HG changeset patch # User Sean Halle # Date 1351233336 25200 # Node ID a5fa1e087c7e5ce5d44fa23e55067711636dd48d # Parent dafae55597ce56490c2d3412da8d7f931835f223 Save checkpoint to come back to -- about to mangle AnimationMaster.c diff -r dafae55597ce -r a5fa1e087c7e AnimationMaster.c --- a/AnimationMaster.c Tue Oct 23 23:46:17 2012 -0700 +++ b/AnimationMaster.c Thu Oct 25 23:35:36 2012 -0700 @@ -334,7 +334,7 @@ } else //is a task, and just suspended { //turn slot slave into free task slave & make replacement - if( slave->typeOfVP == TaskSlotSlv ) changeSlvType(); + if( slave->typeOfVP == SlotTaskSlv ) changeSlvType(); //goto normal slave request handling goto SlaveReqHandling; @@ -560,7 +560,7 @@ } else //is a task, and just suspended { //turn slot slave into free task slave & make replacement - if( slave->typeOfVP == TaskSlotSlv ) changeSlvType(); + if( slave->typeOfVP == SlotTaskSlv ) changeSlvType(); //goto normal slave request handling goto SlaveReqHandling; @@ -698,7 +698,7 @@ //get end-task handler RequestHandler - taskEndHandler = slave->metaTask->reqHandler; + taskEndHandler = slave->request->handler; semanticEnv = PR_int__give_sem_env_for_slave( slave, slave->request->langMagicNumber ); (*taskEndHandler)( slave, semanticEnv ); @@ -707,20 +707,17 @@ } case TaskCreate: { PRHandle_CreateTask( slave ); - justCopied_check; RequestHandler - taskCreateHandler = slave->metaTask->reqHandler; + taskCreateHandler = slave->request->handler; semanticEnv = PR_int__give_sem_env_for_slave( slave, slave->request->langMagicNumber ); - (*taskCreateHandler)( slave, semanticEnv ); - - want_to_resume_creating_slave; + (*taskCreateHandler)( slave, semanticEnv ); //resumes creating slave goto AssignWork; } default: { //is a task, and just suspended, so tied to a free task slave //First turn slot slave into free task slave & make replacement - if( slave->typeOfVP == TaskSlotSlv ) + if( slave->typeOfVP == SlotTaskSlv ) replaceWithNewSlotSlv( slave, slave->processSlaveIsIn->processEnv ); //goto normal slave request handling @@ -786,22 +783,20 @@ *The master only calls this with a slot slave that needs to be replaced. */ inline void -replaceWithNewSlotSlv( SlaveVP *requestingSlv, PRProcessEnv *processEnv ) +replaceWithNewSlotSlv( SlaveVP *requestingSlv, PRProcess *process ) { SlaveVP *newSlotSlv; - VSsSemData *semData; - fixMe__still_VSs_stuff_in_here; //get a new slave to be the slot slave - newSlotSlv = readPrivQ( processEnv->freeTaskSlvRecycleQ ); + newSlotSlv = readPrivQ( process->freeTaskSlvRecycleQ ); if( newSlotSlv == NULL ) - { newSlotSlv = PR_int__create_slaveVP( &idle_fn, NULL, processEnv, 0); + { newSlotSlv = PR_int__create_slaveVP( &idle_fn, NULL, process, 0); //just made a new free task slave, so count it - processEnv->numLiveFreeTaskSlvs += 1; + process->numLiveFreeTaskSlvs += 1; } //set slave values to make it the slot slave newSlotSlv->metaTask = NULL; - newSlotSlv->typeOfVP = TaskSlotSlv; + newSlotSlv->typeOfVP = SlotTaskSlv; newSlotSlv->needsTaskAssigned = TRUE; //a slot slave is pinned to a particular slot on a particular core @@ -813,11 +808,12 @@ //put it into the slot slave matrix int32 slotNum = requestingSlv->animSlotAssignedTo->slotIdx; int32 coreNum = requestingSlv->coreAnimatedBy; - processEnv->slotTaskSlvs[coreNum][slotNum] = newSlotSlv; + process->slotTaskSlvs[coreNum][slotNum] = newSlotSlv; //Fix up requester, to be an extra slave now (but not an ended one) // because it's active, doesn't go into freeTaskSlvRecycleQ requestingSlv->typeOfVP = FreeTaskSlv; + check_if_need_to_change_metaTask_type_or_something; } @@ -862,10 +858,10 @@ process->coreIsDone[coreNum] = FALSE; //don't just write always switch( assignedMetaTask->taskType ) - { case GenericSlave: goto AssignSlave; - case ResumedTask: goto AssignSlave; - case NewTask: goto AssignNewTask; - case default: PR_int__throw_exception( "unknown task type ret by assigner" ); + { case GenericSlave: goto AssignSlave; + case SuspendedTask: goto AssignSlave; + case AtomicTask: goto AssignNewTask; + default: PR_int__throw_exception( "unknown task type ret by assigner" ); } } else @@ -879,7 +875,7 @@ for( envIdx = 0; envIdx < numEnvs; envIdx++ ) //keep semEnvs in hash AND array { semEnv = semEnvs[envIdx]; if( semEnv->hasWork ) - { assigner = semEnv->assigner; + { assigner = semEnv->slaveAssigner; assignedMetaTask = (*assigner)( semEnv, slot ); //have work, so reset Done flag (caused by work generated on other core) @@ -887,59 +883,20 @@ process->coreIsDone[coreNum] = FALSE; //don't just write always switch( assignedMetaTask->taskType ) - { case GenericSlave: goto AssignSlave; - case ResumedTask: goto AssignSlave; - case NewTask: goto AssignNewTask; - case default: PR_int__throw_exception( "unknown task type ret by assigner" ); + { case GenericSlave: goto AssignSlave; + case SuspendedTask: goto AssignSlave; + case AtomicTask: goto AssignNewTask; + default: PR_int__throw_exception( "unknown task type ret by assigner" ); } } } NoWork: //No work, if reach here.. - //no task, so prune the recycle pool of free task slaves - freeTaskSlv = readPrivQ( process->freeTaskSlvRecycleQ ); - if( freeTaskSlv != NULL ) - { //delete, so that bound the num extras, and deliver shutdown cond - deleteExtraneousFreeTaskSlv( freeTaskSlv, process ); - //then return NULL - returnSlv = NULL; - - goto ReturnTheSlv; + { goto ReturnTheSlv; } - else - { //candidate for shutdown.. all extras dissipated, and no tasks - // and no ready to resume slaves, so no way to generate - // more work (on this core -- other core might have work still) - if( process->numLiveFreeTaskSlvs == 0 && - process->numLiveGenericSlvs == 0 ) - { //This core sees no way to generate more tasks, so say it - if( process->coreIsDone[coreNum] == FALSE ) - { process->numCoresDone += 1; - process->coreIsDone[coreNum] = TRUE; - #ifdef DEBUG__TURN_ON_SEQUENTIAL_MODE - process->shutdownInitiated = TRUE; - - #else - if( process->numCoresDone == NUM_CORES ) - { //means no cores have work, and none can generate more - process->shutdownInitiated = TRUE; - } - #endif - } - } - //check if shutdown has been initiated by this or other core - if( process->shutdownInitiated ) - { returnSlv = PR_SS__create_shutdown_slave(); - } - else - returnSlv = NULL; - - goto ReturnTheSlv; - } //if( freeTaskSlv != NULL ) - - - AssignSlave: + + AssignSlave: //Have a metaTask attached to a slave, so get the slave out { //get slave pointed to by meta task. returnSlv = assignedMetaTask->slaveAssignedTo; @@ -1045,7 +1002,7 @@ newSlv = PR_int__create_slaveVP(); newSlv->typeOfVP = GenericSlv; newSlv->processSlaveIsIn = process; - process->numLiveGenericSlaves += 1; + process->numLiveGenericSlvs += 1; metaTask = PR_int__create_slave_meta_task(); metaTask->taskID = req->ID; metaTask->taskType = GenericSlave; @@ -1073,12 +1030,12 @@ semEnv = PR_int__give_sem_env_for( slave, slave->request->langMagicNumber ); (*slave->request->handler)( slave, semEnv ); - process->numLiveGenericSlaves -= 1; + process->numLiveGenericSlvs -= 1; PR_int__dissipate_slaveVP_multilang( slave ); //recycles and resets semDatas //check End Of Process Condition if( process->numLiveTasks == 0 && - process->numLiveGenericSlaves == 0 ) + process->numLiveGenericSlvs == 0 ) signalEndOfProcess; } @@ -1158,7 +1115,7 @@ //check End Of Process Condition if( process->numLiveTasks == 0 && - process->numLiveGenericSlaves == 0 ) + process->numLiveGenericSlvs == 0 ) signalEndOfProcessToCoreCtlr; } diff -r dafae55597ce -r a5fa1e087c7e PR.h --- a/PR.h Tue Oct 23 23:46:17 2012 -0700 +++ b/PR.h Thu Oct 25 23:35:36 2012 -0700 @@ -131,8 +131,8 @@ //AnimSlot enum VPtype - { TaskSlotSlv = 1,//Slave tied to an anim slot, only animates tasks - TaskFreeSlv, //When a suspended task ends, the slave becomes this + { SlotTaskSlv = 1,//Slave tied to an anim slot, only animates tasks + FreeTaskSlv, //When a suspended task ends, the slave becomes this GenericSlv, //the VP is explicitly seen in the app code, or task suspends Master, Shutdown, @@ -292,7 +292,7 @@ struct _PRMetaTask { PRTaskType taskType; - RequestHandler reqHandler; //Lang-specific hdlr for create, end, etc +// RequestHandler reqHandler; //Lang-specific hdlr for create, end, etc int32 *taskID; //is standard PR ID SlaveVP *slaveAssignedTo; //no valid until task animated TopLevelFn topLevelFn; //This is the Fn executes as the task @@ -337,11 +337,13 @@ PRSemEnv semEnvList[NUM_SEM_ENVS_IN_PROCESS]; //lines up the semEnvs, so can iterate through int32 numSemEnvs; //must be less than num sem envs.. used to iterate through - int32 numLiveGenericSlaves; - int32 numLiveFreeTaskSlaves; + int32 numLiveGenericSlvs; + int32 numLiveFreeTaskSlvs; int32 numLiveTasks; - bool32 coreIsDone[NUM_CORES][CACHE_LINE_SZ]; //Fixes false sharing - +// bool32 coreIsDone[NUM_CORES][CACHE_LINE_SZ]; //Fixes false sharing + + PrivQ *freeTaskSlvRecycleQ; + SlaveVP slotTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS]; void *resultToReturn; SlaveVP *seedSlv; diff -r dafae55597ce -r a5fa1e087c7e PR__SS.c --- a/PR__SS.c Tue Oct 23 23:46:17 2012 -0700 +++ b/PR__SS.c Thu Oct 25 23:35:36 2012 -0700 @@ -123,7 +123,7 @@ metaTask = PR_int__create_generic_slave_meta_task( seedData ); seedSlv->metaTask = metaTask; - process->numLiveGenericSlaves = 1; //count the seed + process->numLiveGenericSlvs = 1; //count the seed process->numLiveTasks = 0; PRServSemEnv * diff -r dafae55597ce -r a5fa1e087c7e PR__WL.c --- a/PR__WL.c Tue Oct 23 23:46:17 2012 -0700 +++ b/PR__WL.c Thu Oct 25 23:35:36 2012 -0700 @@ -98,11 +98,11 @@ PR_WL__suspend_slaveVP_and_send_req( slaveToDissipate ); } - + inline void PR_WL__send_create_task_req( TopLevelFn fn, void *initData, void *semReq, - int32 *taskID, SlaveVP *animSlv, int32 magicNumber) + int32 *taskID, RequestHandler handler, SlaveVP *animSlv, int32 magicNumber) { PRReqst req; req.reqType = TaskCreate; @@ -110,6 +110,7 @@ req.initData = initData; req.ID = taskID; req.semReq = semReq; + req.handler = handler; req.langMagicNumber = magicNumber; animSlv->request = &req; @@ -118,11 +119,13 @@ inline void -PR_WL__send_end_task_request( void *semReq, SlaveVP *animSlv, int32 magicNum ) +PR_WL__send_end_task_request( void *semReq, RequestHandler handler, + SlaveVP *animSlv, int32 magicNum ) { PRReqst req; req.reqType = TaskEnd; req.semReq = semReq; + req.handler = handler; req.langMagicNumber = magicNum; animSlv->request = &req; diff -r dafae55597ce -r a5fa1e087c7e PR__int.c --- a/PR__int.c Tue Oct 23 23:46:17 2012 -0700 +++ b/PR__int.c Thu Oct 25 23:35:36 2012 -0700 @@ -33,7 +33,7 @@ PR_int__create_slaveVP_helper( fnPtr, dataParam ); - process->numLiveGenericSlaves += 1; + process->numLiveGenericSlvs += 1; newSlv->needsTaskAssigned = TRUE; newSlv->metaTask = NULL;