Mercurial > cgi-bin > hgwebdir.cgi > VMS > VMS_Implementations > VSs_impls > VSs__MC_shared_impl
changeset 13:2bf83f932705 dev_expl_VP_and_DKU
fix: mix-up between 2 redundant types of carriers
author | Nina Engelhardt <nengel@mailbox.tu-berlin.de> |
---|---|
date | Tue, 21 Aug 2012 17:42:07 +0200 |
parents | f56e3beac86b |
children | b2bc97318262 |
files | VSs.c VSs.h VSs_PluginFns.c VSs_Request_Handlers.c |
diffstat | 4 files changed, 18 insertions(+), 23 deletions(-) [+] |
line diff
1.1 --- a/VSs.c Mon Aug 20 13:42:19 2012 +0200 1.2 +++ b/VSs.c Tue Aug 21 17:42:07 2012 +0200 1.3 @@ -102,6 +102,7 @@ 1.4 //seedVP is a thread, so has a permanent task 1.5 semData->needsTaskAssigned = FALSE; 1.6 semData->taskStub = threadTaskStub; 1.7 + semData->slaveType = ThreadSlv; 1.8 1.9 resume_slaveVP( seedSlv, semEnv ); //returns right away, just queues Slv 1.10
2.1 --- a/VSs.h Mon Aug 20 13:42:19 2012 +0200 2.2 +++ b/VSs.h Tue Aug 21 17:42:07 2012 +0200 2.3 @@ -92,13 +92,6 @@ 2.4 VSsTaskStubCarrier; 2.5 2.6 2.7 -typedef struct 2.8 - { 2.9 - int32 type; 2.10 - VSsTaskStub *taskStub; 2.11 - } 2.12 -VSsWaiterCarrier; 2.13 - 2.14 /*Semantic layer-specific data sent inside a request from lib called in app 2.15 * to request handler called in AnimationMaster 2.16 */
3.1 --- a/VSs_PluginFns.c Mon Aug 20 13:42:19 2012 +0200 3.2 +++ b/VSs_PluginFns.c Tue Aug 21 17:42:07 2012 +0200 3.3 @@ -61,7 +61,14 @@ 3.4 slotNum = slot->slotIdx; 3.5 3.6 semEnv = (VSsSemEnv *)_semEnv; 3.7 - 3.8 + 3.9 + returnSlv = readPrivQ( semEnv->slavesReadyToResumeQ ); 3.10 + if( returnSlv != NULL ) //Yes, have a slave, so return it. 3.11 + { returnSlv->coreAnimatedBy = coreNum; 3.12 + if( semEnv->coreIsDone[coreNum] == TRUE ) //reads are higher perf 3.13 + semEnv->coreIsDone[coreNum] = FALSE; //don't just write always 3.14 + goto ReturnTheSlv; 3.15 + } 3.16 //Speculatively set the return slave to the slot taskSlave 3.17 //TODO: false sharing ? Always read.. 3.18 returnSlv = semEnv->slotTaskSlvs[coreNum][slotNum]; 3.19 @@ -84,13 +91,7 @@ 3.20 } 3.21 else 3.22 { //no task, so try to get a ready to resume slave 3.23 - returnSlv = readPrivQ( semEnv->slavesReadyToResumeQ ); 3.24 - if( returnSlv != NULL ) //Yes, have a slave, so return it. 3.25 - { returnSlv->coreAnimatedBy = coreNum; 3.26 - if( semEnv->coreIsDone[coreNum] == TRUE ) //reads are higher perf 3.27 - semEnv->coreIsDone[coreNum] = FALSE; //don't just write always 3.28 - goto ReturnTheSlv; 3.29 - } 3.30 + 3.31 //If get here, then no task, so check if have extra free slaves 3.32 extraSlv = readPrivQ( semEnv->freeExtraTaskSlvQ ); 3.33 if( extraSlv != NULL ) 3.34 @@ -458,8 +459,7 @@ 3.35 3.36 //For VSs, caller needs ptr to created thread returned to it 3.37 requestingSlv->dataRetFromReq = newSlv; 3.38 - 3.39 - resume_slaveVP( requestingSlv, semEnv ); 3.40 + resume_slaveVP(requestingSlv , semEnv ); 3.41 resume_slaveVP( newSlv, semEnv ); 3.42 } 3.43
4.1 --- a/VSs_Request_Handlers.c Mon Aug 20 13:42:19 2012 +0200 4.2 +++ b/VSs_Request_Handlers.c Tue Aug 21 17:42:07 2012 +0200 4.3 @@ -95,6 +95,7 @@ 4.4 newStub->args = newArgs; 4.5 newStub->numLiveChildTasks = 0; 4.6 newStub->numLiveChildThreads = 0; 4.7 + newStub->isEnded = FALSE; 4.8 4.9 //Copy the arg-pointers.. can be more arguments than just the ones 4.10 // that StarSs uses to control ordering of task execution. 4.11 @@ -371,7 +372,7 @@ 4.12 VSsSemData *endingSlvSemData; 4.13 VSsTaskStub *endingTaskStub, *waitingTaskStub, *parent; 4.14 VSsTaskType *endingTaskType; 4.15 - VSsWaiterCarrier *waitingTaskCarrier; 4.16 + VSsTaskStubCarrier *waitingTaskCarrier; 4.17 VSsPointerEntry **ptrEntries; 4.18 4.19 DEBUG__printf1(dbgRqstHdlr,"EndTask request from processor %d",semReq->callingSlv->slaveID) 4.20 @@ -435,7 +436,7 @@ 4.21 { //TODO: looks safe to delete the ptr entry at this point 4.22 continue; //next iter of loop 4.23 } 4.24 - if( waitingTaskCarrier->type == READER ) 4.25 + if( waitingTaskCarrier->isReader ) 4.26 VMS_App__throw_exception("READER waiting", NULL, NULL); 4.27 4.28 waitingTaskStub = waitingTaskCarrier->taskStub; 4.29 @@ -465,7 +466,7 @@ 4.30 waitingTaskStub = waitingTaskCarrier->taskStub; 4.31 4.32 /*If task is a writer of this hash-entry's pointer*/ 4.33 - if( waitingTaskCarrier->type == WRITER ) 4.34 + if( !waitingTaskCarrier->isReader ) 4.35 { /* then turn the flag back on.*/ 4.36 ptrEntry->hasEnabledNonFinishedWriter = TRUE; 4.37 /*Decrement the writer's blocking-propendent-count in task-stub 4.38 @@ -493,7 +494,7 @@ 4.39 /*Get next waiting task*/ 4.40 waitingTaskCarrier = peekPrivQ( ptrEntry->waitersQ ); 4.41 if( waitingTaskCarrier == NULL ) break; 4.42 - if( waitingTaskCarrier->type == WRITER ) break; 4.43 + if( !waitingTaskCarrier->isReader ) break; 4.44 waitingTaskCarrier = readPrivQ( ptrEntry->waitersQ ); 4.45 waitingTaskStub = waitingTaskCarrier->taskStub; 4.46 }//while waiter is a reader 4.47 @@ -830,7 +831,7 @@ 4.48 HashEntry *entry; 4.49 HashTable *commHashTbl = semEnv->commHashTbl; 4.50 4.51 - DEBUG__printf2(dbgRqstHdlr,"SendFromTo request from %d to %d",semReq->senderID[1],semReq->receiverID[1]) 4.52 + DEBUG__printf2(dbgRqstHdlr,"ReceiveFromTo request from %d to %d",semReq->senderID[1],semReq->receiverID[1]) 4.53 4.54 receiverID = semReq->receiverID; //For "send", know both send & recv procrs 4.55 senderID = semReq->senderID; 4.56 @@ -938,7 +939,7 @@ 4.57 } 4.58 else //have to wait, replace requester with new slot slv & mark waiting 4.59 { 4.60 - if(semData->slaveType == SlotTaskSlv || semData->slaveType == ExtraTaskSlv){ 4.61 + if(semData->slaveType == SlotTaskSlv){ 4.62 replaceWithNewSlotSlv( requestingSlv, semEnv ); 4.63 } 4.64