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)