Mercurial > cgi-bin > hgwebdir.cgi > VMS > VMS_Implementations > SSR_impls > SSR__MC_shared_impl
changeset 18:cee3eecc5c22
Fixed transaction bug -- didn't init with semantic data
author | Me |
---|---|
date | Mon, 08 Nov 2010 04:02:50 -0800 |
parents | bf57b83019e5 |
children | b549ad140f18 |
files | SSR.h SSR_PluginFns.c SSR_Request_Handlers.c SSR_lib.c |
diffstat | 4 files changed, 39 insertions(+), 23 deletions(-) [+] |
line diff
1.1 --- a/SSR.h Tue Nov 02 16:57:45 2010 -0700 1.2 +++ b/SSR.h Mon Nov 08 04:02:50 2010 -0800 1.3 @@ -99,7 +99,8 @@ 1.4 int32 transID; 1.5 TransListElem *nextTrans; 1.6 }; 1.7 - 1.8 +//TransListElem 1.9 + 1.10 typedef struct 1.11 { 1.12 int32 highestTransEntered;
2.1 --- a/SSR_PluginFns.c Tue Nov 02 16:57:45 2010 -0700 2.2 +++ b/SSR_PluginFns.c Mon Nov 08 04:02:50 2010 -0800 2.3 @@ -133,6 +133,7 @@ 2.4 handleDissipate( VirtProcr *requestingPr, SSRSemEnv *semEnv ) 2.5 { 2.6 //free any semantic data allocated to the virt procr 2.7 + VMS__free( requestingPr->semanticData ); 2.8 2.9 //Now, call VMS to free_all AppVP state -- stack and so on 2.10 VMS__dissipate_procr( requestingPr ); 2.11 @@ -144,25 +145,28 @@ 2.12 } 2.13 } 2.14 2.15 -void 2.16 -handleCreate( VMSReqst *req, VirtProcr *requestingPr, SSRSemEnv *semEnv ) 2.17 - { SSRSemReq *semReq; 2.18 - VirtProcr *newPr; 2.19 - 2.20 - semReq = VMS__take_sem_reqst_from( req ); 2.21 +/*Re-use this in the entry-point fn 2.22 + */ 2.23 +inline VirtProcr * 2.24 +SSR__create_procr_helper( VirtProcrFnPtr fnPtr, void *initData, 2.25 + SSRSemEnv *semEnv, int32 coreToScheduleOnto ) 2.26 + { VirtProcr *newPr; 2.27 + SSRSemData semData; 2.28 2.29 //This is running in master, so use internal version 2.30 - newPr = VMS__create_procr( semReq->fnPtr, semReq->initData ); 2.31 + newPr = VMS__create_procr( fnPtr, initData ); 2.32 2.33 semEnv->numVirtPr += 1; 2.34 2.35 - //Assign new processor to a core & transition it to ready 2.36 + semData = VMS__malloc( sizeof(SSRSemData) ); 2.37 + semData->highestTransEntered = -1; 2.38 + semData->lastTransEntered = NULL; 2.39 + 2.40 + //=================== Assign new processor to a core ===================== 2.41 #ifdef SEQUENTIAL 2.42 newPr->coreAnimatedBy = 0; 2.43 2.44 #else 2.45 - int32 2.46 - coreToScheduleOnto = semReq->coreToScheduleOnto; 2.47 2.48 if(coreToScheduleOnto < 0 || coreToScheduleOnto >= NUM_CORES ) 2.49 { //out-of-range, so round-robin assignment 2.50 @@ -177,7 +181,21 @@ 2.51 { newPr->coreAnimatedBy = coreToScheduleOnto; 2.52 } 2.53 #endif 2.54 + //======================================================================== 2.55 + 2.56 + return newPr; 2.57 + } 2.58 2.59 +void 2.60 +handleCreate( VMSReqst *req, VirtProcr *requestingPr, SSRSemEnv *semEnv ) 2.61 + { SSRSemReq *semReq; 2.62 + VirtProcr *newPr; 2.63 + 2.64 + semReq = VMS__take_sem_reqst_from( req ); 2.65 + 2.66 + newPr = SSR__create_procr_helper( semReq->fnPtr, semReq->initData, semEnv, 2.67 + semReq->coreToScheduleOnto ); 2.68 + 2.69 //For SSR, caller needs ptr to created processor returned to it 2.70 requestingPr->dataRetFromReq = newPr; 2.71
3.1 --- a/SSR_Request_Handlers.c Tue Nov 02 16:57:45 2010 -0700 3.2 +++ b/SSR_Request_Handlers.c Mon Nov 08 04:02:50 2010 -0800 3.3 @@ -118,7 +118,8 @@ 3.4 SSRSemReq *clonedReq = cloneReq( semReq ); 3.5 clonedReq-> nextReqInHashEntry = waitingReq->nextReqInHashEntry; 3.6 waitingReq->nextReqInHashEntry = clonedReq; 3.7 - PRINT2_DEBUG("linked requests: %d, %d | ", clonedReq, waitingReq ) 3.8 + DEBUG2( dbgRqstHdlr, "linked requests: %d, %d | ", clonedReq,\ 3.9 + waitingReq ) 3.10 return; 3.11 } 3.12 else 3.13 @@ -265,7 +266,7 @@ 3.14 } 3.15 3.16 //attach msg that's in the send request to receiving procr 3.17 - // when comes back from suspend, will have msg in dataReturnedFromReq 3.18 + // when comes back from suspend, will have msg in dataRetFromReq 3.19 receivePr->dataRetFromReq = waitingReq->msg; 3.20 3.21 //bring both processors back from suspend
4.1 --- a/SSR_lib.c Tue Nov 02 16:57:45 2010 -0700 4.2 +++ b/SSR_lib.c Mon Nov 08 04:02:50 2010 -0800 4.3 @@ -103,13 +103,11 @@ 4.4 4.5 //SSR starts with one processor, which is put into initial environ, 4.6 // and which then calls create() to create more, thereby expanding work 4.7 - seedPr = VMS__create_procr( fnPtr, initData ); 4.8 + seedPr = SSR__create_procr_helper( fnPtr, initData, 4.9 + semEnv, semEnv->nextCoreToGetNewPr++ ); 4.10 4.11 - seedPr->coreAnimatedBy = semEnv->nextCoreToGetNewPr++; 4.12 - 4.13 - writePrivQ( seedPr, semEnv->readyVPQs[seedPr->coreAnimatedBy] ); 4.14 - semEnv->numVirtPr = 1; 4.15 - 4.16 + resumePr( seedPr, semEnv ); 4.17 + 4.18 #ifdef SEQUENTIAL 4.19 VMS__start_the_work_then_wait_until_done_Seq(); //debug sequential exe 4.20 #else 4.21 @@ -221,6 +219,7 @@ 4.22 semanticEnv->readyVPQs = readyVPQs; 4.23 4.24 semanticEnv->nextCoreToGetNewPr = 0; 4.25 + semanticEnv->numVirtPr = 0; 4.26 4.27 semanticEnv->commHashTbl = makeHashTable( 1<<16, &VMS__free );//start big 4.28 4.29 @@ -232,9 +231,6 @@ 4.30 semanticEnv->singletonHasBeenExecutedFlags[i] = FALSE; 4.31 semanticEnv->transactionStrucs[i].waitingVPQ = makePrivQ(); 4.32 } 4.33 - 4.34 - 4.35 - 4.36 } 4.37 4.38 4.39 @@ -568,4 +564,4 @@ 4.40 reqData.transID = transactionID; 4.41 4.42 VMS__send_sem_request( &reqData, animPr ); 4.43 - } 4.44 \ No newline at end of file 4.45 + }