diff AnimationMaster.c @ 266:a5fa1e087c7e

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
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