changeset 266:a5fa1e087c7e Dev_ML

Save checkpoint to come back to -- about to mangle AnimationMaster.c
author Sean Halle <seanhalle@yahoo.com>
date Thu, 25 Oct 2012 23:35:36 -0700
parents dafae55597ce
children 608833ae2c5d
files AnimationMaster.c PR.h PR__SS.c PR__WL.c PR__int.c
diffstat 5 files changed, 46 insertions(+), 84 deletions(-) [+]
line diff
     1.1 --- a/AnimationMaster.c	Tue Oct 23 23:46:17 2012 -0700
     1.2 +++ b/AnimationMaster.c	Thu Oct 25 23:35:36 2012 -0700
     1.3 @@ -334,7 +334,7 @@
     1.4                }
     1.5               else  //is a task, and just suspended
     1.6                {    //turn slot slave into free task slave & make replacement
     1.7 -                if( slave->typeOfVP == TaskSlotSlv ) changeSlvType();
     1.8 +                if( slave->typeOfVP == SlotTaskSlv ) changeSlvType();
     1.9                  
    1.10                  //goto normal slave request handling
    1.11                  goto SlaveReqHandling; 
    1.12 @@ -560,7 +560,7 @@
    1.13                }
    1.14               else  //is a task, and just suspended
    1.15                {    //turn slot slave into free task slave & make replacement
    1.16 -                if( slave->typeOfVP == TaskSlotSlv ) changeSlvType();
    1.17 +                if( slave->typeOfVP == SlotTaskSlv ) changeSlvType();
    1.18                  
    1.19                  //goto normal slave request handling
    1.20                  goto SlaveReqHandling; 
    1.21 @@ -698,7 +698,7 @@
    1.22                       //get end-task handler
    1.23  
    1.24                    RequestHandler
    1.25 -                  taskEndHandler = slave->metaTask->reqHandler;
    1.26 +                  taskEndHandler = slave->request->handler;
    1.27                    semanticEnv = PR_int__give_sem_env_for_slave( slave, 
    1.28                                                slave->request->langMagicNumber );
    1.29                    (*taskEndHandler)( slave, semanticEnv );
    1.30 @@ -707,20 +707,17 @@
    1.31                  }
    1.32                 case TaskCreate:
    1.33                  { PRHandle_CreateTask( slave );
    1.34 -                  justCopied_check;
    1.35                    RequestHandler
    1.36 -                  taskCreateHandler = slave->metaTask->reqHandler;
    1.37 +                  taskCreateHandler = slave->request->handler;
    1.38                    semanticEnv = PR_int__give_sem_env_for_slave( slave, 
    1.39                                                slave->request->langMagicNumber );
    1.40 -                  (*taskCreateHandler)( slave, semanticEnv );
    1.41 -
    1.42 -                  want_to_resume_creating_slave;
    1.43 +                  (*taskCreateHandler)( slave, semanticEnv ); //resumes creating slave
    1.44                    goto AssignWork;
    1.45                  }
    1.46                 default:  
    1.47                  {    //is a task, and just suspended, so tied to a free task slave
    1.48                       //First turn slot slave into free task slave & make replacement
    1.49 -                  if( slave->typeOfVP == TaskSlotSlv )
    1.50 +                  if( slave->typeOfVP == SlotTaskSlv )
    1.51                       replaceWithNewSlotSlv( slave, slave->processSlaveIsIn->processEnv );
    1.52  
    1.53                    //goto normal slave request handling
    1.54 @@ -786,22 +783,20 @@
    1.55   *The master only calls this with a slot slave that needs to be replaced.
    1.56   */
    1.57  inline void
    1.58 -replaceWithNewSlotSlv( SlaveVP *requestingSlv, PRProcessEnv *processEnv )
    1.59 +replaceWithNewSlotSlv( SlaveVP *requestingSlv, PRProcess *process )
    1.60   { SlaveVP *newSlotSlv;
    1.61 -   VSsSemData *semData;
    1.62  
    1.63 -   fixMe__still_VSs_stuff_in_here;
    1.64        //get a new slave to be the slot slave
    1.65 -   newSlotSlv     = readPrivQ( processEnv->freeTaskSlvRecycleQ );
    1.66 +   newSlotSlv     = readPrivQ( process->freeTaskSlvRecycleQ );
    1.67     if( newSlotSlv == NULL )
    1.68 -    { newSlotSlv  = PR_int__create_slaveVP( &idle_fn, NULL, processEnv, 0);
    1.69 +    { newSlotSlv  = PR_int__create_slaveVP( &idle_fn, NULL, process, 0);
    1.70           //just made a new free task slave, so count it
    1.71 -      processEnv->numLiveFreeTaskSlvs += 1;
    1.72 +      process->numLiveFreeTaskSlvs += 1;
    1.73      }
    1.74     
    1.75        //set slave values to make it the slot slave
    1.76     newSlotSlv->metaTask              = NULL;
    1.77 -   newSlotSlv->typeOfVP              = TaskSlotSlv;
    1.78 +   newSlotSlv->typeOfVP              = SlotTaskSlv;
    1.79     newSlotSlv->needsTaskAssigned     = TRUE;
    1.80     
    1.81        //a slot slave is pinned to a particular slot on a particular core
    1.82 @@ -813,11 +808,12 @@
    1.83        //put it into the slot slave matrix
    1.84     int32 slotNum = requestingSlv->animSlotAssignedTo->slotIdx;
    1.85     int32 coreNum = requestingSlv->coreAnimatedBy;
    1.86 -   processEnv->slotTaskSlvs[coreNum][slotNum] = newSlotSlv;
    1.87 +   process->slotTaskSlvs[coreNum][slotNum] = newSlotSlv;
    1.88  
    1.89        //Fix up requester, to be an extra slave now (but not an ended one)
    1.90        // because it's active, doesn't go into freeTaskSlvRecycleQ
    1.91     requestingSlv->typeOfVP = FreeTaskSlv;
    1.92 +   check_if_need_to_change_metaTask_type_or_something;
    1.93   }
    1.94  
    1.95  
    1.96 @@ -862,10 +858,10 @@
    1.97              process->coreIsDone[coreNum] = FALSE;   //don't just write always
    1.98           
    1.99           switch( assignedMetaTask->taskType )
   1.100 -          { case GenericSlave: goto AssignSlave;
   1.101 -            case ResumedTask:  goto AssignSlave;
   1.102 -            case NewTask:      goto AssignNewTask;
   1.103 -            case default:      PR_int__throw_exception( "unknown task type ret by assigner" );
   1.104 +          { case GenericSlave:  goto AssignSlave;
   1.105 +            case SuspendedTask: goto AssignSlave;
   1.106 +            case AtomicTask:    goto AssignNewTask;
   1.107 +            default:      PR_int__throw_exception( "unknown task type ret by assigner" );
   1.108            }
   1.109         }
   1.110        else
   1.111 @@ -879,7 +875,7 @@
   1.112     for( envIdx = 0; envIdx < numEnvs; envIdx++ ) //keep semEnvs in hash AND array
   1.113      { semEnv = semEnvs[envIdx];
   1.114        if( semEnv->hasWork )
   1.115 -       { assigner = semEnv->assigner; 
   1.116 +       { assigner = semEnv->slaveAssigner; 
   1.117           assignedMetaTask = (*assigner)( semEnv, slot );
   1.118           
   1.119              //have work, so reset Done flag (caused by work generated on other core)
   1.120 @@ -887,59 +883,20 @@
   1.121              process->coreIsDone[coreNum] = FALSE;   //don't just write always
   1.122           
   1.123           switch( assignedMetaTask->taskType )
   1.124 -          { case GenericSlave: goto AssignSlave;
   1.125 -            case ResumedTask:  goto AssignSlave;
   1.126 -            case NewTask:      goto AssignNewTask;
   1.127 -            case default:      PR_int__throw_exception( "unknown task type ret by assigner" );
   1.128 +          { case GenericSlave:  goto AssignSlave;
   1.129 +            case SuspendedTask: goto AssignSlave;
   1.130 +            case AtomicTask:    goto AssignNewTask;
   1.131 +            default:      PR_int__throw_exception( "unknown task type ret by assigner" );
   1.132            }
   1.133         }
   1.134      }
   1.135     
   1.136   NoWork:
   1.137        //No work, if reach here..
   1.138 -      //no task, so prune the recycle pool of free task slaves
   1.139 -   freeTaskSlv = readPrivQ( process->freeTaskSlvRecycleQ );
   1.140 -   if( freeTaskSlv != NULL )
   1.141 -    {    //delete, so that bound the num extras, and deliver shutdown cond
   1.142 -      deleteExtraneousFreeTaskSlv( freeTaskSlv, process );
   1.143 -         //then return NULL
   1.144 -      returnSlv = NULL;
   1.145 -         
   1.146 -      goto ReturnTheSlv;
   1.147 +    { goto ReturnTheSlv;
   1.148      }
   1.149 -   else
   1.150 -    { //candidate for shutdown.. all extras dissipated, and no tasks
   1.151 -      // and no ready to resume slaves, so no way to generate
   1.152 -      // more work (on this core -- other core might have work still)
   1.153 -      if( process->numLiveFreeTaskSlvs == 0 && 
   1.154 -          process->numLiveGenericSlvs == 0 )
   1.155 -       { //This core sees no way to generate more tasks, so say it
   1.156 -         if( process->coreIsDone[coreNum] == FALSE )
   1.157 -          { process->numCoresDone += 1;
   1.158 -            process->coreIsDone[coreNum] = TRUE;
   1.159 -            #ifdef DEBUG__TURN_ON_SEQUENTIAL_MODE
   1.160 -            process->shutdownInitiated = TRUE;
   1.161 -            
   1.162 -            #else
   1.163 -            if( process->numCoresDone == NUM_CORES )
   1.164 -             { //means no cores have work, and none can generate more
   1.165 -               process->shutdownInitiated = TRUE;
   1.166 -             }
   1.167 -            #endif
   1.168 -          }
   1.169 -       }
   1.170 -         //check if shutdown has been initiated by this or other core
   1.171 -      if( process->shutdownInitiated )
   1.172 -       { returnSlv = PR_SS__create_shutdown_slave();
   1.173 -       }
   1.174 -      else
   1.175 -         returnSlv = NULL;
   1.176 -
   1.177 -      goto ReturnTheSlv;
   1.178 -    } //if( freeTaskSlv != NULL )
   1.179 -
   1.180 -
   1.181 - AssignSlave:
   1.182 + 
   1.183 + AssignSlave:     //Have a metaTask attached to a slave, so get the slave out
   1.184      {    //get slave pointed to by meta task.
   1.185        returnSlv = assignedMetaTask->slaveAssignedTo;
   1.186  
   1.187 @@ -1045,7 +1002,7 @@
   1.188     newSlv = PR_int__create_slaveVP();
   1.189     newSlv->typeOfVP = GenericSlv;
   1.190     newSlv->processSlaveIsIn = process;
   1.191 -   process->numLiveGenericSlaves += 1;
   1.192 +   process->numLiveGenericSlvs += 1;
   1.193     metaTask = PR_int__create_slave_meta_task();
   1.194     metaTask->taskID = req->ID;
   1.195     metaTask->taskType = GenericSlave;
   1.196 @@ -1073,12 +1030,12 @@
   1.197     semEnv = PR_int__give_sem_env_for( slave, slave->request->langMagicNumber );
   1.198     (*slave->request->handler)( slave, semEnv );
   1.199     
   1.200 -   process->numLiveGenericSlaves -= 1;
   1.201 +   process->numLiveGenericSlvs -= 1;
   1.202     PR_int__dissipate_slaveVP_multilang( slave ); //recycles and resets semDatas
   1.203     
   1.204        //check End Of Process Condition
   1.205     if( process->numLiveTasks == 0 &&
   1.206 -       process->numLiveGenericSlaves == 0 )
   1.207 +       process->numLiveGenericSlvs == 0 )
   1.208        signalEndOfProcess;
   1.209   }
   1.210  
   1.211 @@ -1158,7 +1115,7 @@
   1.212    
   1.213        //check End Of Process Condition
   1.214     if( process->numLiveTasks == 0 &&
   1.215 -       process->numLiveGenericSlaves == 0 )
   1.216 +       process->numLiveGenericSlvs == 0 )
   1.217        signalEndOfProcessToCoreCtlr;
   1.218   }
   1.219  
     2.1 --- a/PR.h	Tue Oct 23 23:46:17 2012 -0700
     2.2 +++ b/PR.h	Thu Oct 25 23:35:36 2012 -0700
     2.3 @@ -131,8 +131,8 @@
     2.4  //AnimSlot
     2.5  
     2.6  enum VPtype 
     2.7 - { TaskSlotSlv = 1,//Slave tied to an anim slot, only animates tasks
     2.8 -   TaskFreeSlv,   //When a suspended task ends, the slave becomes this
     2.9 + { SlotTaskSlv = 1,//Slave tied to an anim slot, only animates tasks
    2.10 +   FreeTaskSlv,   //When a suspended task ends, the slave becomes this
    2.11     GenericSlv,     //the VP is explicitly seen in the app code, or task suspends
    2.12     Master,
    2.13     Shutdown,
    2.14 @@ -292,7 +292,7 @@
    2.15  struct _PRMetaTask
    2.16   { 
    2.17     PRTaskType      taskType;
    2.18 -   RequestHandler  reqHandler;      //Lang-specific hdlr for create, end, etc
    2.19 +//   RequestHandler  reqHandler;      //Lang-specific hdlr for create, end, etc
    2.20     int32          *taskID;          //is standard PR ID
    2.21     SlaveVP        *slaveAssignedTo; //no valid until task animated
    2.22     TopLevelFn      topLevelFn;      //This is the Fn executes as the task
    2.23 @@ -337,11 +337,13 @@
    2.24     PRSemEnv semEnvList[NUM_SEM_ENVS_IN_PROCESS]; //lines up the semEnvs, so can iterate through
    2.25     int32    numSemEnvs;     //must be less than num sem envs.. used to iterate through
    2.26      
    2.27 -   int32           numLiveGenericSlaves;
    2.28 -   int32           numLiveFreeTaskSlaves;
    2.29 +   int32           numLiveGenericSlvs;
    2.30 +   int32           numLiveFreeTaskSlvs;
    2.31     int32           numLiveTasks;
    2.32 -   bool32          coreIsDone[NUM_CORES][CACHE_LINE_SZ]; //Fixes false sharing
    2.33 -   
    2.34 +//   bool32          coreIsDone[NUM_CORES][CACHE_LINE_SZ]; //Fixes false sharing
    2.35 +
    2.36 +   PrivQ          *freeTaskSlvRecycleQ;
    2.37 +   SlaveVP         slotTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS];
    2.38     void           *resultToReturn;
    2.39    
    2.40     SlaveVP        *seedSlv;   
     3.1 --- a/PR__SS.c	Tue Oct 23 23:46:17 2012 -0700
     3.2 +++ b/PR__SS.c	Thu Oct 25 23:35:36 2012 -0700
     3.3 @@ -123,7 +123,7 @@
     3.4     metaTask          = PR_int__create_generic_slave_meta_task( seedData );
     3.5     seedSlv->metaTask = metaTask;
     3.6     
     3.7 -   process->numLiveGenericSlaves = 1; //count the  seed
     3.8 +   process->numLiveGenericSlvs = 1; //count the  seed
     3.9     process->numLiveTasks = 0;
    3.10     
    3.11     PRServSemEnv *
     4.1 --- a/PR__WL.c	Tue Oct 23 23:46:17 2012 -0700
     4.2 +++ b/PR__WL.c	Thu Oct 25 23:35:36 2012 -0700
     4.3 @@ -98,11 +98,11 @@
     4.4  
     4.5     PR_WL__suspend_slaveVP_and_send_req( slaveToDissipate );
     4.6   }
     4.7 -
     4.8 + 
     4.9  inline
    4.10  void
    4.11  PR_WL__send_create_task_req( TopLevelFn fn, void *initData, void *semReq, 
    4.12 -                             int32 *taskID, SlaveVP *animSlv, int32 magicNumber)
    4.13 +     int32 *taskID, RequestHandler handler, SlaveVP *animSlv, int32 magicNumber)
    4.14   { PRReqst req;
    4.15   
    4.16     req.reqType    = TaskCreate;
    4.17 @@ -110,6 +110,7 @@
    4.18     req.initData   = initData;
    4.19     req.ID         = taskID;
    4.20     req.semReq     = semReq;
    4.21 +   req.handler    = handler;
    4.22     req.langMagicNumber = magicNumber;
    4.23     animSlv->request = &req;
    4.24     
    4.25 @@ -118,11 +119,13 @@
    4.26  
    4.27  inline
    4.28  void
    4.29 -PR_WL__send_end_task_request( void *semReq, SlaveVP *animSlv, int32 magicNum )
    4.30 +PR_WL__send_end_task_request( void *semReq, RequestHandler handler, 
    4.31 +                                              SlaveVP *animSlv, int32 magicNum )
    4.32   { PRReqst req;
    4.33   
    4.34     req.reqType    = TaskEnd;
    4.35     req.semReq     = semReq;
    4.36 +   req.handler    = handler;
    4.37     req.langMagicNumber = magicNum;
    4.38     animSlv->request = &req;
    4.39     
     5.1 --- a/PR__int.c	Tue Oct 23 23:46:17 2012 -0700
     5.2 +++ b/PR__int.c	Thu Oct 25 23:35:36 2012 -0700
     5.3 @@ -33,7 +33,7 @@
     5.4  
     5.5     PR_int__create_slaveVP_helper( fnPtr, dataParam );
     5.6             
     5.7 -   process->numLiveGenericSlaves += 1;
     5.8 +   process->numLiveGenericSlvs += 1;
     5.9  
    5.10     newSlv->needsTaskAssigned   = TRUE;
    5.11     newSlv->metaTask            = NULL;