Mercurial > cgi-bin > hgwebdir.cgi > VMS > VMS_Implementations > VCilk_impls > VCilk__MC_shared_impl
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