changeset 3:b98f0f8da7d9

Made seed pr creation re-used create procr helper
author SeanHalle
date Thu, 11 Nov 2010 04:58:05 -0800
parents 2845dca6a28b
children 96420af6b7e8
files VCilk_PluginFns.c VCilk_lib.c
diffstat 2 files changed, 42 insertions(+), 43 deletions(-) [+]
line diff
     1.1 --- a/VCilk_PluginFns.c	Mon Nov 08 03:58:41 2010 -0800
     1.2 +++ b/VCilk_PluginFns.c	Thu Nov 11 04:58:05 2010 -0800
     1.3 @@ -202,65 +202,80 @@
     1.4  
     1.5  
     1.6  //============================== VMS requests ===============================
     1.7 -
     1.8 -/* 
     1.9 +/*Re-use this in the entry-point fn
    1.10   */
    1.11 -void inline
    1.12 -handleSpawn( VMSReqst *req, VirtProcr *requestingPr, VCilkSemEnv *semEnv )
    1.13 - { VCilkSemReq *semReq;
    1.14 -   VirtProcr    *newPr;
    1.15 -   VCilkSemData *semanticData;
    1.16 -
    1.17 -   semReq = VMS__take_sem_reqst_from(req);
    1.18 +inline VirtProcr *
    1.19 +VCilk__create_procr_helper( VirtProcrFnPtr fnPtr, void *initData,
    1.20 +                            VCilkSemEnv *semEnv,    int32 coreToScheduleOnto )
    1.21 + { VirtProcr    *newPr;
    1.22 +   VCilkSemData    semData;
    1.23  
    1.24        //This is running in master, so use internal version
    1.25 -   newPr = VMS__create_procr( semReq->fnPtr, semReq->initData );
    1.26 +   newPr = VMS__create_procr( fnPtr, initData );
    1.27  
    1.28 -   semanticData = VMS__malloc( sizeof(VCilkSemData) );
    1.29 +   semData = VMS__malloc( sizeof(VCilkSemData) );
    1.30  
    1.31 -   semanticData->numLiveChildren = 0;
    1.32 -   semanticData->parentPr        = NULL;
    1.33 -   semanticData->syncPending     = FALSE;
    1.34 +   semData->numLiveChildren = 0;
    1.35 +   semData->parentPr        = NULL;
    1.36 +   semData->syncPending     = FALSE;
    1.37 +   
    1.38 +   semData->highestTransEntered = -1;
    1.39 +   semData->lastTransEntered    = NULL;
    1.40  
    1.41 -   semanticData->highestTransEntered = -1;
    1.42 -   semanticData->lastTransEntered    = NULL;
    1.43 -
    1.44 -   newPr->semanticData = semanticData;
    1.45 +   newPr->semanticData = semData;
    1.46  
    1.47     /* add newly created to the list of live children of requester.
    1.48      * In newly created, add pointer to VP requesting, as the parentVP
    1.49      */
    1.50 -   ((VCilkSemData *)(requestingPr->semanticData))->numLiveChildren +=1;
    1.51 -   ((VCilkSemData *)(newPr->semanticData))->parentPr = requestingPr;
    1.52 +   ((VCilkSemData *)(newPr->semanticData))->numLiveChildren +=1;
    1.53 +   ((VCilkSemData *)(newPr->semanticData))->parentPr = newPr;
    1.54  
    1.55     semEnv->numVirtPr += 1;
    1.56  
    1.57 -      //Assign new processor to a core & transition it to ready
    1.58 +   //=================== Assign new processor to a core =====================
    1.59     #ifdef SEQUENTIAL
    1.60     newPr->coreAnimatedBy = 0;
    1.61  
    1.62     #else
    1.63 -   int32
    1.64 -   coreToSpawnOnto = semReq->coreToSpawnOnto;
    1.65  
    1.66 -   if(coreToSpawnOnto < 0 || coreToSpawnOnto >= NUM_CORES )
    1.67 +   if(coreToScheduleOnto < 0 || coreToScheduleOnto >= NUM_CORES )
    1.68      {    //out-of-range, so round-robin assignment
    1.69        newPr->coreAnimatedBy = semEnv->nextCoreToGetNewPr;
    1.70 +
    1.71        if( semEnv->nextCoreToGetNewPr >= NUM_CORES - 1 )
    1.72            semEnv->nextCoreToGetNewPr  = 0;
    1.73        else
    1.74            semEnv->nextCoreToGetNewPr += 1;
    1.75      }
    1.76     else //core num in-range, so use it
    1.77 -    { newPr->coreAnimatedBy = coreToSpawnOnto;
    1.78 +    { newPr->coreAnimatedBy = coreToScheduleOnto;
    1.79      }
    1.80     #endif
    1.81 +   //========================================================================
    1.82 +
    1.83 +   return newPr;
    1.84 + }
    1.85 +
    1.86 +
    1.87 +void inline
    1.88 +handleSpawn( VMSReqst *req, VirtProcr *requestingPr, VCilkSemEnv *semEnv )
    1.89 + { VCilkSemReq *semReq;
    1.90 +   VirtProcr    *newPr;
    1.91 +
    1.92 +   semReq = VMS__take_sem_reqst_from( req );
    1.93 +
    1.94 +   newPr = VCilk__create_procr_helper( semReq->fnPtr, semReq->initData, semEnv,
    1.95 +                                       semReq->coreToSpawnOnto );
    1.96 +
    1.97 +      //For VPThread, caller needs ptr to created processor returned to it
    1.98 +   requestingPr->dataRetFromReq = newPr;
    1.99  
   1.100     resume_procr( newPr,        semEnv );
   1.101     resume_procr( requestingPr, semEnv );
   1.102   }
   1.103  
   1.104  
   1.105 +
   1.106  /*get parentVP & remove dissipator from parent's live children.
   1.107   *If this was last live child, check "sync pending" flag
   1.108   *-- if set, then resume the parentVP.
     2.1 --- a/VCilk_lib.c	Mon Nov 08 03:58:41 2010 -0800
     2.2 +++ b/VCilk_lib.c	Thu Nov 11 04:58:05 2010 -0800
     2.3 @@ -103,24 +103,8 @@
     2.4  
     2.5        //VCilk starts with one processor, which is put into initial environ,
     2.6        // and which then calls create() to create more, thereby expanding work
     2.7 -      //Note, have to use external version of VMS__create_procr because
     2.8 -      // internal version uses VMS__malloc, which hasn't been set up by here
     2.9 -   seedPr = VMS__create_procr( fnPtr, initData );
    2.10 -   VCilkSemData *
    2.11 -   semanticData = VMS__malloc( sizeof(VCilkSemData) );
    2.12 -
    2.13 -   semanticData->numLiveChildren = 0;
    2.14 -   semanticData->parentPr        = NULL;
    2.15 -   semanticData->syncPending     = FALSE;
    2.16 -
    2.17 -   semanticData->highestTransEntered = -1;
    2.18 -   semanticData->lastTransEntered    = NULL;
    2.19 -   
    2.20 -   seedPr->semanticData = semanticData;
    2.21 -   seedPr->coreAnimatedBy = semEnv->nextCoreToGetNewPr++;
    2.22 -
    2.23 -   writePrivQ( seedPr, semEnv->readyVPQs[seedPr->coreAnimatedBy] );
    2.24 -   semEnv->numVirtPr = 1;
    2.25 +   seedPr = VCilk__create_procr_helper( fnPtr, initData, semEnv, -1 );
    2.26 +   resume_procr( seedPr );
    2.27  
    2.28     #ifdef SEQUENTIAL
    2.29     VMS__start_the_work_then_wait_until_done_Seq();  //debug sequential exe