# HG changeset patch # User Nina Engelhardt # Date 1345563727 -7200 # Node ID 2bf83f932705354366c6496ca8733d2df31b45dc # Parent f56e3beac86bf2fd0241e1d74ff8ae1842fa5d39 fix: mix-up between 2 redundant types of carriers diff -r f56e3beac86b -r 2bf83f932705 VSs.c --- a/VSs.c Mon Aug 20 13:42:19 2012 +0200 +++ b/VSs.c Tue Aug 21 17:42:07 2012 +0200 @@ -102,6 +102,7 @@ //seedVP is a thread, so has a permanent task semData->needsTaskAssigned = FALSE; semData->taskStub = threadTaskStub; + semData->slaveType = ThreadSlv; resume_slaveVP( seedSlv, semEnv ); //returns right away, just queues Slv diff -r f56e3beac86b -r 2bf83f932705 VSs.h --- a/VSs.h Mon Aug 20 13:42:19 2012 +0200 +++ b/VSs.h Tue Aug 21 17:42:07 2012 +0200 @@ -92,13 +92,6 @@ VSsTaskStubCarrier; -typedef struct - { - int32 type; - VSsTaskStub *taskStub; - } -VSsWaiterCarrier; - /*Semantic layer-specific data sent inside a request from lib called in app * to request handler called in AnimationMaster */ diff -r f56e3beac86b -r 2bf83f932705 VSs_PluginFns.c --- a/VSs_PluginFns.c Mon Aug 20 13:42:19 2012 +0200 +++ b/VSs_PluginFns.c Tue Aug 21 17:42:07 2012 +0200 @@ -61,7 +61,14 @@ slotNum = slot->slotIdx; semEnv = (VSsSemEnv *)_semEnv; - + + returnSlv = readPrivQ( semEnv->slavesReadyToResumeQ ); + if( returnSlv != NULL ) //Yes, have a slave, so return it. + { returnSlv->coreAnimatedBy = coreNum; + if( semEnv->coreIsDone[coreNum] == TRUE ) //reads are higher perf + semEnv->coreIsDone[coreNum] = FALSE; //don't just write always + goto ReturnTheSlv; + } //Speculatively set the return slave to the slot taskSlave //TODO: false sharing ? Always read.. returnSlv = semEnv->slotTaskSlvs[coreNum][slotNum]; @@ -84,13 +91,7 @@ } else { //no task, so try to get a ready to resume slave - returnSlv = readPrivQ( semEnv->slavesReadyToResumeQ ); - if( returnSlv != NULL ) //Yes, have a slave, so return it. - { returnSlv->coreAnimatedBy = coreNum; - if( semEnv->coreIsDone[coreNum] == TRUE ) //reads are higher perf - semEnv->coreIsDone[coreNum] = FALSE; //don't just write always - goto ReturnTheSlv; - } + //If get here, then no task, so check if have extra free slaves extraSlv = readPrivQ( semEnv->freeExtraTaskSlvQ ); if( extraSlv != NULL ) @@ -458,8 +459,7 @@ //For VSs, caller needs ptr to created thread returned to it requestingSlv->dataRetFromReq = newSlv; - - resume_slaveVP( requestingSlv, semEnv ); + resume_slaveVP(requestingSlv , semEnv ); resume_slaveVP( newSlv, semEnv ); } diff -r f56e3beac86b -r 2bf83f932705 VSs_Request_Handlers.c --- a/VSs_Request_Handlers.c Mon Aug 20 13:42:19 2012 +0200 +++ b/VSs_Request_Handlers.c Tue Aug 21 17:42:07 2012 +0200 @@ -95,6 +95,7 @@ newStub->args = newArgs; newStub->numLiveChildTasks = 0; newStub->numLiveChildThreads = 0; + newStub->isEnded = FALSE; //Copy the arg-pointers.. can be more arguments than just the ones // that StarSs uses to control ordering of task execution. @@ -371,7 +372,7 @@ VSsSemData *endingSlvSemData; VSsTaskStub *endingTaskStub, *waitingTaskStub, *parent; VSsTaskType *endingTaskType; - VSsWaiterCarrier *waitingTaskCarrier; + VSsTaskStubCarrier *waitingTaskCarrier; VSsPointerEntry **ptrEntries; DEBUG__printf1(dbgRqstHdlr,"EndTask request from processor %d",semReq->callingSlv->slaveID) @@ -435,7 +436,7 @@ { //TODO: looks safe to delete the ptr entry at this point continue; //next iter of loop } - if( waitingTaskCarrier->type == READER ) + if( waitingTaskCarrier->isReader ) VMS_App__throw_exception("READER waiting", NULL, NULL); waitingTaskStub = waitingTaskCarrier->taskStub; @@ -465,7 +466,7 @@ waitingTaskStub = waitingTaskCarrier->taskStub; /*If task is a writer of this hash-entry's pointer*/ - if( waitingTaskCarrier->type == WRITER ) + if( !waitingTaskCarrier->isReader ) { /* then turn the flag back on.*/ ptrEntry->hasEnabledNonFinishedWriter = TRUE; /*Decrement the writer's blocking-propendent-count in task-stub @@ -493,7 +494,7 @@ /*Get next waiting task*/ waitingTaskCarrier = peekPrivQ( ptrEntry->waitersQ ); if( waitingTaskCarrier == NULL ) break; - if( waitingTaskCarrier->type == WRITER ) break; + if( !waitingTaskCarrier->isReader ) break; waitingTaskCarrier = readPrivQ( ptrEntry->waitersQ ); waitingTaskStub = waitingTaskCarrier->taskStub; }//while waiter is a reader @@ -830,7 +831,7 @@ HashEntry *entry; HashTable *commHashTbl = semEnv->commHashTbl; - DEBUG__printf2(dbgRqstHdlr,"SendFromTo request from %d to %d",semReq->senderID[1],semReq->receiverID[1]) + DEBUG__printf2(dbgRqstHdlr,"ReceiveFromTo request from %d to %d",semReq->senderID[1],semReq->receiverID[1]) receiverID = semReq->receiverID; //For "send", know both send & recv procrs senderID = semReq->senderID; @@ -938,7 +939,7 @@ } else //have to wait, replace requester with new slot slv & mark waiting { - if(semData->slaveType == SlotTaskSlv || semData->slaveType == ExtraTaskSlv){ + if(semData->slaveType == SlotTaskSlv){ replaceWithNewSlotSlv( requestingSlv, semEnv ); }