Mercurial > cgi-bin > hgwebdir.cgi > VMS > VMS_Implementations > VSs_impls > VSs__MC_shared_impl
changeset 7:3999b8429ddd dev_expl_VP_and_DKU
Not working -- check point to share changes with Nina
author | Sean Halle <seanhalle@yahoo.com> |
---|---|
date | Wed, 01 Aug 2012 03:16:27 -0700 |
parents | 1780f6b00e3d |
children | eb3d77ca9f59 |
files | VSs.c VSs.h VSs_PluginFns.c |
diffstat | 3 files changed, 96 insertions(+), 46 deletions(-) [+] |
line diff
1.1 --- a/VSs.c Wed Aug 01 00:18:53 2012 -0700 1.2 +++ b/VSs.c Wed Aug 01 03:16:27 2012 -0700 1.3 @@ -391,51 +391,43 @@ 1.4 1.5 //=========================================================================== 1.6 1.7 -/* 1.8 - */ 1.9 SlaveVP * 1.10 -VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData, 1.11 - SlaveVP *creatingSlv ) 1.12 +VSs__create_thread( TopLevelFnPtr fnPtr, void *initData, 1.13 + SlaveVP *creatingThd ) 1.14 { VSsSemReq reqData; 1.15 1.16 //the semantic request data is on the stack and disappears when this 1.17 // call returns -- it's guaranteed to remain in the VP's stack for as 1.18 // long as the VP is suspended. 1.19 reqData.reqType = 0; //know type because in a VMS create req 1.20 - reqData.coreToAssignOnto = -1; //means round-robin assign 1.21 reqData.fnPtr = fnPtr; 1.22 reqData.initData = initData; 1.23 - reqData.callingSlv = creatingSlv; 1.24 + reqData.callingSlv = creatingThd; 1.25 1.26 - VMS_WL__send_create_slaveVP_req( &reqData, creatingSlv ); 1.27 + VMS_WL__send_create_slaveVP_req( &reqData, creatingThd ); 1.28 1.29 - return creatingSlv->dataRetFromReq; 1.30 + return creatingThd->dataRetFromReq; 1.31 } 1.32 1.33 -SlaveVP * 1.34 -VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData, 1.35 - SlaveVP *creatingSlv, int32 coreToAssignOnto ) 1.36 - { VSsSemReq reqData; 1.37 - 1.38 - //the semantic request data is on the stack and disappears when this 1.39 - // call returns -- it's guaranteed to remain in the VP's stack for as 1.40 - // long as the VP is suspended. 1.41 - reqData.reqType = create_slave_w_aff; //not used, May 2012 1.42 - reqData.coreToAssignOnto = coreToAssignOnto; 1.43 - reqData.fnPtr = fnPtr; 1.44 - reqData.initData = initData; 1.45 - reqData.callingSlv = creatingSlv; 1.46 - 1.47 - VMS_WL__send_create_slaveVP_req( &reqData, creatingSlv ); 1.48 - 1.49 - return creatingSlv->dataRetFromReq; 1.50 - } 1.51 - 1.52 - 1.53 +/*This is always the last thing done in the code animated by a thread. 1.54 + * Normally, this would be the last line of the thread's top level function. 1.55 + * But, if the thread exits from any point, it has to do so by calling 1.56 + * this. 1.57 + * 1.58 + *This must update the count of active sub-tasks (sub-threads) of parents, 1.59 + * and the semantic data and task stub must stay 1.60 + */ 1.61 void 1.62 -VSs__dissipate_slave( SlaveVP *slaveToDissipate ) 1.63 +VSs__end_thread( SlaveVP *thdToEnd ) 1.64 { 1.65 - VMS_WL__send_dissipate_req( slaveToDissipate ); 1.66 + //check whether all sub-tasks have ended.. if not, don't free the 1.67 + // semantic data nor task stub of this thread. 1.68 + check_sub_tasks(); 1.69 + 1.70 + //Update the count of live sub-tasks in parent. If parent was a 1.71 + // thread and has already ended, then if this was the last sub-task, 1.72 + // free the semantic data and task stub of the parent. 1.73 + VMS_WL__send_dissipate_req( thdToEnd ); 1.74 } 1.75 1.76 1.77 @@ -809,3 +801,45 @@ 1.78 1.79 VMS_WL__send_sem_request( &reqData, animSlv ); 1.80 } 1.81 + 1.82 +//======================== Internal ================================== 1.83 +/* 1.84 + */ 1.85 +SlaveVP * 1.86 +VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData, 1.87 + SlaveVP *creatingSlv ) 1.88 + { VSsSemReq reqData; 1.89 + 1.90 + //the semantic request data is on the stack and disappears when this 1.91 + // call returns -- it's guaranteed to remain in the VP's stack for as 1.92 + // long as the VP is suspended. 1.93 + reqData.reqType = 0; //know type because in a VMS create req 1.94 + reqData.coreToAssignOnto = -1; //means round-robin assign 1.95 + reqData.fnPtr = fnPtr; 1.96 + reqData.initData = initData; 1.97 + reqData.callingSlv = creatingSlv; 1.98 + 1.99 + VMS_WL__send_create_slaveVP_req( &reqData, creatingSlv ); 1.100 + 1.101 + return creatingSlv->dataRetFromReq; 1.102 + } 1.103 + 1.104 +SlaveVP * 1.105 +VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData, 1.106 + SlaveVP *creatingSlv, int32 coreToAssignOnto ) 1.107 + { VSsSemReq reqData; 1.108 + 1.109 + //the semantic request data is on the stack and disappears when this 1.110 + // call returns -- it's guaranteed to remain in the VP's stack for as 1.111 + // long as the VP is suspended. 1.112 + reqData.reqType = create_slave_w_aff; //not used, May 2012 1.113 + reqData.coreToAssignOnto = coreToAssignOnto; 1.114 + reqData.fnPtr = fnPtr; 1.115 + reqData.initData = initData; 1.116 + reqData.callingSlv = creatingSlv; 1.117 + 1.118 + VMS_WL__send_create_slaveVP_req( &reqData, creatingSlv ); 1.119 + 1.120 + return creatingSlv->dataRetFromReq; 1.121 + } 1.122 +
2.1 --- a/VSs.h Wed Aug 01 00:18:53 2012 -0700 2.2 +++ b/VSs.h Wed Aug 01 03:16:27 2012 -0700 2.3 @@ -273,15 +273,11 @@ 2.4 //======================= 2.5 2.6 SlaveVP * 2.7 -VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData, 2.8 - SlaveVP *creatingSlv ); 2.9 - 2.10 -SlaveVP * 2.11 -VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData, 2.12 - SlaveVP *creatingSlv, int32 coreToAssignOnto); 2.13 +VSs__create_thread( TopLevelFnPtr fnPtr, void *initData, 2.14 + SlaveVP *creatingThd ); 2.15 2.16 void 2.17 -VSs__dissipate_slave( SlaveVP *slaveToDissipate ); 2.18 +VSs__end_thread( SlaveVP *thdToEnd ); 2.19 2.20 //======================= 2.21 2.22 @@ -360,6 +356,19 @@ 2.23 VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData, 2.24 VSsSemEnv *semEnv, int32 coreToAssignOnto ); 2.25 2.26 +VSsTaskStub * 2.27 +create_expl_proc_task_stub( void *initData ); 2.28 + 2.29 + 2.30 +SlaveVP * 2.31 +VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData, 2.32 + SlaveVP *creatingSlv ); 2.33 + 2.34 +SlaveVP * 2.35 +VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData, 2.36 + SlaveVP *creatingSlv, int32 coreToAssignOnto); 2.37 + 2.38 + 2.39 //===================== Measurement of Lang Overheads ===================== 2.40 #include "Measurement/VSs_Measurement.h" 2.41
3.1 --- a/VSs_PluginFns.c Wed Aug 01 00:18:53 2012 -0700 3.2 +++ b/VSs_PluginFns.c Wed Aug 01 03:16:27 2012 -0700 3.3 @@ -402,8 +402,8 @@ 3.4 return newStub; 3.5 } 3.6 3.7 -/*Application invokes this when it explicitly creates a "processor" via the 3.8 - * "SSR__create_processor()" command. 3.9 +/*Application invokes this when it explicitly creates a thread via the 3.10 + * "VSs__create_thread()" command. 3.11 * 3.12 *Make everything in VSs be a task. An explicitly created VP is just a 3.13 * suspendable task, and the seedVP is also a suspendable task. 3.14 @@ -414,23 +414,30 @@ 3.15 *When the slave calls dissipate, have to recycle the task stub. 3.16 */ 3.17 inline void 3.18 -handleExplCreate( VMSReqst *req, SlaveVP *requestingSlv, VSsSemEnv *semEnv ) 3.19 +handleCreate( VMSReqst *req, SlaveVP *requestingSlv, VSsSemEnv *semEnv ) 3.20 { VSsSemReq *semReq; 3.21 SlaveVP *newSlv; 3.22 - VSsSemData *semData; 3.23 + VSsSemData *semData, *parentSemData; 3.24 + VSsTaskStub *explPrTaskStub; 3.25 3.26 semReq = VMS_PI__take_sem_reqst_from( req ); 3.27 3.28 - taskStub = create_expl_proc_task_stub( initData ); 3.29 - 3.30 + //use an idle "extra" slave, if have one 3.31 newSlv = readPrivQ( semEnv->extraTaskSlvQ ); 3.32 - if( newSlv == NULL ) 3.33 + if( newSlv == NULL ) //or, create a new slave, if no extras 3.34 newSlv = VSs__create_slave_helper( semReq->fnPtr, semReq->initData, 3.35 semEnv, semReq->coreToAssignOnto ); 3.36 + 3.37 3.38 semData = ( (VSsSemData *)newSlv->semanticData ); 3.39 - semData->threadInfo->parent = requestingSlv; 3.40 - semData->taskStub = newPrTaskStub; 3.41 + semData->needsTaskAssigned = FALSE; 3.42 + semData->taskStub = create_expl_proc_task_stub( semReq->initData ); 3.43 + semData->taskStub->parent = semReq->callingSlv; 3.44 + 3.45 + //Deceptive -- must work when creator is a normal task, or seed, 3.46 + // or another thd.. think have valid sem data and task stub for all 3.47 + parentSemData = (VSsSemData *)semReq->callingSlv->semanticData; 3.48 + parentSemData->taskStub->numChildTasks += 1; 3.49 3.50 DEBUG__printf2(dbgRqstHdlr,"Create from: %d, new VP: %d", 3.51 requestingSlv->slaveID, newSlv->slaveID)