# HG changeset patch # User Nina Engelhardt # Date 1359735537 -3600 # Node ID 3787df8b95f92691a86520c344bb94c3eabe67d9 # Parent b787a5234406fd0dcce1d2e146703f0be21637af seedSlv gets taskID -1, assigner initiates shutdown if deadlock detected, more explicit debug messages diff -r b787a5234406 -r 3787df8b95f9 VSs.c --- a/VSs.c Thu Dec 27 12:27:45 2012 +0100 +++ b/VSs.c Fri Feb 01 17:18:57 2013 +0100 @@ -77,6 +77,7 @@ SlaveVP *seedSlv; VSsSemData *semData; VSsTaskStub *threadTaskStub, *parentTaskStub; + int32* taskID; VSs__init(); //normal multi-thd @@ -98,6 +99,11 @@ parentTaskStub->numLiveChildThreads = 1; //so dissipate works for seed threadTaskStub->parentTaskStub = parentTaskStub; threadTaskStub->slaveAssignedTo = seedSlv; + + taskID = VMS_WL__malloc(2 * sizeof(int32) ); + taskID[0] = 1; + taskID[1] = -1; + threadTaskStub->taskID = taskID; semData = (VSsSemData *)seedSlv->semanticData; //seedVP is a thread, so has a permanent task diff -r b787a5234406 -r 3787df8b95f9 VSs_PluginFns.c --- a/VSs_PluginFns.c Thu Dec 27 12:27:45 2012 +0100 +++ b/VSs_PluginFns.c Fri Feb 01 17:18:57 2013 +0100 @@ -138,6 +138,9 @@ } #endif } + } else if (_VMSMasterEnv->numAnimatedSlaves == 0){ + DEBUG__printf(TRUE,"Deadlock detected"); + semEnv->shutdownInitiated = TRUE; } //return NULL.. no task and none to resume returnSlv = NULL; diff -r b787a5234406 -r 3787df8b95f9 VSs_Request_Handlers.c --- a/VSs_Request_Handlers.c Thu Dec 27 12:27:45 2012 +0100 +++ b/VSs_Request_Handlers.c Fri Feb 01 17:18:57 2013 +0100 @@ -214,12 +214,11 @@ if (taskStub->numBlockingProp == 0) { writePrivQ(taskStub, semEnv->taskReadyQ); DEBUG__printf_w_task(dbgRqstHdlr, taskStub, "ready (dependencies fulfilled)"); - } else { - DEBUG__printf_w_task(dbgRqstHdlr,taskStub,"still blocked on %d args",taskStub->numBlockingProp); } ptrEntry->numEnabledNonDoneReaders += 1; } else { /*Otherwise, the reader is put into the hash-entry's Q of * waiters*/ + DEBUG__printf_w_task(dbgRqstHdlr, taskStub, "getting in line for ptrEntry %p (read)", ptrEntry); taskCarrier = create_task_carrier(taskStub, argNum, READER); writePrivQ(taskCarrier, ptrEntry->waitersQ); } @@ -237,11 +236,10 @@ if (taskStub->numBlockingProp == 0) { DEBUG__printf_w_task(dbgRqstHdlr, taskStub, "ready (dependencies fulfilled)"); writePrivQ(taskStub, semEnv->taskReadyQ); - } else { - DEBUG__printf_w_task(dbgRqstHdlr,taskStub,"still blocked on %d args",taskStub->numBlockingProp); } ptrEntry->hasEnabledNonFinishedWriter = TRUE; } else {/*Otherwise, put the writer into the entry's Q of waiters.*/ + DEBUG__printf_w_task(dbgRqstHdlr,taskStub,"getting in line for ptrEntry %p (write)",ptrEntry); taskCarrier = create_task_carrier(taskStub, argNum, WRITER); writePrivQ(taskCarrier, ptrEntry->waitersQ); } @@ -1130,14 +1128,12 @@ semData = (VSsSemData *) semReq->callingSlv->semanticData; requestingTaskStub = semData->taskStub; - DEBUG__printf_w_task(dbgRqstHdlr, requestingTaskStub, "TaskwaitOn request from slave %d", - requestingSlv->slaveID); void* ptr = semReq->args; key[0] = 4; //two 32b values in key *((uint64*) & key[1]) = (uint64) ptr; //write 64b into two 32b - *((uint64*) & key[3]) = (uint64) requestingTaskStub->parentTaskStub; + *((uint64*) & key[3]) = (uint64) requestingTaskStub; //->parentTaskStub; /*If the hash entry was chained, put it at the * start of the chain. (Means no-longer-used pointers accumulate * at end of chain, decide garbage collection later) */ @@ -1152,6 +1148,9 @@ rawHashEntry = addValueIntoTable32(key, ptrEntry, argPtrHashTbl); } } + + DEBUG__printf_w_task(dbgRqstHdlr, requestingTaskStub, + "TaskwaitOn request on ptrEntry %p", ptrEntry); if (!ptrEntry->hasEnabledNonFinishedWriter && isEmptyPrivQ(ptrEntry->waitersQ)) {