# HG changeset patch # User Sean Halle # Date 1343816187 25200 # Node ID 3999b8429dddc44c930b01c497081d22839f8c9e # Parent 1780f6b00e3d9750dcc6ad3ead6d0e195a97b8c9 Not working -- check point to share changes with Nina diff -r 1780f6b00e3d -r 3999b8429ddd VSs.c --- a/VSs.c Wed Aug 01 00:18:53 2012 -0700 +++ b/VSs.c Wed Aug 01 03:16:27 2012 -0700 @@ -391,51 +391,43 @@ //=========================================================================== -/* - */ SlaveVP * -VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData, - SlaveVP *creatingSlv ) +VSs__create_thread( TopLevelFnPtr fnPtr, void *initData, + SlaveVP *creatingThd ) { VSsSemReq reqData; //the semantic request data is on the stack and disappears when this // call returns -- it's guaranteed to remain in the VP's stack for as // long as the VP is suspended. reqData.reqType = 0; //know type because in a VMS create req - reqData.coreToAssignOnto = -1; //means round-robin assign reqData.fnPtr = fnPtr; reqData.initData = initData; - reqData.callingSlv = creatingSlv; + reqData.callingSlv = creatingThd; - VMS_WL__send_create_slaveVP_req( &reqData, creatingSlv ); + VMS_WL__send_create_slaveVP_req( &reqData, creatingThd ); - return creatingSlv->dataRetFromReq; + return creatingThd->dataRetFromReq; } -SlaveVP * -VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData, - SlaveVP *creatingSlv, int32 coreToAssignOnto ) - { VSsSemReq reqData; - - //the semantic request data is on the stack and disappears when this - // call returns -- it's guaranteed to remain in the VP's stack for as - // long as the VP is suspended. - reqData.reqType = create_slave_w_aff; //not used, May 2012 - reqData.coreToAssignOnto = coreToAssignOnto; - reqData.fnPtr = fnPtr; - reqData.initData = initData; - reqData.callingSlv = creatingSlv; - - VMS_WL__send_create_slaveVP_req( &reqData, creatingSlv ); - - return creatingSlv->dataRetFromReq; - } - - +/*This is always the last thing done in the code animated by a thread. + * Normally, this would be the last line of the thread's top level function. + * But, if the thread exits from any point, it has to do so by calling + * this. + * + *This must update the count of active sub-tasks (sub-threads) of parents, + * and the semantic data and task stub must stay + */ void -VSs__dissipate_slave( SlaveVP *slaveToDissipate ) +VSs__end_thread( SlaveVP *thdToEnd ) { - VMS_WL__send_dissipate_req( slaveToDissipate ); + //check whether all sub-tasks have ended.. if not, don't free the + // semantic data nor task stub of this thread. + check_sub_tasks(); + + //Update the count of live sub-tasks in parent. If parent was a + // thread and has already ended, then if this was the last sub-task, + // free the semantic data and task stub of the parent. + VMS_WL__send_dissipate_req( thdToEnd ); } @@ -809,3 +801,45 @@ VMS_WL__send_sem_request( &reqData, animSlv ); } + +//======================== Internal ================================== +/* + */ +SlaveVP * +VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData, + SlaveVP *creatingSlv ) + { VSsSemReq reqData; + + //the semantic request data is on the stack and disappears when this + // call returns -- it's guaranteed to remain in the VP's stack for as + // long as the VP is suspended. + reqData.reqType = 0; //know type because in a VMS create req + reqData.coreToAssignOnto = -1; //means round-robin assign + reqData.fnPtr = fnPtr; + reqData.initData = initData; + reqData.callingSlv = creatingSlv; + + VMS_WL__send_create_slaveVP_req( &reqData, creatingSlv ); + + return creatingSlv->dataRetFromReq; + } + +SlaveVP * +VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData, + SlaveVP *creatingSlv, int32 coreToAssignOnto ) + { VSsSemReq reqData; + + //the semantic request data is on the stack and disappears when this + // call returns -- it's guaranteed to remain in the VP's stack for as + // long as the VP is suspended. + reqData.reqType = create_slave_w_aff; //not used, May 2012 + reqData.coreToAssignOnto = coreToAssignOnto; + reqData.fnPtr = fnPtr; + reqData.initData = initData; + reqData.callingSlv = creatingSlv; + + VMS_WL__send_create_slaveVP_req( &reqData, creatingSlv ); + + return creatingSlv->dataRetFromReq; + } + diff -r 1780f6b00e3d -r 3999b8429ddd VSs.h --- a/VSs.h Wed Aug 01 00:18:53 2012 -0700 +++ b/VSs.h Wed Aug 01 03:16:27 2012 -0700 @@ -273,15 +273,11 @@ //======================= SlaveVP * -VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData, - SlaveVP *creatingSlv ); - -SlaveVP * -VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData, - SlaveVP *creatingSlv, int32 coreToAssignOnto); +VSs__create_thread( TopLevelFnPtr fnPtr, void *initData, + SlaveVP *creatingThd ); void -VSs__dissipate_slave( SlaveVP *slaveToDissipate ); +VSs__end_thread( SlaveVP *thdToEnd ); //======================= @@ -360,6 +356,19 @@ VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData, VSsSemEnv *semEnv, int32 coreToAssignOnto ); +VSsTaskStub * +create_expl_proc_task_stub( void *initData ); + + +SlaveVP * +VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData, + SlaveVP *creatingSlv ); + +SlaveVP * +VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData, + SlaveVP *creatingSlv, int32 coreToAssignOnto); + + //===================== Measurement of Lang Overheads ===================== #include "Measurement/VSs_Measurement.h" diff -r 1780f6b00e3d -r 3999b8429ddd VSs_PluginFns.c --- a/VSs_PluginFns.c Wed Aug 01 00:18:53 2012 -0700 +++ b/VSs_PluginFns.c Wed Aug 01 03:16:27 2012 -0700 @@ -402,8 +402,8 @@ return newStub; } -/*Application invokes this when it explicitly creates a "processor" via the - * "SSR__create_processor()" command. +/*Application invokes this when it explicitly creates a thread via the + * "VSs__create_thread()" command. * *Make everything in VSs be a task. An explicitly created VP is just a * suspendable task, and the seedVP is also a suspendable task. @@ -414,23 +414,30 @@ *When the slave calls dissipate, have to recycle the task stub. */ inline void -handleExplCreate( VMSReqst *req, SlaveVP *requestingSlv, VSsSemEnv *semEnv ) +handleCreate( VMSReqst *req, SlaveVP *requestingSlv, VSsSemEnv *semEnv ) { VSsSemReq *semReq; SlaveVP *newSlv; - VSsSemData *semData; + VSsSemData *semData, *parentSemData; + VSsTaskStub *explPrTaskStub; semReq = VMS_PI__take_sem_reqst_from( req ); - taskStub = create_expl_proc_task_stub( initData ); - + //use an idle "extra" slave, if have one newSlv = readPrivQ( semEnv->extraTaskSlvQ ); - if( newSlv == NULL ) + if( newSlv == NULL ) //or, create a new slave, if no extras newSlv = VSs__create_slave_helper( semReq->fnPtr, semReq->initData, semEnv, semReq->coreToAssignOnto ); + semData = ( (VSsSemData *)newSlv->semanticData ); - semData->threadInfo->parent = requestingSlv; - semData->taskStub = newPrTaskStub; + semData->needsTaskAssigned = FALSE; + semData->taskStub = create_expl_proc_task_stub( semReq->initData ); + semData->taskStub->parent = semReq->callingSlv; + + //Deceptive -- must work when creator is a normal task, or seed, + // or another thd.. think have valid sem data and task stub for all + parentSemData = (VSsSemData *)semReq->callingSlv->semanticData; + parentSemData->taskStub->numChildTasks += 1; DEBUG__printf2(dbgRqstHdlr,"Create from: %d, new VP: %d", requestingSlv->slaveID, newSlv->slaveID)