# HG changeset patch # User Sean Halle # Date 1345710446 25200 # Node ID b2bc973182627ef8d9d6837717f44339ef492692 # Parent 2bf83f932705354366c6496ca8733d2df31b45dc bug fix -- always turn SlotTaskSlv into ExtraTaskSlv inside request handler diff -r 2bf83f932705 -r b2bc97318262 VSs.h --- a/VSs.h Tue Aug 21 17:42:07 2012 +0200 +++ b/VSs.h Thu Aug 23 01:27:26 2012 -0700 @@ -229,11 +229,11 @@ typedef struct { - int32 highestTransEntered; - TransListElem *lastTransEntered; - bool32 needsTaskAssigned; - VSsTaskStub *taskStub; - enum VSsSlvType slaveType; + int32 highestTransEntered; + TransListElem *lastTransEntered; + bool32 needsTaskAssigned; + VSsTaskStub *taskStub; + enum VSsSlvType slaveType; } VSsSemData; diff -r 2bf83f932705 -r b2bc97318262 VSs_Request_Handlers.c --- a/VSs_Request_Handlers.c Tue Aug 21 17:42:07 2012 +0200 +++ b/VSs_Request_Handlers.c Thu Aug 23 01:27:26 2012 -0700 @@ -227,7 +227,10 @@ HashTable * argPtrHashTbl = semEnv->argPtrHashTbl; - DEBUG__printf1(dbgRqstHdlr,"Submit request from processor %d",semReq->callingSlv->slaveID) + //suspending a task always makes the slave into an extra slot slave, + // because it ends up in the resumeQ, even when resumes immediately. + //Eventually task_end will put the slave into the freeExtraTaskSlvQ + replaceWithNewSlotSlvIfNeeded( semReq->callingSlv, semEnv ); /* ========================== creation ========================== * @@ -248,6 +251,9 @@ taskStub->parentTaskStub = (void*) parentSemData->taskStub; parentSemData->taskStub->numLiveChildTasks += 1; + //DEBUG__printf3(dbgRqstHdlr,"Submit req from slaveID: %d, from task: %d, for task: %d", semReq->callingSlv->slaveID, parentSemData->taskStub->taskID[1], taskStub->taskID[1]) + DEBUG__printf2(dbgRqstHdlr,"Submit req from slaveID: %d, for task: %d", semReq->callingSlv->slaveID, taskStub->taskID[1]) + /*The controlled arguments are then processed one by one. *Processing an argument means getting the hash of the pointer. Then, * looking up the hash entry. (If none, create one). @@ -375,7 +381,6 @@ VSsTaskStubCarrier *waitingTaskCarrier; VSsPointerEntry **ptrEntries; - DEBUG__printf1(dbgRqstHdlr,"EndTask request from processor %d",semReq->callingSlv->slaveID) endingSlvSemData = (VSsSemData *)semReq->callingSlv->semanticData; endingTaskStub = endingSlvSemData->taskStub; @@ -383,6 +388,8 @@ endingTaskType = endingTaskStub->taskType; ptrEntries = endingTaskStub->ptrEntries; //saved in stub when create + DEBUG__printf2(dbgRqstHdlr,"EndTask req from slaveID: %d, task: %d",semReq->callingSlv->slaveID, endingTaskStub->taskID[1]) + //Check if parent was waiting on this task parent = (VSsTaskStub *) endingTaskStub->parentTaskStub; parent->numLiveChildTasks -= 1; @@ -525,11 +532,10 @@ inline void free_task_stub( VSsTaskStub *stubToFree ) -{ - if(stubToFree->ptrEntries){ - VMS_PI__free( stubToFree->ptrEntries ); + { if(stubToFree->ptrEntries != NULL ) //a thread stub has NULL entry + { VMS_PI__free( stubToFree->ptrEntries ); } - VMS_PI__free( stubToFree ); + VMS_PI__free( stubToFree ); } //========================== Task Comm handlers =========================== @@ -556,25 +562,26 @@ HashEntry *entry; HashTable *commHashTbl = semEnv->commHashTbl; - DEBUG__printf1(dbgRqstHdlr,"SendType request from processor %d",semReq->senderSlv->slaveID) - receiverID = semReq->receiverID; //For "send", know both send & recv procrs senderSlv = semReq->senderSlv; + DEBUG__printf2(dbgRqstHdlr,"SendType req from sender slaveID: %d, recTask: %d", senderSlv->slaveID, receiverID[1]) + + //suspending a task always makes the slave into an extra slot slave, + // because it ends up in the resumeQ, even when resumes immediately. + //Eventually task_end will put the slave into the freeExtraTaskSlvQ + replaceWithNewSlotSlvIfNeeded( senderSlv, semEnv ); + receiverIDNumInt = receiverID[0] + 1; //pos 0 doesn't include itself - keySz = receiverIDNumInt * sizeof(int32) + sizeof(int32); + keySz = receiverIDNumInt * sizeof(int32) + 2 * sizeof(int32); key = VMS_PI__malloc( keySz ); - memcpy( key, receiverID, receiverIDNumInt * sizeof(int32) ); - key[ receiverIDNumInt ] = semReq->msgType; //no +1 'cause starts at 0 + key[0] = receiverIDNumInt + 1; //loc 0 is num int32 in key + memcpy( &key[1], receiverID, receiverIDNumInt * sizeof(int32) ); + key[ 1 + receiverIDNumInt ] = semReq->msgType; entry = giveEntryElseInsertReqst32( key, semReq, commHashTbl ); if( entry == NULL ) //was just inserted, means task has to wait - { //the task is in a slot slave, which stays suspended, so replace - // it with a new slave (causes it to become an extraTaskSlv) - //Once the waiting slave resumes and gets to task_end, the task_end - // puts the slave into the freeExtraTaskSlvQ - replaceWithNewSlotSlv( senderSlv, semEnv ); - return; + { return; } //if here, found a waiting request with same key @@ -659,28 +666,29 @@ HashEntry *entry; HashTable *commHashTbl = semEnv->commHashTbl; - DEBUG__printf2(dbgRqstHdlr,"SendFromTo request from processor %d to %d", + DEBUG__printf2(dbgRqstHdlr,"SendFromTo req from task %d to %d", semReq->senderID[1],semReq->receiverID[1]) receiverID = semReq->receiverID; //For "send", know both send & recv procrs senderID = semReq->senderID; senderSlv = semReq->senderSlv; - receiverIDNumInt = receiverID[0] + 1; //pos 0 doesn't include itself + //suspending a task always makes the slave into an extra slot slave, + // because it ends up in the resumeQ, even when resumes immediately. + //Eventually task_end will put the slave into the freeExtraTaskSlvQ + replaceWithNewSlotSlvIfNeeded( senderSlv, semEnv ); + + receiverIDNumInt = receiverID[0] + 1; //include the count in the key senderIDNumInt = senderID[0] + 1; - keySz = (receiverIDNumInt + senderIDNumInt) * sizeof(int32); + keySz = (receiverIDNumInt + senderIDNumInt) * sizeof(int32) + sizeof(int32); key = VMS_PI__malloc( keySz ); - memcpy( key, receiverID, receiverIDNumInt * sizeof(int32) ); - memcpy( &key[receiverIDNumInt], senderID, senderIDNumInt * sizeof(int32) ); + key[0] = receiverIDNumInt + senderIDNumInt; + memcpy( &key[1], receiverID, receiverIDNumInt * sizeof(int32) ); + memcpy( &key[1 + receiverIDNumInt], senderID, senderIDNumInt * sizeof(int32) ); entry = giveEntryElseInsertReqst32( key, semReq, commHashTbl ); if( entry == NULL ) //was just inserted, means task has to wait - { //the task is in a slot slave, which stays suspended, so replace - // it with a new slave (causes it to become an extraTaskSlv) - //Once the waiting slave resumes and gets to task_end, the task_end - // puts the slave into the freeExtraTaskSlvQ - replaceWithNewSlotSlv( senderSlv, semEnv ); - return; + { return; } waitingReq = (VSsSemReq *)entry->content; @@ -742,27 +750,27 @@ HashEntry *entry; HashTable *commHashTbl = semEnv->commHashTbl; - DEBUG__printf1(dbgRqstHdlr,"SendType request to %d",semReq->receiverID[1]) + DEBUG__printf2(dbgRqstHdlr,"ReceiveType req to ID: %d type: %d",semReq->receiverID[1], semReq->msgType) receiverID = semReq->receiverID; //For "send", know both send & recv procrs receiverSlv = semReq->receiverSlv; + + //suspending a task always makes the slave into an extra slot slave, + // because it ends up in the resumeQ, even when resumes immediately. + //Eventually task_end will put the slave into the freeExtraTaskSlvQ + replaceWithNewSlotSlvIfNeeded( receiverSlv, semEnv ); //key is the receiverID plus the type -- have to copy them into key receiverIDNumInt = receiverID[0] + 1; //pos 0 doesn't include itself - keySz = receiverIDNumInt * sizeof(int32) + sizeof(int32); + keySz = receiverIDNumInt * sizeof(int32) + 2 * sizeof(int32); key = VMS_PI__malloc( keySz ); - memcpy( key, receiverID, receiverIDNumInt * sizeof(int32) ); - key[ receiverIDNumInt ] = semReq->msgType; //no +1 'cause starts at 0 - + key[0] = receiverIDNumInt + 1; //loc 0 is num int32s in key + memcpy( &key[1], receiverID, receiverIDNumInt * sizeof(int32) ); + key[ 1 + receiverIDNumInt ] = semReq->msgType; entry = giveEntryElseInsertReqst32( key, semReq, commHashTbl );//clones if( entry == NULL ) //was just inserted, means task has to wait - { //the task is in a slot slave, which stays suspended, so replace - // it with a new slave (causes it to become an extraTaskSlv) - //Once the waiting slave resumes and gets to task_end, the task_end - // puts the slave into the freeExtraTaskSlvQ - replaceWithNewSlotSlv( receiverSlv, semEnv ); - return; + { return; } waitingReq = (VSsSemReq *)entry->content; //previously cloned by insert @@ -831,27 +839,28 @@ HashEntry *entry; HashTable *commHashTbl = semEnv->commHashTbl; - DEBUG__printf2(dbgRqstHdlr,"ReceiveFromTo request from %d to %d",semReq->senderID[1],semReq->receiverID[1]) + DEBUG__printf2(dbgRqstHdlr,"RecFromTo req from ID: %d to ID: %d",semReq->senderID[1],semReq->receiverID[1]) receiverID = semReq->receiverID; //For "send", know both send & recv procrs senderID = semReq->senderID; receiverSlv = semReq->receiverSlv; + + //suspending a task always makes the slave into an extra slot slave, + // because it ends up in the resumeQ, even when resumes immediately. + //Eventually task_end will put the slave into the freeExtraTaskSlvQ + replaceWithNewSlotSlvIfNeeded( receiverSlv, semEnv ); receiverIDNumInt = receiverID[0] + 1; //pos 0 doesn't include itself senderIDNumInt = senderID[0] + 1; - keySz = (receiverIDNumInt + senderIDNumInt) * sizeof(int32); + keySz = (receiverIDNumInt + senderIDNumInt) * sizeof(int32) + sizeof(int32); key = VMS_PI__malloc( keySz ); - memcpy( key, receiverID, receiverIDNumInt * sizeof(int32) ); - memcpy( &key[receiverIDNumInt], senderID, senderIDNumInt * sizeof(int32)); + key[0] = receiverIDNumInt + senderIDNumInt; //loc 0 is num int32s in key + memcpy( &key[1], receiverID, receiverIDNumInt * sizeof(int32) ); + memcpy( &key[1 + receiverIDNumInt], senderID, senderIDNumInt * sizeof(int32)); entry = giveEntryElseInsertReqst32( key, semReq, commHashTbl ); if( entry == NULL ) //was just inserted, means task has to wait - { //the task is in a slot slave, which stays suspended, so replace - // it with a new slave (causes it to become an extraTaskSlv) - //Once the waiting slave resumes and gets to task_end, the task_end - // puts the slave into the freeExtraTaskSlvQ - replaceWithNewSlotSlv( receiverSlv, semEnv ); - return; + { return; } waitingReq = (VSsSemReq *)entry->content; @@ -894,10 +903,14 @@ //========================================================================== inline void -replaceWithNewSlotSlv( SlaveVP *requestingSlv, VSsSemEnv *semEnv ) +replaceWithNewSlotSlvIfNeeded( SlaveVP *requestingSlv, VSsSemEnv *semEnv ) { SlaveVP *newSlotSlv; - VSsSemData *semData; + VSsSemData *semData, *reqSemData; + reqSemData = (VSsSemData *)requestingSlv->semanticData; + if( reqSemData->slaveType != SlotTaskSlv ) + return; //already replaced, so just return + //get a new slave to be the slot slave newSlotSlv = readPrivQ( semEnv->freeExtraTaskSlvQ ); if( newSlotSlv == NULL ) @@ -909,6 +922,8 @@ semData->taskStub = NULL; semData->slaveType = SlotTaskSlv; semData->needsTaskAssigned = TRUE; + + //a slot slave is pinned to a particular slot on a particular core newSlotSlv->animSlotAssignedTo = requestingSlv->animSlotAssignedTo; newSlotSlv->coreAnimatedBy = requestingSlv->coreAnimatedBy; @@ -940,7 +955,7 @@ else //have to wait, replace requester with new slot slv & mark waiting { if(semData->slaveType == SlotTaskSlv){ - replaceWithNewSlotSlv( requestingSlv, semEnv ); + replaceWithNewSlotSlvIfNeeded( requestingSlv, semEnv ); } requestingTaskStub->isWaitingForChildTasksToEnd = TRUE; diff -r 2bf83f932705 -r b2bc97318262 VSs_Request_Handlers.h --- a/VSs_Request_Handlers.h Tue Aug 21 17:42:07 2012 +0200 +++ b/VSs_Request_Handlers.h Thu Aug 23 01:27:26 2012 -0700 @@ -55,7 +55,7 @@ inline void free_task_stub( VSsTaskStub *stubToFree ); inline void -replaceWithNewSlotSlv( SlaveVP *requestingSlv, VSsSemEnv *semEnv ); +replaceWithNewSlotSlvIfNeeded( SlaveVP *requestingSlv, VSsSemEnv *semEnv ); #endif /* _VSs_REQ_H */