changeset 27:3b30da4643d1 ML_dev

Update2.. in middle of changes.. made request handler ptr be sent w/req struct
author Sean Halle <seanhalle@yahoo.com>
date Sat, 12 Jan 2013 11:31:51 -0800
parents a60399b62614
children 91caa8a9d591
files Measurement/VSs_Counter_Recording.c Measurement/VSs_Measurement.h VSs.c VSs.h VSs_PluginFns.c VSs_Request_Handlers.c VSs_Request_Handlers.h VSs_SS.c
diffstat 8 files changed, 847 insertions(+), 463 deletions(-) [+]
line diff
     1.1 --- a/Measurement/VSs_Counter_Recording.c	Thu Oct 18 02:44:30 2012 -0700
     1.2 +++ b/Measurement/VSs_Counter_Recording.c	Sat Jan 12 11:31:51 2013 -0800
     1.3 @@ -11,11 +11,11 @@
     1.4  
     1.5  void VSs__init_counter_data_structs( SlaveVP *slave )
     1.6   {
     1.7 -   VSsSemEnv *semanticEnv = 
     1.8 -                (VSsSemEnv *)PR_SS__give_sem_env_for( slave, VSs_MAGIC_NUMBER );
     1.9 +   VSsLangEnv *langEnv = 
    1.10 +                (VSsLangEnv *)PR_SS__give_lang_env_for_slave( slave, VSs_MAGIC_NUMBER );
    1.11     int i;
    1.12     for(i=0;i<NUM_CORES;i++)
    1.13 -    { semanticEnv->counterList[i] = makeListOfArrays(sizeof(CounterEvent), 128);
    1.14 +    { langEnv->counterList[i] = makeListOfArrays(sizeof(CounterEvent), 128);
    1.15      }
    1.16   }
    1.17  
    1.18 @@ -38,7 +38,7 @@
    1.19          return;
    1.20       }
    1.21  
    1.22 -    VSsSemEnv *semanticEnv = _PRMasterEnv->semanticEnv;
    1.23 +    VSsLangEnv *langEnv = _PRTopEnv->protoLangEnv;
    1.24              
    1.25      CounterEvent e;
    1.26      e.event_type = evt_type;
    1.27 @@ -61,9 +61,9 @@
    1.28      if(pr) corenum = pr->coreAnimatedBy; else return; 
    1.29    
    1.30      if(evt_type==Work_start || evt_type==Work_end || evt_type==AppResponderInvocation_start){
    1.31 -        addToListOfArrays_ext(CounterEvent,e,semanticEnv->counterList[corenum]);
    1.32 +        addToListOfArrays_ext(CounterEvent,e,langEnv->counterList[corenum]);
    1.33      } else {
    1.34 -        addToListOfArraysCounterEvent(e,semanticEnv->counterList[corenum]);
    1.35 +        addToListOfArraysCounterEvent(e,langEnv->counterList[corenum]);
    1.36      }
    1.37  }
    1.38  
     2.1 --- a/Measurement/VSs_Measurement.h	Thu Oct 18 02:44:30 2012 -0700
     2.2 +++ b/Measurement/VSs_Measurement.h	Sat Jan 12 11:31:51 2013 -0800
     2.3 @@ -1,5 +1,5 @@
     2.4  /*
     2.5 - *  Copyright 2009 OpenSourceStewardshipFoundation.org
     2.6 + *  Copyright 2009 OpenSourceResearchInstitute.org
     2.7   *  Licensed under GNU General Public License version 2
     2.8   *
     2.9   * Author: seanhalle@yahoo.com
    2.10 @@ -26,8 +26,8 @@
    2.11     #define ReceiveOfTypeHistIdx   4
    2.12  
    2.13     #define MEAS__Make_Meas_Hists_for_Language \
    2.14 -      _PRMasterEnv->measHistsInfo = \
    2.15 -                 makePrivDynArrayOfSize( (void***)&(_PRMasterEnv->measHists), 200); \
    2.16 +      _PRTopEnv->measHistsInfo = \
    2.17 +                 makePrivDynArrayOfSize( (void***)&(_PRTopEnv->measHists), 200); \
    2.18         makeAMeasHist( SendFromToHistIdx,   "SendFromTo",    50, 0, 100 ) \
    2.19         makeAMeasHist( SendOfTypeHistIdx,   "SendOfType",    50, 0, 100 ) \
    2.20         makeAMeasHist( ReceiveFromToHistIdx,"ReceiveFromTo", 50, 0, 100 ) \
    2.21 @@ -40,7 +40,7 @@
    2.22     #define Meas_endSendFromTo \
    2.23         saveLowTimeStampCountInto( endStamp ); \
    2.24         addIntervalToHist( startStamp, endStamp, \
    2.25 -                                _PRMasterEnv->measHists[ SendFromToHistIdx ] );
    2.26 +                                _PRTopEnv->measHists[ SendFromToHistIdx ] );
    2.27  
    2.28     #define Meas_startSendOfType \
    2.29         int32 startStamp, endStamp; \
    2.30 @@ -49,7 +49,7 @@
    2.31     #define Meas_endSendOfType \
    2.32         saveLowTimeStampCountInto( endStamp ); \
    2.33         addIntervalToHist( startStamp, endStamp, \
    2.34 -                                _PRMasterEnv->measHists[ SendOfTypeHistIdx ] );
    2.35 +                                _PRTopEnv->measHists[ SendOfTypeHistIdx ] );
    2.36  
    2.37     #define Meas_startReceiveFromTo \
    2.38         int32 startStamp, endStamp; \
    2.39 @@ -58,7 +58,7 @@
    2.40     #define Meas_endReceiveFromTo \
    2.41         saveLowTimeStampCountInto( endStamp ); \
    2.42         addIntervalToHist( startStamp, endStamp, \
    2.43 -                                _PRMasterEnv->measHists[ ReceiveFromToHistIdx ] );
    2.44 +                                _PRTopEnv->measHists[ ReceiveFromToHistIdx ] );
    2.45  
    2.46     #define Meas_startReceiveOfType \
    2.47         int32 startStamp, endStamp; \
    2.48 @@ -67,7 +67,7 @@
    2.49     #define Meas_endReceiveOfType \
    2.50         saveLowTimeStampCountInto( endStamp ); \
    2.51         addIntervalToHist( startStamp, endStamp, \
    2.52 -                                _PRMasterEnv->measHists[ReceiveOfTypeHistIdx ] );
    2.53 +                                _PRTopEnv->measHists[ReceiveOfTypeHistIdx ] );
    2.54  
    2.55  #else //===================== turned off ==========================
    2.56  
     3.1 --- a/VSs.c	Thu Oct 18 02:44:30 2012 -0700
     3.2 +++ b/VSs.c	Sat Jan 12 11:31:51 2013 -0800
     3.3 @@ -15,6 +15,12 @@
     3.4  #include "Measurement/VSs_Counter_Recording.h"
     3.5  
     3.6  //==========================================================================
     3.7 +void
     3.8 +VSs__init_Helper();
     3.9 +
    3.10 +SlaveVP *
    3.11 +VSs__create_thread_w_ID_and_affinity( TopLevelFnPtr fnPtr,   void *initData, 
    3.12 +                    int32 *thdID, int32 coreToAssignOnto, SlaveVP *creatingThd );
    3.13  
    3.14  //==========================================================================
    3.15  
    3.16 @@ -75,12 +81,12 @@
    3.17   * saves jump point, and second jumps back several times to get reliable time
    3.18   */
    3.19  void
    3.20 -VSs__begin_primitive()
    3.21 - { VSsSemData *semData;
    3.22 +VSs__begin_primitive( SlaveVP *animSlv )
    3.23 + { VSsLangData *langData;
    3.24     
    3.25 -   semData = (VSsSemData *)PR_WL__give_sem_data( animSlv, VSs_MAGIC_NUMBER);
    3.26 +   langData = (VSsLangData *)PR_WL__give_lang_data( animSlv, VSs_MAGIC_NUMBER);
    3.27  
    3.28 -   saveLowTimeStampCountInto( semData->primitiveStartTime );
    3.29 +   saveLowTimeStampCountInto( langData->primitiveStartTime );
    3.30   }
    3.31  
    3.32  /*Just quick and dirty for now -- make reliable later
    3.33 @@ -89,22 +95,18 @@
    3.34   * also to throw out any "weird" values due to OS interrupt or TSC rollover
    3.35   */
    3.36  int32
    3.37 -VSs__end_primitive_and_give_cycles( SlaveVP animSlv )
    3.38 +VSs__end_primitive_and_give_cycles( SlaveVP *animSlv )
    3.39   { int32 endTime, startTime;
    3.40 -   VSsSemData *semData;
    3.41 +   VSsLangData *langData;
    3.42     
    3.43     //TODO: fix by repeating time-measurement
    3.44     saveLowTimeStampCountInto( endTime );
    3.45 -   semData = (VSsSemData *)PR_WL__give_sem_data( animSlv, VSs_MAGIC_NUMBER);
    3.46 -   startTime = semData->primitiveStartTime;
    3.47 +   langData = (VSsLangData *)PR_WL__give_lang_data( animSlv, VSs_MAGIC_NUMBER);
    3.48 +   startTime = langData->primitiveStartTime;
    3.49     return (endTime - startTime);
    3.50   }
    3.51  
    3.52  
    3.53 -//===========================================================================
    3.54 -
    3.55 -
    3.56 -
    3.57  
    3.58  //===========================================================================
    3.59  
    3.60 @@ -124,21 +126,44 @@
    3.61                                                          ANY_CORE, creatingThd );
    3.62   }
    3.63  
    3.64 +/* old version -- looks safe to delete
    3.65 +SlaveVP *
    3.66 +VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData,
    3.67 +                        SlaveVP *creatingSlv,  int32  coreToAssignOnto )
    3.68 + { VSsLangReq  reqData;
    3.69 +
    3.70 +      //the lang request data is on the stack and disappears when this
    3.71 +      // call returns -- it's guaranteed to remain in the VP's stack for as
    3.72 +      // long as the VP is suspended.
    3.73 +   reqData.reqType            = create_slave_w_aff; //not used, May 2012
    3.74 +   reqData.coreToAssignOnto   = coreToAssignOnto;
    3.75 +   reqData.fnPtr              = fnPtr;
    3.76 +   reqData.initData           = initData;
    3.77 +   reqData.callingSlv         = creatingSlv;
    3.78 +
    3.79 +   PR_WL__send_create_slaveVP_req( &reqData, creatingSlv, VSs_MAGIC_NUMBER );
    3.80 +
    3.81 +   return creatingSlv->dataRetFromReq;
    3.82 + }
    3.83 +*/
    3.84 +
    3.85  
    3.86  SlaveVP *
    3.87  VSs__create_thread_w_ID_and_affinity( TopLevelFnPtr fnPtr,   void *initData, 
    3.88                      int32 *thdID, int32 coreToAssignOnto, SlaveVP *creatingThd )
    3.89 - { VSsSemReq reqData;
    3.90 + { VSsLangReq reqData;
    3.91  
    3.92 -      //the semantic request data is on the stack and disappears when this
    3.93 +      //the lang request data is on the stack and disappears when this
    3.94        // call returns -- it's guaranteed to remain in the VP's stack for as
    3.95        // long as the VP is suspended.
    3.96 -   reqData.reqType            = create_slave; //know type because in a PR create req
    3.97 -   reqData.coreToAssignOnto   = coreToAssignOnto;
    3.98 +   reqData.reqType          = create_slave; //know type because in a PR create req
    3.99 +   reqData.coreToAssignOnto = coreToAssignOnto;
   3.100 +   reqData.fnPtr            = fnPtr;
   3.101 +   reqData.initData         = initData;
   3.102     
   3.103 -   PR_WL__send_create_slaveVP_req( &reqData, fnPtr, initData, thdID, 
   3.104 +   PR_WL__send_create_slaveVP_req( &reqData, thdID, &handleCreateThd,
   3.105                                                  creatingThd, VSs_MAGIC_NUMBER );
   3.106 -   return creatingThd->dataRetFromReq;
   3.107 +   return (SlaveVP *)creatingThd->dataRetFromReq;
   3.108   }
   3.109  
   3.110  /*This is always the last thing done in the code animated by a thread VP.
   3.111 @@ -151,7 +176,8 @@
   3.112  void
   3.113  VSs__end_thread( SlaveVP *thdToEnd )
   3.114   {    
   3.115 -   PR_WL__send_dissipate_req( thdToEnd, VSs_MAGIC_NUMBER );
   3.116 +   //the lang request is null for VSs version of end slave 
   3.117 +   PR_WL__send_end_slave_req( NULL, &handleDissipate, thdToEnd, VSs_MAGIC_NUMBER );
   3.118   }
   3.119  
   3.120  
   3.121 @@ -164,7 +190,7 @@
   3.122   */
   3.123  void
   3.124  VSs__submit_task( VSsTaskType *taskType, void *args, SlaveVP *animSlv)
   3.125 - { VSsSemReq  reqData;
   3.126 + { VSsLangReq  reqData;
   3.127  
   3.128     reqData.reqType    = submit_task;
   3.129     
   3.130 @@ -175,13 +201,14 @@
   3.131        //Create task is a special form, so have to pass as parameters, the
   3.132        // top-level-fn of task and the data for that fn, plus lang's req,
   3.133        // animating slave, and lang's magic number
   3.134 -   PR_WL__send_create_task_req( taskType->fn, args, &reqData, NO_ID, animSlv, VSs_MAGIC_NUMBER );
   3.135 +   PR_WL__send_create_task_req( taskType->fn, args, &reqData, NO_ID,
   3.136 +                                &handleSubmitTask, animSlv, VSs_MAGIC_NUMBER );
   3.137   }
   3.138  
   3.139  void
   3.140  VSs__submit_task_with_ID( VSsTaskType *taskType, void *args, int32 *taskID, 
   3.141 -                          SlaveVP     *animSlv)
   3.142 - { VSsSemReq  reqData;
   3.143 +                          SlaveVP     *animSlv )
   3.144 + { VSsLangReq  reqData;
   3.145   
   3.146     reqData.reqType    = submit_task;
   3.147     
   3.148 @@ -189,7 +216,8 @@
   3.149     reqData.args       = args;
   3.150     reqData.callingSlv = animSlv;
   3.151   
   3.152 -   PR_WL__send_create_task_req( taskType->fn, args, &reqData, taskID, animSlv, VSs_MAGIC_NUMBER );
   3.153 +   PR_WL__send_create_task_req( taskType->fn, args, &reqData, taskID,
   3.154 +                                &handleSubmitTask, animSlv, VSs_MAGIC_NUMBER );
   3.155   }
   3.156  
   3.157  
   3.158 @@ -212,12 +240,10 @@
   3.159   */
   3.160  void
   3.161  VSs__end_task( SlaveVP *animSlv )
   3.162 - { VSsSemReq  reqData;
   3.163 -
   3.164 -   reqData.reqType      = end_task;
   3.165 -   reqData.callingSlv   = animSlv;
   3.166 + { VSsLangReq  reqData;
   3.167     
   3.168 -   PR_WL__send_end_task_request( &reqData, animSlv, VSs_MAGIC_NUMBER );
   3.169 +   //VSs has nothing extra to communicate to end task handler, so lang req is NULL
   3.170 +   PR_WL__send_end_task_request( NULL, &handleEndTask, animSlv, VSs_MAGIC_NUMBER );
   3.171   }
   3.172  
   3.173  
   3.174 @@ -227,12 +253,12 @@
   3.175  void
   3.176  VSs__taskwait(SlaveVP *animSlv)
   3.177   {
   3.178 -    VSsSemReq  reqData;
   3.179 +    VSsLangReq  reqData;
   3.180  
   3.181     reqData.reqType      = taskwait;
   3.182     reqData.callingSlv   = animSlv;
   3.183     
   3.184 -   PR_WL__send_sem_request( &reqData, animSlv, VSs_MAGIC_NUMBER );
   3.185 +   PR_WL__send_lang_request( &reqData, &handleTaskwait, animSlv, VSs_MAGIC_NUMBER );
   3.186   }
   3.187  
   3.188  
   3.189 @@ -243,7 +269,7 @@
   3.190  inline int32 *
   3.191  VSs__give_self_taskID( SlaveVP *animSlv )
   3.192   {
   3.193 -   return PR__give_task_ID( animSlv, VSs_MAGIC_NUMBER );
   3.194 +   return PR__give_ID_from_slave( animSlv, VSs_MAGIC_NUMBER );
   3.195   }
   3.196  
   3.197  //================================ send ===================================
   3.198 @@ -251,7 +277,7 @@
   3.199  void
   3.200  VSs__send_of_type_to( void *msg, const int32 type, int32 *receiverID,
   3.201                        SlaveVP *senderSlv )
   3.202 - { VSsSemReq  reqData;
   3.203 + { VSsLangReq  reqData;
   3.204  
   3.205     reqData.reqType    = send_type_to;
   3.206     
   3.207 @@ -262,14 +288,14 @@
   3.208     
   3.209     reqData.nextReqInHashEntry = NULL;
   3.210  
   3.211 -   PR_WL__send_sem_request( &reqData, senderSlv, VSs_MAGIC_NUMBER );
   3.212 +   PR_WL__send_lang_request( &reqData, &handleSendTypeTo, senderSlv, VSs_MAGIC_NUMBER );
   3.213  
   3.214        //When come back from suspend, no longer own data reachable from msg
   3.215   }
   3.216  
   3.217  void
   3.218  VSs__send_from_to( void *msg, int32 *senderID, int32 *receiverID, SlaveVP *senderSlv )
   3.219 - { VSsSemReq  reqData;
   3.220 + { VSsLangReq  reqData;
   3.221  
   3.222     reqData.reqType     = send_from_to;
   3.223     
   3.224 @@ -280,7 +306,7 @@
   3.225  
   3.226     reqData.nextReqInHashEntry = NULL;
   3.227  
   3.228 -   PR_WL__send_sem_request( &reqData, senderSlv, VSs_MAGIC_NUMBER );
   3.229 +   PR_WL__send_lang_request( &reqData, &handleSendFromTo, senderSlv, VSs_MAGIC_NUMBER );
   3.230   }
   3.231  
   3.232  
   3.233 @@ -295,7 +321,7 @@
   3.234  void *
   3.235  VSs__receive_type_to( const int32 type, int32* receiverID, SlaveVP *receiverSlv )
   3.236   {       DEBUG__printf1(dbgRqstHdlr,"WL: receive type to %d",receiverID[1] );
   3.237 -   VSsSemReq  reqData;
   3.238 +   VSsLangReq  reqData;
   3.239  
   3.240     reqData.reqType     = receive_type_to;
   3.241     
   3.242 @@ -305,7 +331,7 @@
   3.243     
   3.244     reqData.nextReqInHashEntry = NULL;
   3.245  
   3.246 -   PR_WL__send_sem_request( &reqData, receiverSlv, VSs_MAGIC_NUMBER );
   3.247 +   PR_WL__send_lang_request( &reqData, &handleReceiveTypeTo, receiverSlv, VSs_MAGIC_NUMBER );
   3.248     
   3.249     return receiverSlv->dataRetFromReq;
   3.250   }
   3.251 @@ -319,7 +345,7 @@
   3.252  void *
   3.253  VSs__receive_from_to( int32 *senderID, int32 *receiverID, SlaveVP *receiverSlv )
   3.254   { 
   3.255 -   VSsSemReq  reqData;
   3.256 +   VSsLangReq  reqData;
   3.257  
   3.258     reqData.reqType     = receive_from_to;
   3.259  
   3.260 @@ -330,7 +356,7 @@
   3.261     reqData.nextReqInHashEntry = NULL;
   3.262        DEBUG__printf2(dbgRqstHdlr,"WL: receive from %d to: %d", reqData.senderID[1], reqData.receiverID[1]);
   3.263        
   3.264 -   PR_WL__send_sem_request( &reqData, receiverSlv, VSs_MAGIC_NUMBER );
   3.265 +   PR_WL__send_lang_request( &reqData, &handleReceiveFromTo, receiverSlv, VSs_MAGIC_NUMBER );
   3.266  
   3.267     return receiverSlv->dataRetFromReq;
   3.268   }
   3.269 @@ -355,22 +381,23 @@
   3.270  void asm_write_ret_from_singleton(VSsSingleton *singletonPtrAddr);
   3.271  
   3.272  /*Fn singleton uses ID as index into array of singleton structs held in the
   3.273 - * semantic environment.
   3.274 + * language environment.
   3.275   */
   3.276  void
   3.277  VSs__start_fn_singleton( int32 singletonID,   SlaveVP *animSlv )
   3.278   {
   3.279 -   VSsSemReq  reqData;
   3.280 +   VSsLangReq  reqData;
   3.281  
   3.282        //
   3.283     reqData.reqType     = singleton_fn_start;
   3.284     reqData.singletonID = singletonID;
   3.285  
   3.286 -   PR_WL__send_sem_request( &reqData, animSlv, VSs_MAGIC_NUMBER );
   3.287 +   PR_WL__send_lang_request( &reqData, &handleStartFnSingleton, animSlv, VSs_MAGIC_NUMBER );
   3.288     if( animSlv->dataRetFromReq ) //will be 0 or addr of label in end singleton
   3.289      {
   3.290 -       VSsSemEnv *semEnv = PR_WL__give_sem_env_for( animSlv, VSs_MAGIC_NUMBER );
   3.291 -       asm_write_ret_from_singleton(&(semEnv->fnSingletons[ singletonID]));
   3.292 +      VSsLangEnv *langEnv =
   3.293 +              PR_int__give_lang_env_for_slave__ML( animSlv, VSs_MAGIC_NUMBER );
   3.294 +      asm_write_ret_from_singleton(&(langEnv->fnSingletons[ singletonID]));
   3.295      }
   3.296   }
   3.297  
   3.298 @@ -381,7 +408,7 @@
   3.299  void
   3.300  VSs__start_data_singleton( VSsSingleton **singletonAddr,  SlaveVP *animSlv )
   3.301   {
   3.302 -   VSsSemReq  reqData;
   3.303 +   VSsLangReq  reqData;
   3.304  
   3.305     if( *singletonAddr && (*singletonAddr)->hasFinished )
   3.306         goto JmpToEndSingleton;
   3.307 @@ -389,7 +416,7 @@
   3.308     reqData.reqType          = singleton_data_start;
   3.309     reqData.singletonPtrAddr = singletonAddr;
   3.310  
   3.311 -   PR_WL__send_sem_request( &reqData, animSlv, VSs_MAGIC_NUMBER );
   3.312 +   PR_WL__send_lang_request( &reqData, &handleStartDataSingleton, animSlv, VSs_MAGIC_NUMBER );
   3.313     if( animSlv->dataRetFromReq ) //either 0 or end singleton's return addr
   3.314      {    //Assembly code changes the return addr on the stack to the one
   3.315           // saved into the singleton by the end-singleton-fn
   3.316 @@ -410,17 +437,19 @@
   3.317  void
   3.318  VSs__end_fn_singleton( int32 singletonID, SlaveVP *animSlv )
   3.319   {
   3.320 -   VSsSemReq  reqData;
   3.321 +   VSsLangReq  reqData;
   3.322  
   3.323        //don't need this addr until after at least one singleton has reached
   3.324        // this function
   3.325 -   VSsSemEnv *semEnv = PR_WL__give_sem_env_for( animSlv, VSs_MAGIC_NUMBER );
   3.326 -   asm_write_ret_from_singleton(&(semEnv->fnSingletons[ singletonID]));
   3.327 +   VSsLangEnv *
   3.328 +   langEnv = PR_int__give_lang_env_for_slave__ML( animSlv, VSs_MAGIC_NUMBER );
   3.329 +   
   3.330 +   asm_write_ret_from_singleton(&(langEnv->fnSingletons[ singletonID]));
   3.331  
   3.332     reqData.reqType     = singleton_fn_end;
   3.333     reqData.singletonID = singletonID;
   3.334  
   3.335 -   PR_WL__send_sem_request( &reqData, animSlv, VSs_MAGIC_NUMBER );
   3.336 +   PR_WL__send_lang_request( &reqData, &handleEndFnSingleton, animSlv, VSs_MAGIC_NUMBER );
   3.337  
   3.338  EndSingletonInstrAddr:
   3.339     return;
   3.340 @@ -429,7 +458,7 @@
   3.341  void
   3.342  VSs__end_data_singleton(  VSsSingleton **singletonPtrAddr, SlaveVP *animSlv )
   3.343   {
   3.344 -   VSsSemReq  reqData;
   3.345 +   VSsLangReq  reqData;
   3.346  
   3.347        //don't need this addr until after singleton struct has reached
   3.348        // this function for first time
   3.349 @@ -442,7 +471,7 @@
   3.350     reqData.reqType          = singleton_data_end;
   3.351     reqData.singletonPtrAddr = singletonPtrAddr;
   3.352  
   3.353 -   PR_WL__send_sem_request( &reqData, animSlv, VSs_MAGIC_NUMBER );
   3.354 +   PR_WL__send_lang_request( &reqData, &handleEndDataSingleton, animSlv, VSs_MAGIC_NUMBER );
   3.355   }
   3.356  
   3.357  /*This executes the function in the masterVP, so it executes in isolation
   3.358 @@ -459,14 +488,14 @@
   3.359  VSs__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
   3.360                                      void *data, SlaveVP *animSlv )
   3.361   {
   3.362 -   VSsSemReq  reqData;
   3.363 +   VSsLangReq  reqData;
   3.364  
   3.365        //
   3.366     reqData.reqType          = atomic;
   3.367     reqData.fnToExecInMaster = ptrToFnToExecInMaster;
   3.368     reqData.dataForFn        = data;
   3.369  
   3.370 -   PR_WL__send_sem_request( &reqData, animSlv, VSs_MAGIC_NUMBER );
   3.371 +   PR_WL__send_lang_request( &reqData, &handleAtomic, animSlv, VSs_MAGIC_NUMBER );
   3.372   }
   3.373  
   3.374  
   3.375 @@ -486,14 +515,14 @@
   3.376  void
   3.377  VSs__start_transaction( int32 transactionID, SlaveVP *animSlv )
   3.378   {
   3.379 -   VSsSemReq  reqData;
   3.380 +   VSsLangReq  reqData;
   3.381  
   3.382        //
   3.383     reqData.callingSlv  = animSlv;
   3.384     reqData.reqType     = trans_start;
   3.385     reqData.transID     = transactionID;
   3.386  
   3.387 -   PR_WL__send_sem_request( &reqData, animSlv, VSs_MAGIC_NUMBER );
   3.388 +   PR_WL__send_lang_request( &reqData, &handleTransStart, animSlv, VSs_MAGIC_NUMBER );
   3.389   }
   3.390  
   3.391  /*This suspends to the master, then uses transactionID as index into an
   3.392 @@ -508,36 +537,15 @@
   3.393  void
   3.394  VSs__end_transaction( int32 transactionID, SlaveVP *animSlv )
   3.395   {
   3.396 -   VSsSemReq  reqData;
   3.397 +   VSsLangReq  reqData;
   3.398  
   3.399        //
   3.400     reqData.callingSlv      = animSlv;
   3.401     reqData.reqType     = trans_end;
   3.402     reqData.transID     = transactionID;
   3.403  
   3.404 -   PR_WL__send_sem_request( &reqData, animSlv, VSs_MAGIC_NUMBER );
   3.405 +   PR_WL__send_lang_request( &reqData, &handleTransEnd, animSlv, VSs_MAGIC_NUMBER );
   3.406   }
   3.407  
   3.408  //======================== Internal ==================================
   3.409 -/*
   3.410 - */
   3.411  
   3.412 -SlaveVP *
   3.413 -VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData,
   3.414 -                        SlaveVP *creatingSlv,  int32  coreToAssignOnto )
   3.415 - { VSsSemReq  reqData;
   3.416 -
   3.417 -      //the semantic request data is on the stack and disappears when this
   3.418 -      // call returns -- it's guaranteed to remain in the VP's stack for as
   3.419 -      // long as the VP is suspended.
   3.420 -   reqData.reqType            = create_slave_w_aff; //not used, May 2012
   3.421 -   reqData.coreToAssignOnto   = coreToAssignOnto;
   3.422 -   reqData.fnPtr              = fnPtr;
   3.423 -   reqData.initData           = initData;
   3.424 -   reqData.callingSlv         = creatingSlv;
   3.425 -
   3.426 -   PR_WL__send_create_slaveVP_req( &reqData, creatingSlv, VSs_MAGIC_NUMBER );
   3.427 -
   3.428 -   return creatingSlv->dataRetFromReq;
   3.429 - }
   3.430 -
     4.1 --- a/VSs.h	Thu Oct 18 02:44:30 2012 -0700
     4.2 +++ b/VSs.h	Sat Jan 12 11:31:51 2013 -0800
     4.3 @@ -1,5 +1,5 @@
     4.4  /*
     4.5 - *  Copyright 2009 OpenSourceStewardshipFoundation.org
     4.6 + *  Copyright 2009 OpenSourceResearchInstitute.org
     4.7   *  Licensed under GNU General Public License version 2
     4.8   *
     4.9   * Author: seanhalle@yahoo.com
    4.10 @@ -19,7 +19,7 @@
    4.11     //uniquely identifies VSs -- should be a jenkins char-hash of "VSs" to int32
    4.12  #define VSs_MAGIC_NUMBER 0000000001
    4.13  
    4.14 -#define NUM_STRUCS_IN_SEM_ENV 1000
    4.15 +#define NUM_STRUCS_IN_LANG_ENV 1000
    4.16  
    4.17     //This is hardware dependent -- it's the number of cycles of scheduling
    4.18     // overhead -- if a work unit is fewer than this, it is better being
    4.19 @@ -31,7 +31,7 @@
    4.20  //===========================================================================
    4.21  /*This header defines everything specific to the VSs semantic plug-in
    4.22   */
    4.23 -typedef struct _VSsSemReq    VSsSemReq;
    4.24 +typedef struct _VSsLangReq    VSsLangReq;
    4.25  typedef struct _VSsTaskStub  VSsTaskStub;
    4.26  typedef void  (*VSsTaskFnPtr )   ( void *, SlaveVP *);
    4.27  typedef void  (*PtrToAtomicFn )  ( void * ); //executed atomically in master
    4.28 @@ -73,11 +73,13 @@
    4.29   }
    4.30  VSsPointerEntry;
    4.31  
    4.32 -/*This is placed into semData, used for dependencies and wait construct*/
    4.33 +/*This is placed into langData, used for dependencies and wait construct*/
    4.34  struct _VSsTaskStub
    4.35   {
    4.36 + //====== The first fields must match PRLangMetaTask fields ======
    4.37     int32             langMagicNumber; //magic num must be 1st field of langMetaTask
    4.38     PRMetaTask       *protoMetaTask;   //back-link must always be 2nd field
    4.39 + //====== end PRLangMetaTask fields =========
    4.40     void            **args;            //ctld args must be the first ones (as ptrs)
    4.41     VSsPointerEntry **ptrEntries;
    4.42     int32             numBlockingProp;
    4.43 @@ -149,7 +151,7 @@
    4.44     trans_end
    4.45   };
    4.46  
    4.47 -struct _VSsSemReq
    4.48 +struct _VSsLangReq
    4.49   { enum VSsReqType    reqType;
    4.50     SlaveVP           *callingSlv;
    4.51     VSsTaskType       *taskType;
    4.52 @@ -162,7 +164,7 @@
    4.53     int32             *receiverID;
    4.54     int32              msgType;
    4.55     void              *msg;
    4.56 -   VSsSemReq         *nextReqInHashEntry;
    4.57 +   VSsLangReq         *nextReqInHashEntry;
    4.58  //In PRReq:   int32             *taskID;
    4.59     
    4.60     TopLevelFnPtr      fnPtr;
    4.61 @@ -181,31 +183,22 @@
    4.62  
    4.63     int32              transID;
    4.64   }
    4.65 -/* VSsSemReq */;
    4.66 +/* VSsLangReq */;
    4.67  
    4.68  
    4.69  typedef struct
    4.70 - { PRSemEnv        *protoSemEnv;
    4.71 + { 
    4.72     PrivQueueStruc  *slavesReadyToResumeQ; //Shared (slaves not pinned)
    4.73 -   PrivQueueStruc  *freeTaskSlvRecycleQ;    //Shared
    4.74     PrivQueueStruc  *taskReadyQ;           //Shared (tasks not pinned)
    4.75 -//   SlaveVP         *slotTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS];
    4.76 +   
    4.77     HashTable       *argPtrHashTbl;
    4.78     HashTable       *commHashTbl;
    4.79 -//   int32            numLiveFreeTaskSlvs;
    4.80 -//   int32            numLiveThreadSlvs;
    4.81     int32            nextCoreToGetNewSlv;
    4.82     int32            primitiveStartTime;
    4.83  
    4.84                         //fix limit on num with dynArray
    4.85 -   VSsSingleton     fnSingletons[NUM_STRUCS_IN_SEM_ENV];
    4.86 -   VSsTrans         transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
    4.87 -
    4.88 -//   bool32          *coreIsDone;
    4.89 -//   int32            numCoresDone;
    4.90 -   
    4.91 -//   SlaveVP* idleSlv[NUM_CORES][NUM_ANIM_SLOTS];
    4.92 -//   int shutdownInitiated;
    4.93 +   VSsSingleton     fnSingletons[NUM_STRUCS_IN_LANG_ENV];
    4.94 +   VSsTrans         transactionStrucs[NUM_STRUCS_IN_LANG_ENV];
    4.95     
    4.96     #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
    4.97     ListOfArrays* unitList;
    4.98 @@ -222,7 +215,7 @@
    4.99     ListOfArrays* counterList[NUM_CORES];
   4.100     #endif
   4.101   }
   4.102 -VSsSemEnv;
   4.103 +VSsLangEnv;
   4.104  
   4.105  
   4.106  typedef struct _TransListElem TransListElem;
   4.107 @@ -248,7 +241,7 @@
   4.108     int32            primitiveStartTime;
   4.109  //   VSsTaskStub     *taskStub; //get from slave via PR accessor
   4.110   }
   4.111 -VSsSemData;
   4.112 +VSsLangData;
   4.113   
   4.114  //===========================================================================
   4.115  
   4.116 @@ -355,18 +348,14 @@
   4.117  
   4.118  //=========================  Internal use only  =============================
   4.119  void
   4.120 -VSs__Request_Handler( SlaveVP *requestingSlv, void *_semEnv );
   4.121 +VSs__Request_Handler( SlaveVP *requestingSlv, void *_langEnv );
   4.122  
   4.123  SlaveVP *
   4.124 -VSs__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot );
   4.125 +VSs__assign_work_to_slot( void *_langEnv, AnimSlot *slot );
   4.126  
   4.127  SlaveVP*
   4.128  VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData,
   4.129 -                          VSsSemEnv *semEnv,    int32 coreToAssignOnto );
   4.130 -
   4.131 -PRMetaTask *
   4.132 -PR_int__create_generic_slave_meta_task( void *initData );
   4.133 -
   4.134 +                          VSsLangEnv *langEnv,    int32 coreToAssignOnto );
   4.135  
   4.136  SlaveVP *
   4.137  VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData,
   4.138 @@ -376,6 +365,15 @@
   4.139  VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr,    void *initData,
   4.140                              SlaveVP *creatingSlv, int32 coreToAssignOnto);
   4.141  
   4.142 +//=====================    =====================
   4.143 +inline 
   4.144 +void *
   4.145 +handleSubmitTask( VSsLangReq *langReq, VSsLangEnv *langEnv );
   4.146 +inline 
   4.147 +void
   4.148 +handleEndTask( VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv );
   4.149 +
   4.150 +
   4.151  //=====================  Measurement of Lang Overheads  =====================
   4.152  #include "Measurement/VSs_Measurement.h"
   4.153  
     5.1 --- a/VSs_PluginFns.c	Thu Oct 18 02:44:30 2012 -0700
     5.2 +++ b/VSs_PluginFns.c	Sat Jan 12 11:31:51 2013 -0800
     5.3 @@ -13,16 +13,16 @@
     5.4  
     5.5  //=========================== Local Fn Prototypes ===========================
     5.6  void
     5.7 -resume_slaveVP( SlaveVP *slave, VSsSemEnv *semEnv );
     5.8 +resume_slaveVP( SlaveVP *slave, VSsLangEnv *langEnv );
     5.9  
    5.10  inline void
    5.11 -handleSemReq( PRReqst *req, SlaveVP *requestingSlv, VSsSemEnv *semEnv );
    5.12 +handleLangReq( PRReqst *req, SlaveVP *requestingSlv, VSsLangEnv *langEnv );
    5.13  
    5.14  inline void
    5.15 -handleDissipate(                SlaveVP *requestingSlv, VSsSemEnv *semEnv );
    5.16 +handleDissipate(                SlaveVP *requestingSlv, VSsLangEnv *langEnv );
    5.17  
    5.18  inline void
    5.19 -handleCreate(    PRReqst *req, SlaveVP *requestingSlv, VSsSemEnv *semEnv );
    5.20 +handleCreate(    PRReqst *req, SlaveVP *requestingSlv, VSsLangEnv *langEnv );
    5.21  
    5.22  //============================== Assigner ==================================
    5.23  //
    5.24 @@ -52,28 +52,31 @@
    5.25   * the junk tasks are allowed to leave behind.
    5.26   */
    5.27  SlaveVP *
    5.28 -VSs__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot )
    5.29 +VSs__assign_work_to_slot( void *_langEnv, AnimSlot *slot )
    5.30   { SlaveVP     *returnSlv;
    5.31 -   VSsSemEnv   *semEnv;
    5.32 +   VSsLangEnv  *langEnv;
    5.33     int32        coreNum, slotNum;
    5.34 -   PRMetaTask  *returnMetaTask = NULL, *newTaskStub;
    5.35 +   PRMetaTask  *returnMetaTask = NULL;
    5.36 +   VSsTaskStub *newTaskStub;
    5.37    
    5.38     coreNum = slot->coreSlotIsOn;
    5.39     slotNum = slot->slotIdx;
    5.40     
    5.41 -   semEnv  = (VSsSemEnv *)_semEnv;
    5.42 +   langEnv = (VSsLangEnv *)_langEnv;
    5.43     
    5.44        //Check for suspended slaves that are ready to resume
    5.45 -   returnSlv = readPrivQ( semEnv->slavesReadyToResumeQ );
    5.46 +   returnSlv = readPrivQ( langEnv->slavesReadyToResumeQ );
    5.47     if( returnSlv != NULL )  //Yes, have a slave, so return it.
    5.48      { returnSlv->coreAnimatedBy   = coreNum;
    5.49 -      returnMetaTask = returnSlv->metaTask;
    5.50 +      //returnMetaTask = returnSlv->metaTask;
    5.51 +      fixme; //use PR_int__put_slave_into_slot( SlaveVP *slave, AnimSlot *slot )
    5.52        goto ReturnTheMetaTask;
    5.53      }
    5.54     
    5.55 -   newTaskStub = readPrivQ( semEnv->taskReadyQ );
    5.56 +   newTaskStub = readPrivQ( langEnv->taskReadyQ );
    5.57     if( newTaskStub != NULL )
    5.58 -    { returnMetaTask = newTaskStub->protoMetaTask;
    5.59 +    { //returnMetaTask = newTaskStub->protoMetaTask;
    5.60 +      fixme; //use PR_int__put_task_into_slot( SlaveVP *slave, AnimSlot *slot )    
    5.61        goto ReturnTheMetaTask;
    5.62      }
    5.63  
    5.64 @@ -84,44 +87,48 @@
    5.65     //This assumes the task has already been assigned to a slave, which happens
    5.66     // inside Master..
    5.67     if( returnMetaTask == NULL )
    5.68 -    { returnSlv = semEnv->process->idleSlv[coreNum][slotNum]; 
    5.69 +    { returnSlv = langEnv->process->idleSlv[coreNum][slotNum]; 
    5.70      
    5.71           //things that would normally happen in resume(), but these VPs
    5.72           // never go there
    5.73        returnSlv->numTimesAssignedToASlot++;
    5.74        Unit newU;
    5.75 -      newU.vp = returnSlv->slaveID;
    5.76 +      newU.vp = returnSlv->slaveNum;
    5.77        newU.task = returnSlv->numTimesAssignedToASlot;
    5.78 -      addToListOfArrays(Unit,newU,semEnv->unitList);
    5.79 +      addToListOfArrays(Unit,newU,langEnv->unitList);
    5.80  
    5.81        if (returnSlv->numTimesAssignedToASlot > 1)
    5.82         { Dependency newD;
    5.83 -         newD.from_vp = returnSlv->slaveID;
    5.84 +         newD.from_vp = returnSlv->slaveNum;
    5.85           newD.from_task = returnSlv->numTimesAssignedToASlot - 1;
    5.86 -         newD.to_vp = returnSlv->slaveID;
    5.87 +         newD.to_vp = returnSlv->slaveNum;
    5.88           newD.to_task = returnSlv->numTimesAssignedToASlot;
    5.89 -         addToListOfArrays(Dependency, newD, semEnv->ctlDependenciesList);  
    5.90 +         addToListOfArrays(Dependency, newD, langEnv->ctlDependenciesList);  
    5.91         }
    5.92        returnMetaTask = returnSlv->metaTask;
    5.93      }
    5.94     else //returnSlv != NULL
    5.95      { //assignSlv->numTimesAssigned++;
    5.96        Unit prev_in_slot = 
    5.97 -         semEnv->last_in_slot[coreNum * NUM_ANIM_SLOTS + slotNum];
    5.98 +         langEnv->last_in_slot[coreNum * NUM_ANIM_SLOTS + slotNum];
    5.99        if(prev_in_slot.vp != 0)
   5.100         { Dependency newD;
   5.101           newD.from_vp = prev_in_slot.vp;
   5.102           newD.from_task = prev_in_slot.task;
   5.103 -         newD.to_vp = returnSlv->slaveID;
   5.104 +         newD.to_vp = returnSlv->slaveNum;
   5.105           newD.to_task = returnSlv->numTimesAssignedToASlot;
   5.106 -         addToListOfArrays(Dependency,newD,semEnv->hwArcs);   
   5.107 +         addToListOfArrays(Dependency,newD,langEnv->hwArcs);   
   5.108         }
   5.109 -      prev_in_slot.vp = returnSlv->slaveID;
   5.110 +      prev_in_slot.vp = returnSlv->slaveNum;
   5.111        prev_in_slot.task = returnSlv->numTimesAssignedToASlot;
   5.112 -      semEnv->last_in_slot[coreNum * NUM_ANIM_SLOTS + slotNum] =
   5.113 +      langEnv->last_in_slot[coreNum * NUM_ANIM_SLOTS + slotNum] =
   5.114           prev_in_slot;        
   5.115      }
   5.116     #endif
   5.117 +   if( isEmptyPrivQ(langEnv->slavesReadyToResumeQ) &&
   5.118 +       isEmptyPrivQ(langEnv->taskReadyQ) ) 
   5.119 +      PR_int__clear_work_in_lang_env(langEnv);
   5.120 +      
   5.121     return( returnMetaTask );
   5.122   }
   5.123  
   5.124 @@ -133,42 +140,43 @@
   5.125   */
   5.126  
   5.127  void
   5.128 -handleSemReq( PRReqst *req, SlaveVP *reqSlv, VSsSemEnv *semEnv )
   5.129 - { VSsSemReq *semReq;
   5.130 +handleLangReq( void *_langReq, SlaveVP *reqSlv, VSsLangEnv *langEnv )
   5.131 + { VSsLangReq *langReq;
   5.132  
   5.133 -   semReq = PR_PI__take_sem_reqst_from(req);
   5.134 -   if( semReq == NULL ) return;
   5.135 -   switch( semReq->reqType )  //sem handlers are all in other file
   5.136 +   langReq = (VSsLangReq *)_langReq;
   5.137 +   if( langReq == NULL ) return;
   5.138 +   
   5.139 +   switch( langReq->reqType )  //lang handlers are all in other file
   5.140      {
   5.141 -      case send_type_to:    handleSendTypeTo(   semReq,         semEnv);
   5.142 +      case send_type_to:    handleSendTypeTo(   langReq,         langEnv);
   5.143           break;
   5.144 -      case send_from_to:    handleSendFromTo(   semReq,         semEnv);
   5.145 +      case send_from_to:    handleSendFromTo(   langReq,         langEnv);
   5.146           break;
   5.147 -      case receive_type_to: handleReceiveTypeTo(semReq,         semEnv);
   5.148 +      case receive_type_to: handleReceiveTypeTo(langReq,         langEnv);
   5.149           break;
   5.150 -      case receive_from_to: handleReceiveFromTo(semReq,         semEnv);
   5.151 +      case receive_from_to: handleReceiveFromTo(langReq,         langEnv);
   5.152           break;
   5.153 -      case taskwait:        handleTaskwait(     semReq, reqSlv, semEnv);
   5.154 +      case taskwait:        handleTaskwait(     langReq, reqSlv, langEnv);
   5.155             break;
   5.156           
   5.157        //====================================================================
   5.158 -      case malloc_req:      handleMalloc(       semReq, reqSlv, semEnv);
   5.159 +      case malloc_req:      handleMalloc(       langReq, reqSlv, langEnv);
   5.160           break;
   5.161 -      case free_req:        handleFree(         semReq, reqSlv, semEnv);
   5.162 +      case free_req:        handleFree(         langReq, reqSlv, langEnv);
   5.163           break;
   5.164 -      case singleton_fn_start:  handleStartFnSingleton(semReq, reqSlv, semEnv);
   5.165 +      case singleton_fn_start:  handleStartFnSingleton(langReq, reqSlv, langEnv);
   5.166           break;
   5.167 -      case singleton_fn_end:    handleEndFnSingleton(  semReq, reqSlv, semEnv);
   5.168 +      case singleton_fn_end:    handleEndFnSingleton(  langReq, reqSlv, langEnv);
   5.169           break;
   5.170 -      case singleton_data_start:handleStartDataSingleton(semReq,reqSlv,semEnv);
   5.171 +      case singleton_data_start:handleStartDataSingleton(langReq,reqSlv,langEnv);
   5.172           break;
   5.173 -      case singleton_data_end:  handleEndDataSingleton(semReq, reqSlv, semEnv);
   5.174 +      case singleton_data_end:  handleEndDataSingleton(langReq, reqSlv, langEnv);
   5.175           break;
   5.176 -      case atomic:          handleAtomic(       semReq, reqSlv, semEnv);
   5.177 +      case atomic:          handleAtomic(       langReq, reqSlv, langEnv);
   5.178           break;
   5.179 -      case trans_start:     handleTransStart(   semReq, reqSlv, semEnv);
   5.180 +      case trans_start:     handleTransStart(   langReq, reqSlv, langEnv);
   5.181           break;
   5.182 -      case trans_end:       handleTransEnd(     semReq, reqSlv, semEnv);
   5.183 +      case trans_end:       handleTransEnd(     langReq, reqSlv, langEnv);
   5.184           break;
   5.185      }
   5.186   }
   5.187 @@ -178,12 +186,11 @@
   5.188  
   5.189  //=========================== Helper ==============================
   5.190  void
   5.191 -resume_slaveVP( SlaveVP *slave, VSsSemEnv *semEnv )
   5.192 +resume_slaveVP( SlaveVP *slave, VSsLangEnv *langEnv )
   5.193   {
   5.194        //both suspended tasks and suspended explicit slaves resumed with this
   5.195 -   writePrivQ( slave, semEnv->slavesReadyToResumeQ );
   5.196 -   if( semEnv->protoSemEnv->hasWork != TRUE ) 
   5.197 -       semEnv->protoSemEnv->hasWork = TRUE;
   5.198 +   writePrivQ( slave, langEnv->slavesReadyToResumeQ );
   5.199 +   PR_int__set_work_in_lang_env(langEnv);
   5.200     
   5.201     #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
   5.202  /*
   5.203 @@ -195,17 +202,17 @@
   5.204     #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
   5.205     slave->numTimesAssignedToASlot++; //Somewhere here!
   5.206     Unit newU;
   5.207 -   newU.vp = slave->slaveID;
   5.208 +   newU.vp = slave->slaveNum;
   5.209     newU.task = slave->numTimesAssignedToASlot;
   5.210 -   addToListOfArrays(Unit,newU,semEnv->unitList);
   5.211 +   addToListOfArrays(Unit,newU,langEnv->unitList);
   5.212     
   5.213     if (slave->numTimesAssignedToASlot > 1)
   5.214      { Dependency newD;
   5.215 -      newD.from_vp = slave->slaveID;
   5.216 +      newD.from_vp = slave->slaveNum;
   5.217        newD.from_task = slave->numTimesAssignedToASlot - 1;
   5.218 -      newD.to_vp = slave->slaveID;
   5.219 +      newD.to_vp = slave->slaveNum;
   5.220        newD.to_task = slave->numTimesAssignedToASlot;
   5.221 -      addToListOfArrays(Dependency, newD ,semEnv->ctlDependenciesList);  
   5.222 +      addToListOfArrays(Dependency, newD ,langEnv->ctlDependenciesList);  
   5.223      }
   5.224     #endif
   5.225   }
     6.1 --- a/VSs_Request_Handlers.c	Thu Oct 18 02:44:30 2012 -0700
     6.2 +++ b/VSs_Request_Handlers.c	Sat Jan 12 11:31:51 2013 -0800
     6.3 @@ -18,7 +18,7 @@
     6.4  
     6.5  //=========================== Local Fn Prototypes ===========================
     6.6  void
     6.7 -resume_slaveVP( SlaveVP *slave, VSsSemEnv *semEnv );
     6.8 +resume_slaveVP( SlaveVP *slave, VSsLangEnv *langEnv );
     6.9  
    6.10  
    6.11  
    6.12 @@ -28,15 +28,15 @@
    6.13  
    6.14  /*Only clone the elements of req used in these reqst handlers
    6.15   */
    6.16 -VSsSemReq *
    6.17 -cloneReq( VSsSemReq *semReq )
    6.18 - { VSsSemReq *clonedReq;
    6.19 +VSsLangReq *
    6.20 +cloneReq( VSsLangReq *langReq )
    6.21 + { VSsLangReq *clonedReq;
    6.22  
    6.23 -   clonedReq             = PR_PI__malloc( sizeof(VSsSemReq) );
    6.24 -   clonedReq->reqType    = semReq->reqType;
    6.25 -   clonedReq->senderSlv  = semReq->senderSlv;
    6.26 -   clonedReq->receiverSlv= semReq->receiverSlv;
    6.27 -   clonedReq->msg        = semReq->msg;
    6.28 +   clonedReq             = PR_PI__malloc( sizeof(VSsLangReq) );
    6.29 +   clonedReq->reqType    = langReq->reqType;
    6.30 +   clonedReq->senderSlv  = langReq->senderSlv;
    6.31 +   clonedReq->receiverSlv= langReq->receiverSlv;
    6.32 +   clonedReq->msg        = langReq->msg;
    6.33     clonedReq->nextReqInHashEntry = NULL;
    6.34     
    6.35     return clonedReq;
    6.36 @@ -45,29 +45,30 @@
    6.37  
    6.38  
    6.39  HashEntry *
    6.40 -giveEntryElseInsertReqst32( int32 *key, VSsSemReq *semReq,
    6.41 +giveEntryElseInsertReqst32( int32 *key, VSsLangReq *langReq,
    6.42                              HashTable   *commHashTbl )
    6.43   { HashEntry    *entry;
    6.44 -   VSsSemReq    *waitingReq;
    6.45 +   VSsLangReq    *waitingReq;
    6.46  
    6.47     entry = getEntryFromTable32( key, commHashTbl );
    6.48     if( entry == NULL )
    6.49      {    //no waiting sends or receives, so add this request and exit
    6.50           // note: have to clone the request because it's on stack of sender
    6.51 -      addValueIntoTable32( key, cloneReq( semReq ), commHashTbl );
    6.52 +      addValueIntoTable32( key, cloneReq( langReq ), commHashTbl );
    6.53        return NULL;
    6.54      }
    6.55 -   waitingReq = (VSsSemReq *)entry->content;
    6.56 +   waitingReq = (VSsLangReq *)entry->content;
    6.57     if( waitingReq == NULL )  //might happen when last waiting gets paired
    6.58      {    //no waiting sends or receives, so add this request and exit
    6.59 -      entry->content = semReq;
    6.60 +      entry->content = langReq;
    6.61        return NULL;
    6.62      }
    6.63     return entry;
    6.64   }
    6.65  
    6.66        
    6.67 -inline VSsPointerEntry *
    6.68 +inline 
    6.69 +VSsPointerEntry *
    6.70  create_pointer_entry( )
    6.71   { VSsPointerEntry *newEntry;
    6.72     
    6.73 @@ -82,28 +83,55 @@
    6.74  /*malloc's space and initializes fields -- and COPIES the arg values
    6.75   * to new space
    6.76   */
    6.77 -inline VSsTaskStub *
    6.78 +inline 
    6.79 +VSsTaskStub *
    6.80  create_task_stub( VSsTaskType *taskType, void **args )
    6.81   { void **newArgs;
    6.82 -   VSsTaskStub* newStub = PR_int__malloc( sizeof(PRMetaTask) + taskType->sizeOfArgs );
    6.83 -   newStub->numBlockingProp = taskType->numCtldArgs;
    6.84 -   newStub->taskType   = taskType;
    6.85 +   VSsTaskStub* newStub;
    6.86 +   
    6.87 +      //Create a new task stub, with enough room at end to copy args there
    6.88 +   newStub = (VSsTaskStub *)PR_int__create_lang_meta_task__ML( 
    6.89 +        sizeof(VSsTaskStub) + taskType->sizeOfArgs, VSs_MAGIC_NUMBER );
    6.90 +   
    6.91 +   newStub->numBlockingProp     = taskType->numCtldArgs;
    6.92 +   newStub->taskType            = taskType;
    6.93     newStub->ptrEntries = 
    6.94        PR_int__malloc( taskType->numCtldArgs * sizeof(VSsPointerEntry *) );
    6.95 -   newArgs = (void **)( (uint8 *)newStub + sizeof(PRMetaTask) );
    6.96 -   newStub->args = newArgs;
    6.97 +   
    6.98 +      //Skip over the task stub, to get ptr to space alloc'd for args copy
    6.99 +   newArgs = (void **)( (uint8 *)newStub + sizeof(VSsTaskStub) );
   6.100 +   newStub->args                = newArgs;
   6.101     newStub->numLiveChildTasks   = 0;
   6.102     newStub->numLiveChildThreads = 0;
   6.103 -   newStub->isEnded = FALSE;
   6.104 +   newStub->isEnded             = FALSE;
   6.105     
   6.106 -      //Copy the arg-pointers.. can be more arguments than just the ones 
   6.107 +      //Copy the args.. can be more arguments than just the ones 
   6.108        // that StarSs uses to control ordering of task execution.
   6.109     memcpy( newArgs, args, taskType->sizeOfArgs );
   6.110     
   6.111     return newStub;
   6.112   }
   6.113  
   6.114 -inline VSsTaskStubCarrier *
   6.115 +
   6.116 +VSsTaskStub *
   6.117 +VSs__create_generic_slave_task_stub_in_slave( SlaveVP *slave )
   6.118 + { VSsTaskStub *newStub;
   6.119 + 
   6.120 +   newStub = (VSsTaskStub *)PR_int__create_lang_meta_task_in_slave__ML( 
   6.121 +                                 sizeof(VSsTaskStub), slave, VSs_MAGIC_NUMBER );
   6.122 +   newStub->numBlockingProp     = 0;
   6.123 +   newStub->taskType            = NULL;
   6.124 +   newStub->ptrEntries          = NULL; 
   6.125 +   newStub->args                = NULL;
   6.126 +   newStub->numLiveChildTasks   = 0;
   6.127 +   newStub->numLiveChildThreads = 0;
   6.128 +   newStub->isEnded             = FALSE;   
   6.129 +
   6.130 +   return newStub;
   6.131 + }
   6.132 +
   6.133 +inline 
   6.134 +VSsTaskStubCarrier *
   6.135  create_task_carrier( VSsTaskStub *taskStub, int32 argNum, int32 rdOrWrite )
   6.136   { VSsTaskStubCarrier *newCarrier;
   6.137   
   6.138 @@ -129,17 +157,23 @@
   6.139   * 
   6.140   *When slave dissipates, PR will call the registered recycler for the task stub.
   6.141   */
   6.142 -inline void
   6.143 -handleCreateThd( PRReqst *req, SlaveVP *requestingSlv, SlaveVP *newSlv, VSsSemEnv *semEnv )
   6.144 - { VSsSemReq  *semReq;
   6.145 +//inline 
   6.146 +SlaveVP *
   6.147 +handleCreateThd( void *_langReq, SlaveVP *requestingSlv, void *_langEnv )
   6.148 + { VSsLangReq  *langReq;
   6.149     VSsTaskStub *taskStub, *parentTaskStub;
   6.150 +   SlaveVP    *newSlv;
   6.151 +   VSsLangEnv *langEnv;
   6.152 +
   6.153 +   langReq = (VSsLangReq *) _langReq;
   6.154 +   langEnv = (VSsLangEnv *) _langEnv;
   6.155     
   6.156 -   semReq = PR_PI__take_sem_reqst_from( req );
   6.157 -
   6.158 -   parentTaskStub = PR_PI__give_lang_meta_task( requestingSlv );
   6.159 +   newSlv  = PR_int__create_slave( langReq->fnPtr, langReq->initData );
   6.160 +   
   6.161 +   parentTaskStub = PR_PI__give_lang_meta_task_from_slave__ML( requestingSlv, VSs_MAGIC_NUMBER );
   6.162     parentTaskStub->numLiveChildThreads += 1;
   6.163     
   6.164 -   taskStub = create_thread_task_stub(); //only used for wait info
   6.165 +   taskStub = VSs__create_generic_slave_task_stub_in_slave(requestingSlv); //used for wait info
   6.166     taskStub->parentTaskStub = parentTaskStub;
   6.167  
   6.168        //note, semantic data will be initialized by separate, registered 
   6.169 @@ -151,15 +185,15 @@
   6.170  
   6.171     #else
   6.172        //Assigning slaves to cores is part of SSR code..
   6.173 -   int32 coreToAssignOnto = semReq->coreToAssignOnto;
   6.174 +   int32 coreToAssignOnto = langReq->coreToAssignOnto;
   6.175     if(coreToAssignOnto < 0 || coreToAssignOnto >= NUM_CORES )
   6.176      {    //out-of-range, so round-robin assignment
   6.177 -      newSlv->coreAnimatedBy = semEnv->nextCoreToGetNewSlv;
   6.178 +      newSlv->coreAnimatedBy = langEnv->nextCoreToGetNewSlv;
   6.179  
   6.180 -      if( semEnv->nextCoreToGetNewSlv >= NUM_CORES - 1 )
   6.181 -          semEnv->nextCoreToGetNewSlv  = 0;
   6.182 +      if( langEnv->nextCoreToGetNewSlv >= NUM_CORES - 1 )
   6.183 +         langEnv->nextCoreToGetNewSlv  = 0;
   6.184        else
   6.185 -          semEnv->nextCoreToGetNewSlv += 1;
   6.186 +         langEnv->nextCoreToGetNewSlv += 1;
   6.187      }
   6.188     else //core num in-range, so use it
   6.189      { newSlv->coreAnimatedBy = coreToAssignOnto;
   6.190 @@ -170,51 +204,55 @@
   6.191     
   6.192  
   6.193           DEBUG__printf2(dbgRqstHdlr,"Create from: %d, new VP: %d",
   6.194 -                                    requestingSlv->slaveID, newSlv->slaveID)
   6.195 +                                    requestingSlv->slaveNum, newSlv->slaveNum)
   6.196  
   6.197     #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
   6.198     Dependency newD;
   6.199 -   newD.from_vp = requestingSlv->slaveID;
   6.200 +   newD.from_vp = requestingSlv->slaveNum;
   6.201     newD.from_task = requestingSlv->numTimesAssignedToASlot;
   6.202 -   newD.to_vp = newSlv->slaveID;
   6.203 +   newD.to_vp = newSlv->slaveNum;
   6.204     newD.to_task = 1;
   6.205 -   addToListOfArrays(Dependency,newD,semEnv->commDependenciesList);   
   6.206 +   addToListOfArrays(Dependency,newD,langEnv->commDependenciesList);   
   6.207     #endif
   6.208  
   6.209        //For VSs, caller needs ptr to created thread returned to it
   6.210     requestingSlv->dataRetFromReq = newSlv;
   6.211 -   resume_slaveVP(requestingSlv , semEnv );
   6.212 -   resume_slaveVP( newSlv,        semEnv );
   6.213 +   resume_slaveVP(requestingSlv , langEnv );
   6.214 +   resume_slaveVP( newSlv,        langEnv );
   6.215 +   
   6.216 +   return newSlv;
   6.217   }
   6.218  
   6.219  /*Initialize semantic data struct..  this initializer doesn't need any input,
   6.220   * but some languages may need something from inside the request that was sent
   6.221   * to create a slave..  in that case, just make initializer do the malloc then
   6.222 - * use the PR_PI__give_sem_data  inside the create handler, and fill in the
   6.223 - * semData values there.
   6.224 + * use the PR_PI__give_lang_data  inside the create handler, and fill in the
   6.225 + * langData values there.
   6.226   */
   6.227 -void * createInitialSemanticData( )
   6.228 - { VSsSemData *semData;
   6.229 +void * 
   6.230 +createInitialSemanticData( )
   6.231 + { VSsLangData *langData;
   6.232   
   6.233 -   semData = PR_PI__malloc( sizeof(VSsSemData) );
   6.234 +   langData = PR_PI__malloc( sizeof(VSsLangData) );
   6.235     
   6.236 -   semData->highestTransEntered = -1;
   6.237 -   semData->lastTransEntered    = NULL;
   6.238 -   return semData;
   6.239 +   langData->highestTransEntered = -1;
   6.240 +   langData->lastTransEntered    = NULL;
   6.241 +   return langData;
   6.242   }
   6.243  
   6.244  /*SlaveVP dissipate -- this is NOT task-end!, only call this to end explicitly
   6.245   * created threads
   6.246   */
   6.247 -inline void
   6.248 -handleDissipate( SlaveVP *requestingSlv, VSsSemEnv *semEnv )
   6.249 - { VSsSemData  *semData;
   6.250 +//inline
   6.251 +void
   6.252 +handleDissipate( SlaveVP *requestingSlv, VSsLangEnv *langEnv )
   6.253 + { 
   6.254     VSsTaskStub  *parentTaskStub, *ownTaskStub;
   6.255   
   6.256           DEBUG__printf1(dbgRqstHdlr,"Dissipate request from processor %d",
   6.257 -                                                     requestingSlv->slaveID)
   6.258 +                                                     requestingSlv->slaveNum)
   6.259               
   6.260 -   ownTaskStub    = PR_PI__give_lang_meta_task( requestingSlv, VSs_MAGIC_NUMBER );
   6.261 +   ownTaskStub    = PR_PI__give_lang_meta_task_from_slave__ML( requestingSlv, VSs_MAGIC_NUMBER );
   6.262     parentTaskStub = ownTaskStub->parentTaskStub;
   6.263     parentTaskStub->numLiveChildThreads -= 1;  //parent wasn't freed, even if ended
   6.264     
   6.265 @@ -233,7 +271,7 @@
   6.266        if( parentTaskStub->isWaitingForChildTasksToEnd )
   6.267          return; //still waiting on tasks (should be impossible)
   6.268        else //parent free to resume
   6.269 -        resume_slaveVP( PR_PI__give_slave_assigned_to(parentTaskStub), semEnv );
   6.270 +        resume_slaveVP( PR_PI__give_slave_lang_meta_task_assigned_to(parentTaskStub), langEnv );
   6.271      }
   6.272     
   6.273        //check if this is last child of ended parent (note, not possible to
   6.274 @@ -241,34 +279,44 @@
   6.275     if( parentTaskStub->isEnded &&
   6.276         parentTaskStub->numLiveChildTasks   == 0 && 
   6.277         parentTaskStub->numLiveChildThreads == 0 )
   6.278 -    { free_task_stub( parentTaskStub ); //just stub, semData already freed
   6.279 +    { free_task_stub( parentTaskStub ); //just stub, langData already freed
   6.280      }
   6.281  
   6.282   FreeSlaveStateAndReturn:
   6.283 -      //Used to free the semData and requesting slave's base state, but
   6.284 -      // now PR does those things, so nothing more to do..
   6.285 -//PR handles this:   PR_PI__free( semData );
   6.286 -//PR handles this:   PR_PI__dissipate_slaveVP( requestingSlv );
   6.287 +      //PR frees the langData, task stub and requesting slave's base state
   6.288 +   return; 
   6.289 + }
   6.290 +inline
   6.291 +void
   6.292 +handleShutdownDissipate( SlaveVP *requestingSlv, VSsLangEnv *langEnv )
   6.293 + { 
   6.294 +   VSsTaskStub  *ownTaskStub;
   6.295 +              
   6.296 +   ownTaskStub    = PR_PI__give_lang_meta_task_from_slave__ML( requestingSlv, VSs_MAGIC_NUMBER );
   6.297 +   free_task_stub( ownTaskStub );
   6.298 +
   6.299 +      //PR frees the langData, task stub and requesting slave's base state
   6.300     return; 
   6.301   }
   6.302  
   6.303  /*Register this with PR, during VSs start
   6.304   *
   6.305 - *At some point, may change PR so that it recycles semData, in which case this
   6.306 + *At some point, may change PR so that it recycles langData, in which case this
   6.307   * only gets called when a process shuts down..  at that point, PR will call
   6.308   * dissipate on all the slaves it has in the recycle Q.
   6.309   */
   6.310  void
   6.311 -freeVSsSemData( void *_semData )
   6.312 +freeVSsLangData( void *_langData )
   6.313   { //
   6.314 -   PR_PI__free( _semData );
   6.315 +   PR_PI__free( _langData );
   6.316   }
   6.317  
   6.318 -void resetVSsSemData( void *_semData ) 
   6.319 - { VSsSemData *semData = (VSsSemData *)_semData;
   6.320 +void 
   6.321 +resetVSsLangData( void *_langData ) 
   6.322 + { VSsLangData *langData = (VSsLangData *)_langData;
   6.323     
   6.324 -   semData->highestTransEntered = -1;
   6.325 -   semData->lastTransEntered    = NULL;
   6.326 +   langData->highestTransEntered = -1;
   6.327 +   langData->lastTransEntered    = NULL;
   6.328   }
   6.329  
   6.330  //==========================================================================
   6.331 @@ -279,12 +327,12 @@
   6.332   *PR creates a PRMetaTask and passes it in.  This handler adds language-
   6.333   * specific stuff to it.  The language-specific stuff is linked to the
   6.334   * PRMetaTask, but if the task is suspended for any reason, the lang-specific
   6.335 - * part is moved to the semData of the slave that is animating the task.
   6.336 + * part is moved to the langData of the slave that is animating the task.
   6.337   *So, while the PRMetaTask is inside the creating language's semantic
   6.338   * env, waiting to be assigned to a slave for animation, the lang-specific
   6.339   * task info is accessed from the PRMetaTask.  But once the task suspends,
   6.340 - * that lang-specific task info transfers to the slave's semData.  All lang
   6.341 - * constructs that want to access it must get it from the semData.
   6.342 + * that lang-specific task info transfers to the slave's langData.  All lang
   6.343 + * constructs that want to access it must get it from the langData.
   6.344   *However, taskEnd still accesses the lang-specific task info from the 
   6.345   * PRMetaTask, whether it suspended or not..  and the task code can access
   6.346   * data to be used within the application behavior via 
   6.347 @@ -354,9 +402,9 @@
   6.348   * decide garbage collection of no-longer-used pointers later)
   6.349   *
   6.350   */
   6.351 -inline 
   6.352 +//inline 
   6.353  void *
   6.354 -handleSubmitTask( VSsSemReq *semReq, VSsSemEnv *semEnv )
   6.355 +handleSubmitTask( VSsLangReq *langReq, VSsLangEnv *langEnv )
   6.356   { uint32           key[3];
   6.357     HashEntry       *rawHashEntry; //has char *, but use with uint32 *
   6.358     VSsPointerEntry *ptrEntry; //contents of hash table entry for an arg pointer
   6.359 @@ -366,7 +414,7 @@
   6.360     VSsTaskStubCarrier *taskCarrier;
   6.361     
   6.362     HashTable *
   6.363 -   argPtrHashTbl = semEnv->argPtrHashTbl;
   6.364 +   argPtrHashTbl = langEnv->argPtrHashTbl;
   6.365     
   6.366   
   6.367     /* ==========================  creation  ========================== 
   6.368 @@ -376,19 +424,19 @@
   6.369      * inputs from the sequential portion. Note that all controlled arguments
   6.370      * are pointers, and marked as controlled in the application code).
   6.371      */
   6.372 -   args     = semReq->args;
   6.373 -   taskType = semReq->taskType; //this is VSs task type struct
   6.374 +   args     = langReq->args;
   6.375 +   taskType = langReq->taskType; //this is VSs task type struct
   6.376     taskStub = create_task_stub( taskType, args );//copies arg ptrs
   6.377     
   6.378     taskStub->numBlockingProp = taskType->numCtldArgs;
   6.379 -   //PR does this (metaTask contains taskID): taskStub->taskID = semReq->taskID;
   6.380 +   //PR does this (metaTask contains taskID): taskStub->taskID = langReq->taskID;
   6.381        
   6.382 -   parentTaskStub = (VSsTaskStub *)PR_PI__give_lang_meta_task(semReq->callingSlv, VSs_MAGIC_NUMBER);
   6.383 +   parentTaskStub = (VSsTaskStub *)PR_PI__give_lang_meta_task_from_slave__ML(langReq->callingSlv, VSs_MAGIC_NUMBER);
   6.384     taskStub->parentTaskStub = parentTaskStub; 
   6.385     parentTaskStub->numLiveChildTasks += 1;
   6.386     
   6.387 -         //DEBUG__printf3(dbgRqstHdlr,"Submit req from slaveID: %d, from task: %d, for task: %d", semReq->callingSlv->slaveID, parentSemData->taskStub->taskID[1], taskStub->taskID[1])
   6.388 -         DEBUG__printf2(dbgRqstHdlr,"Submit req from slaveID: %d, for task: %d", semReq->callingSlv->slaveID, taskStub->taskID[1])
   6.389 +         //DEBUG__printf3(dbgRqstHdlr,"Submit req from slaveNum: %d, from task: %d, for task: %d", langReq->callingSlv->slaveNum, parentLangData->taskStub->taskID[1], taskStub->taskID[1])
   6.390 +//         DEBUG__printf2(dbgRqstHdlr,"Submit req from slaveNum: %d, for task: %d", langReq->callingSlv->slaveNum, taskStub->taskID[1])
   6.391            
   6.392     /*=============== Process args =================
   6.393      *The controlled arguments are processed one by one.
   6.394 @@ -431,9 +479,8 @@
   6.395               * the hash-entry's count of enabled and non-finished readers.*/
   6.396              taskStub->numBlockingProp -= 1;
   6.397              if( taskStub->numBlockingProp == 0 )
   6.398 -             { writePrivQ( taskStub, semEnv->taskReadyQ );
   6.399 -               if( semEnv->protoSemEnv->hasWork != TRUE ) 
   6.400 -                   semEnv->protoSemEnv->hasWork = TRUE;
   6.401 +             { writePrivQ( taskStub, langEnv->taskReadyQ );
   6.402 +               PR_int__set_work_in_lang_env( langEnv ); 
   6.403               }
   6.404              ptrEntry->numEnabledNonDoneReaders += 1;
   6.405            }
   6.406 @@ -456,9 +503,8 @@
   6.407                * into the readyQ.*/
   6.408              taskStub->numBlockingProp -= 1;
   6.409              if( taskStub->numBlockingProp == 0 )
   6.410 -             { writePrivQ( taskStub, semEnv->taskReadyQ );
   6.411 -               if( semEnv->protoSemEnv->hasWork != TRUE ) 
   6.412 -                   semEnv->protoSemEnv->hasWork = TRUE;
   6.413 +             { writePrivQ( taskStub, langEnv->taskReadyQ );
   6.414 +               PR_int__set_work_in_lang_env( langEnv ); 
   6.415               }
   6.416              ptrEntry->hasEnabledNonFinishedWriter = TRUE;
   6.417            }
   6.418 @@ -471,9 +517,9 @@
   6.419      } //for argNum
   6.420     
   6.421        //resume the parent, creator
   6.422 -   resume_slaveVP( semReq->callingSlv, semEnv );
   6.423 +   resume_slaveVP( langReq->callingSlv, langEnv );
   6.424  
   6.425 -   return;
   6.426 +   return taskStub;
   6.427   }
   6.428  
   6.429  
   6.430 @@ -512,25 +558,24 @@
   6.431   *TODO: Might be safe to delete an entry when task ends and waiterQ empty
   6.432   * and no readers and no writers..
   6.433   */
   6.434 -inline void
   6.435 -handleEndTask( void *langMetaTask, VSsSemReq *semReq, VSsSemEnv *semEnv )
   6.436 +//inline 
   6.437 +void
   6.438 +handleEndTask( VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv )
   6.439   { VSsPointerEntry  *ptrEntry; //contents of hash table entry for an arg pointer
   6.440     void            **args;
   6.441 -   VSsSemData       *endingSlvSemData;
   6.442     VSsTaskStub      *endingTaskStub, *waitingTaskStub, *parentStub;
   6.443     VSsTaskType      *endingTaskType;
   6.444     VSsTaskStubCarrier *waitingTaskCarrier;
   6.445     VSsPointerEntry **ptrEntries;
   6.446           
   6.447 - 
   6.448 -//   endingTaskStub   = (VSsTaskStub *)PR_PI__give_lang_spec_task_info( semReq->callingSlv );
   6.449 -   
   6.450 -   endingTaskStub   = (VSsTaskStub *)langMetaTask;
   6.451 +   endingTaskStub   = 
   6.452 +    (VSsTaskStub *)PR_int__give_lang_meta_task_from_slave__ML( requestingSlv, VSs_MAGIC_NUMBER );
   6.453 +
   6.454     args             = endingTaskStub->args;
   6.455     endingTaskType   = endingTaskStub->taskType;
   6.456     ptrEntries       = endingTaskStub->ptrEntries; //saved in stub when create
   6.457     
   6.458 -         DEBUG__printf2(dbgRqstHdlr,"EndTask req from slaveID: %d, task: %d",semReq->callingSlv->slaveID, endingTaskStub->taskID[1])
   6.459 +//         DEBUG__printf2(dbgRqstHdlr,"EndTask req from slaveNum: %d, task: %d",langReq->callingSlv->slaveNum, endingTaskStub->taskID[1])
   6.460            
   6.461        //"wait" functionality: Check if parent was waiting on this task
   6.462     parentStub = endingTaskStub->parentTaskStub;
   6.463 @@ -539,7 +584,7 @@
   6.464         parentStub->numLiveChildTasks == 0)
   6.465      {
   6.466        parentStub->isWaitingForChildTasksToEnd = FALSE;
   6.467 -      resume_slaveVP( PR_PI__give_slave_assigned_to(parentStub), semEnv );
   6.468 +      resume_slaveVP( PR_PI__give_slave_lang_meta_task_assigned_to(parentStub), langEnv );
   6.469      }
   6.470     
   6.471        //Check if parent ended, and this was last descendent, then free it
   6.472 @@ -583,9 +628,8 @@
   6.473              // task-stub into the readyQ.
   6.474              waitingTaskStub->numBlockingProp -= 1;
   6.475              if( waitingTaskStub->numBlockingProp == 0 )
   6.476 -             { writePrivQ( waitingTaskStub, semEnv->taskReadyQ );
   6.477 -               if( semEnv->protoSemEnv->hasWork != TRUE ) 
   6.478 -                   semEnv->protoSemEnv->hasWork = TRUE;
   6.479 +             { writePrivQ( waitingTaskStub, langEnv->taskReadyQ );
   6.480 +               PR_int__set_work_in_lang_env( langEnv ); 
   6.481               }
   6.482            }
   6.483         }
   6.484 @@ -609,9 +653,8 @@
   6.485              // If it becomes zero, then put the task-stub into the readyQ.
   6.486              waitingTaskStub->numBlockingProp -= 1;
   6.487              if( waitingTaskStub->numBlockingProp == 0 )
   6.488 -             { writePrivQ( waitingTaskStub, semEnv->taskReadyQ );
   6.489 -                if( semEnv->protoSemEnv->hasWork != TRUE ) 
   6.490 -                    semEnv->protoSemEnv->hasWork = TRUE;
   6.491 +             { writePrivQ( waitingTaskStub, langEnv->taskReadyQ );
   6.492 +               PR_int__set_work_in_lang_env( langEnv ); 
   6.493               }
   6.494            }
   6.495           else
   6.496 @@ -627,9 +670,8 @@
   6.497                 // into the readyQ.
   6.498                 waitingTaskStub->numBlockingProp -= 1;
   6.499                 if( waitingTaskStub->numBlockingProp == 0 )
   6.500 -                { writePrivQ( waitingTaskStub, semEnv->taskReadyQ );
   6.501 -                   if( semEnv->protoSemEnv->hasWork != TRUE ) 
   6.502 -                       semEnv->protoSemEnv->hasWork = TRUE;
   6.503 +                { writePrivQ( waitingTaskStub, langEnv->taskReadyQ );
   6.504 +                  PR_int__set_work_in_lang_env( langEnv ); 
   6.505                  }
   6.506                 //Get next waiting task
   6.507                 waitingTaskCarrier = peekPrivQ( ptrEntry->waitersQ );
   6.508 @@ -653,8 +695,59 @@
   6.509     return; 
   6.510   }
   6.511  
   6.512 +//inline 
   6.513 +void
   6.514 +handleFreeTask( void *langMetaTask )
   6.515 + { VSsPointerEntry  *ptrEntry; //contents of hash table entry for an arg pointer
   6.516 +   void            **args;
   6.517 +   VSsTaskStub      *endingTaskStub, *waitingTaskStub;
   6.518 +   VSsTaskType      *endingTaskType;
   6.519 +   VSsTaskStubCarrier *waitingTaskCarrier;
   6.520 +   VSsPointerEntry **ptrEntries;
   6.521 +         
   6.522 +   
   6.523 +   endingTaskStub   = (VSsTaskStub *)langMetaTask;
   6.524 +   args             = endingTaskStub->args;
   6.525 +   endingTaskType   = endingTaskStub->taskType;
   6.526 +   ptrEntries       = endingTaskStub->ptrEntries; //saved in stub when create
   6.527 +      
   6.528 +   
   6.529 +      //Now, update state of dependents and start ready tasks
   6.530 +   /*The task's controlled arguments are processed one by one.
   6.531 +    *Processing an argument means getting arg-pointer's entry.
   6.532 +    */
   6.533 +   int32 argNum;
   6.534 +   for( argNum = 0; argNum < endingTaskType->numCtldArgs; argNum++ )
   6.535 +    {       
   6.536 +      ptrEntry = ptrEntries[argNum];
   6.537 +      while( TRUE )
   6.538 +       {
   6.539 +         waitingTaskCarrier = readPrivQ( ptrEntry->waitersQ );
   6.540 +         if( waitingTaskCarrier == NULL ) 
   6.541 +          { freePrivQ( ptrEntry->waitersQ );
   6.542 +            PR_int__free( ptrEntry );
   6.543 +            continue; //next iter of for loop
   6.544 +          }
   6.545 +         else
   6.546 +          { waitingTaskStub = waitingTaskCarrier->taskStub;
   6.547 +            PR_int__free( waitingTaskCarrier );
   6.548  
   6.549 -inline void
   6.550 +               //Decrement the blocking propendents count of the reader's
   6.551 +               // task-stub.  If it reaches zero, then put the task-stub
   6.552 +               // into the readyQ.
   6.553 +            waitingTaskStub->numBlockingProp -= 1;
   6.554 +            if( waitingTaskStub->numBlockingProp == 0 )
   6.555 +             {    //last ptrEntry holding the task, so free it
   6.556 +               free_task_stub( endingTaskStub );    
   6.557 +             }
   6.558 +          }       
   6.559 +       }//
   6.560 +    }//for argnum in ending task
   6.561 + }
   6.562 +
   6.563 +
   6.564 +//inline 
   6.565 +void
   6.566  free_task_stub( VSsTaskStub *stubToFree )
   6.567   { if(stubToFree->ptrEntries != NULL ) //a thread stub has NULL entry
   6.568      { PR_PI__free( stubToFree->ptrEntries );
   6.569 @@ -667,7 +760,7 @@
   6.570  
   6.571  
   6.572  //============================  Send Handlers ==============================
   6.573 -/*Send of Type -- The semantic request has the receiving task ID and Type
   6.574 +/*Send of Type -- The lang request has the receiving task ID and Type
   6.575   *
   6.576   *Messages of a given Type have to be kept separate..  so need a separate
   6.577   * entry in the hash table for each pair: receiverID, Type
   6.578 @@ -677,19 +770,20 @@
   6.579   * separate tasks can send to the same receiver, and doing hash on the
   6.580   * receive task, so they will stack up.
   6.581   */
   6.582 -inline void
   6.583 -handleSendTypeTo( VSsSemReq *semReq, VSsSemEnv *semEnv )
   6.584 +//inline 
   6.585 +void
   6.586 +handleSendTypeTo( VSsLangReq *langReq, VSsLangEnv *langEnv )
   6.587   { SlaveVP    *senderSlv, *receiverSlv;
   6.588     int32      *senderID, *receiverID;
   6.589     int32      *key, keySz, receiverIDNumInt;
   6.590 -   VSsSemReq  *waitingReq;
   6.591 +   VSsLangReq  *waitingReq;
   6.592     HashEntry  *entry;
   6.593 -   HashTable  *commHashTbl = semEnv->commHashTbl;
   6.594 +   HashTable  *commHashTbl = langEnv->commHashTbl;
   6.595     
   6.596 -   receiverID  = semReq->receiverID; //For "send", know both send & recv procrs
   6.597 -   senderSlv   = semReq->senderSlv;
   6.598 +   receiverID  = langReq->receiverID; //For "send", know both send & recv procrs
   6.599 +   senderSlv   = langReq->senderSlv;
   6.600  
   6.601 -         DEBUG__printf2(dbgRqstHdlr,"SendType req from sender slaveID: %d, recTask: %d", senderSlv->slaveID, receiverID[1])
   6.602 +         DEBUG__printf2(dbgRqstHdlr,"SendType req from sender slaveNum: %d, recTask: %d", senderSlv->slaveNum, receiverID[1])
   6.603            
   6.604           
   6.605     receiverIDNumInt = receiverID[0] + 1; //pos 0 doesn't include itself
   6.606 @@ -697,15 +791,15 @@
   6.607     key = PR_PI__malloc( keySz );
   6.608     key[0] = receiverIDNumInt + 1; //loc 0 is num int32 in key
   6.609     memcpy( &key[1], receiverID, receiverIDNumInt * sizeof(int32) );
   6.610 -   key[ 1 + receiverIDNumInt ] = semReq->msgType; 
   6.611 +   key[ 1 + receiverIDNumInt ] = langReq->msgType; 
   6.612     
   6.613 -   entry = giveEntryElseInsertReqst32( key, semReq, commHashTbl );
   6.614 +   entry = giveEntryElseInsertReqst32( key, langReq, commHashTbl );
   6.615     if( entry == NULL ) //was just inserted, means task has to wait
   6.616      { return;
   6.617      }
   6.618  
   6.619        //if here, found a waiting request with same key
   6.620 -   waitingReq = (VSsSemReq *)entry->content;
   6.621 +   waitingReq = (VSsLangReq *)entry->content;
   6.622  
   6.623        //At this point, know have waiting request(s) -- either sends or recv
   6.624        //Note, can only have max of one receive waiting, and cannot have both
   6.625 @@ -714,7 +808,7 @@
   6.626     if( waitingReq->reqType == send_type_to )
   6.627      {    //waiting request is another send, so stack this up on list
   6.628           // but first clone the sending request so it persists.
   6.629 -      VSsSemReq *clonedReq = cloneReq( semReq );
   6.630 +      VSsLangReq *clonedReq = cloneReq( langReq );
   6.631        clonedReq-> nextReqInHashEntry = waitingReq->nextReqInHashEntry;
   6.632        waitingReq->nextReqInHashEntry = clonedReq;
   6.633           DEBUG__printf2( dbgRqstHdlr, "linked requests: %p, %p ", clonedReq,\
   6.634 @@ -725,26 +819,26 @@
   6.635      {    
   6.636         #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
   6.637          Dependency newD;
   6.638 -        newD.from_vp = senderID->slaveID;
   6.639 +        newD.from_vp = senderID->slaveNum;
   6.640          newD.from_task = senderID->numTimesAssignedToASlot;
   6.641 -        newD.to_vp = receiverID->slaveID;
   6.642 +        newD.to_vp = receiverID->slaveNum;
   6.643          newD.to_task = receiverID->numTimesAssignedToASlot +1;
   6.644 -        //(newD,semEnv->commDependenciesList);  
   6.645 -        addToListOfArrays(Dependency,newD,semEnv->dynDependenciesList);  
   6.646 -                int32 groupId = semReq->msgType;
   6.647 -        if(semEnv->ntonGroupsInfo->numInArray <= groupId){
   6.648 -            makeHighestDynArrayIndexBeAtLeast(semEnv->ntonGroupsInfo, groupId);
   6.649 +        //(newD,langEnv->commDependenciesList);  
   6.650 +        addToListOfArrays(Dependency,newD,langEnv->dynDependenciesList);  
   6.651 +                int32 groupId = langReq->msgType;
   6.652 +        if(langEnv->ntonGroupsInfo->numInArray <= groupId){
   6.653 +            makeHighestDynArrayIndexBeAtLeast(langEnv->ntonGroupsInfo, groupId);
   6.654          }
   6.655 -        if(semEnv->ntonGroups[groupId] == NULL){
   6.656 -            semEnv->ntonGroups[groupId] = new_NtoN(groupId);
   6.657 +        if(langEnv->ntonGroups[groupId] == NULL){
   6.658 +            langEnv->ntonGroups[groupId] = new_NtoN(groupId);
   6.659          }
   6.660          Unit u;
   6.661 -        u.vp = senderID->slaveID;
   6.662 +        u.vp = senderID->slaveNum;
   6.663          u.task = senderID->numTimesAssignedToASlot;
   6.664 -        addToListOfArrays(Unit,u,semEnv->ntonGroups[groupId]->senders);
   6.665 -        u.vp = receiverID->slaveID;
   6.666 +        addToListOfArrays(Unit,u,langEnv->ntonGroups[groupId]->senders);
   6.667 +        u.vp = receiverID->slaveNum;
   6.668          u.task = receiverID->numTimesAssignedToASlot +1;
   6.669 -        addToListOfArrays(Unit,u,semEnv->ntonGroups[groupId]->receivers);
   6.670 +        addToListOfArrays(Unit,u,langEnv->ntonGroups[groupId]->receivers);
   6.671         #endif
   6.672  
   6.673           //set receiver slave, from the waiting request
   6.674 @@ -763,11 +857,11 @@
   6.675        
   6.676           //attach msg that's in this send request to receiving task's Slv
   6.677           // when comes back from suspend will have msg in dataRetFromReq
   6.678 -      receiverSlv->dataRetFromReq = semReq->msg;
   6.679 +      receiverSlv->dataRetFromReq = langReq->msg;
   6.680  
   6.681           //bring both processors back from suspend
   6.682 -      resume_slaveVP( senderSlv,   semEnv );
   6.683 -      resume_slaveVP( receiverSlv, semEnv );
   6.684 +      resume_slaveVP( senderSlv,   langEnv );
   6.685 +      resume_slaveVP( receiverSlv, langEnv );
   6.686  
   6.687        return;
   6.688      }
   6.689 @@ -782,21 +876,22 @@
   6.690   *Looks like can make single handler for both kinds of send..
   6.691   */
   6.692  //TODO: combine both send handlers into single handler
   6.693 -inline void
   6.694 -handleSendFromTo( VSsSemReq *semReq, VSsSemEnv *semEnv)
   6.695 +//inline 
   6.696 +void
   6.697 +handleSendFromTo( VSsLangReq *langReq, VSsLangEnv *langEnv)
   6.698   { SlaveVP     *senderSlv, *receiverSlv;
   6.699     int32       *senderID, *receiverID;
   6.700     int32       *key, keySz, receiverIDNumInt, senderIDNumInt;
   6.701 -   VSsSemReq   *waitingReq;
   6.702 +   VSsLangReq   *waitingReq;
   6.703     HashEntry   *entry;
   6.704 -   HashTable   *commHashTbl = semEnv->commHashTbl;
   6.705 +   HashTable   *commHashTbl = langEnv->commHashTbl;
   6.706  
   6.707           DEBUG__printf2(dbgRqstHdlr,"SendFromTo req from task %d to %d",
   6.708 -                        semReq->senderID[1],semReq->receiverID[1])
   6.709 +                        langReq->senderID[1],langReq->receiverID[1])
   6.710     
   6.711 -   receiverID  = semReq->receiverID; //For "send", know both send & recv procrs
   6.712 -   senderID    = semReq->senderID;
   6.713 -   senderSlv   = semReq->senderSlv;
   6.714 +   receiverID  = langReq->receiverID; //For "send", know both send & recv procrs
   6.715 +   senderID    = langReq->senderID;
   6.716 +   senderSlv   = langReq->senderSlv;
   6.717  
   6.718     
   6.719     receiverIDNumInt = receiverID[0] + 1; //include the count in the key
   6.720 @@ -807,12 +902,12 @@
   6.721     memcpy( &key[1], receiverID, receiverIDNumInt * sizeof(int32) );
   6.722     memcpy( &key[1 + receiverIDNumInt], senderID, senderIDNumInt * sizeof(int32) );
   6.723  
   6.724 -   entry = giveEntryElseInsertReqst32( key, semReq, commHashTbl );
   6.725 +   entry = giveEntryElseInsertReqst32( key, langReq, commHashTbl );
   6.726     if( entry == NULL ) //was just inserted, means task has to wait
   6.727      { return;
   6.728      }
   6.729  
   6.730 -   waitingReq = (VSsSemReq *)entry->content;
   6.731 +   waitingReq = (VSsLangReq *)entry->content;
   6.732  
   6.733        //At this point, know have waiting request(s) -- either sends or recv
   6.734     if( waitingReq->reqType == send_from_to )
   6.735 @@ -822,12 +917,12 @@
   6.736      {    //waiting request is a receive, so it completes pair with this send
   6.737        #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
   6.738          Dependency newD;
   6.739 -        newD.from_vp = sendPr->slaveID;
   6.740 +        newD.from_vp = sendPr->slaveNum;
   6.741          newD.from_task = sendPr->numTimesAssignedToASlot;
   6.742 -        newD.to_vp = receivePr->slaveID;
   6.743 +        newD.to_vp = receivePr->slaveNum;
   6.744          newD.to_task = receivePr->numTimesAssignedToASlot +1;
   6.745 -        //addToListOfArraysDependency(newD,semEnv->commDependenciesList);  
   6.746 -        addToListOfArrays(Dependency,newD,semEnv->commDependenciesList);   
   6.747 +        //addToListOfArraysDependency(newD,langEnv->commDependenciesList);  
   6.748 +        addToListOfArrays(Dependency,newD,langEnv->commDependenciesList);   
   6.749        #endif 
   6.750  
   6.751           //set receiver slave, from the waiting request
   6.752 @@ -846,11 +941,11 @@
   6.753  
   6.754           //attach msg that's in this send request to receiving procr
   6.755           // when comes back from suspend, will have msg in dataRetFromReq
   6.756 -      receiverSlv->dataRetFromReq = semReq->msg;
   6.757 +      receiverSlv->dataRetFromReq = langReq->msg;
   6.758  
   6.759           //bring both processors back from suspend
   6.760 -      resume_slaveVP( senderSlv,   semEnv );
   6.761 -      resume_slaveVP( receiverSlv, semEnv );
   6.762 +      resume_slaveVP( senderSlv,   langEnv );
   6.763 +      resume_slaveVP( receiverSlv, langEnv );
   6.764              
   6.765        return;
   6.766      }
   6.767 @@ -862,19 +957,20 @@
   6.768  //
   6.769  
   6.770  
   6.771 -inline void
   6.772 -handleReceiveTypeTo( VSsSemReq *semReq, VSsSemEnv *semEnv)
   6.773 +//inline 
   6.774 +void
   6.775 +handleReceiveTypeTo( VSsLangReq *langReq, VSsLangEnv *langEnv)
   6.776   { SlaveVP    *senderSlv, *receiverSlv;
   6.777     int32      *receiverID;
   6.778     int32      *key, keySz, receiverIDNumInt;
   6.779 -   VSsSemReq  *waitingReq;
   6.780 +   VSsLangReq  *waitingReq;
   6.781     HashEntry  *entry;
   6.782 -   HashTable  *commHashTbl = semEnv->commHashTbl;
   6.783 +   HashTable  *commHashTbl = langEnv->commHashTbl;
   6.784     
   6.785 -         DEBUG__printf2(dbgRqstHdlr,"ReceiveType req to ID: %d type: %d",semReq->receiverID[1], semReq->msgType)
   6.786 +         DEBUG__printf2(dbgRqstHdlr,"ReceiveType req to ID: %d type: %d",langReq->receiverID[1], langReq->msgType)
   6.787   
   6.788 -   receiverID  = semReq->receiverID; //For "send", know both send & recv procrs
   6.789 -   receiverSlv = semReq->receiverSlv;
   6.790 +   receiverID  = langReq->receiverID; //For "send", know both send & recv procrs
   6.791 +   receiverSlv = langReq->receiverSlv;
   6.792     
   6.793  
   6.794        //key is the receiverID plus the type -- have to copy them into key
   6.795 @@ -883,14 +979,14 @@
   6.796     key = PR_PI__malloc( keySz );
   6.797     key[0] = receiverIDNumInt + 1; //loc 0 is num int32s in key
   6.798     memcpy( &key[1], receiverID, receiverIDNumInt * sizeof(int32) );
   6.799 -   key[ 1 + receiverIDNumInt ] = semReq->msgType; 
   6.800 +   key[ 1 + receiverIDNumInt ] = langReq->msgType; 
   6.801  
   6.802 -   entry = giveEntryElseInsertReqst32( key, semReq, commHashTbl );//clones
   6.803 +   entry = giveEntryElseInsertReqst32( key, langReq, commHashTbl );//clones
   6.804     if( entry == NULL ) //was just inserted, means task has to wait
   6.805      { return;
   6.806      }
   6.807  
   6.808 -   waitingReq = (VSsSemReq *)entry->content;  //previously cloned by insert
   6.809 +   waitingReq = (VSsLangReq *)entry->content;  //previously cloned by insert
   6.810  
   6.811        //At this point, know have waiting request(s) -- should be send(s)
   6.812     if( waitingReq->reqType == send_type_to )
   6.813 @@ -914,30 +1010,30 @@
   6.814  
   6.815         #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
   6.816          Dependency newD;
   6.817 -        newD.from_vp = sendPr->slaveID;
   6.818 +        newD.from_vp = sendPr->slaveNum;
   6.819          newD.from_task = sendPr->numTimesAssignedToASlot;
   6.820 -        newD.to_vp = receivePr->slaveID;
   6.821 +        newD.to_vp = receivePr->slaveNum;
   6.822          newD.to_task = receivePr->numTimesAssignedToASlot +1;
   6.823 -        //addToListOfArraysDependency(newD,semEnv->commDependenciesList);  
   6.824 -        addToListOfArrays(Dependency,newD,semEnv->dynDependenciesList); 
   6.825 -        int32 groupId = semReq->msgType;
   6.826 -        if(semEnv->ntonGroupsInfo->numInArray <= groupId){
   6.827 -            makeHighestDynArrayIndexBeAtLeast(semEnv->ntonGroupsInfo, groupId);
   6.828 +        //addToListOfArraysDependency(newD,langEnv->commDependenciesList);  
   6.829 +        addToListOfArrays(Dependency,newD,langEnv->dynDependenciesList); 
   6.830 +        int32 groupId = langReq->msgType;
   6.831 +        if(langEnv->ntonGroupsInfo->numInArray <= groupId){
   6.832 +            makeHighestDynArrayIndexBeAtLeast(langEnv->ntonGroupsInfo, groupId);
   6.833          }
   6.834 -        if(semEnv->ntonGroups[groupId] == NULL){
   6.835 -            semEnv->ntonGroups[groupId] = new_NtoN(groupId);
   6.836 +        if(langEnv->ntonGroups[groupId] == NULL){
   6.837 +            langEnv->ntonGroups[groupId] = new_NtoN(groupId);
   6.838          }
   6.839          Unit u;
   6.840 -        u.vp = sendPr->slaveID;
   6.841 +        u.vp = sendPr->slaveNum;
   6.842          u.task = sendPr->numTimesAssignedToASlot;
   6.843 -        addToListOfArrays(Unit,u,semEnv->ntonGroups[groupId]->senders);
   6.844 -        u.vp = receivePr->slaveID;
   6.845 +        addToListOfArrays(Unit,u,langEnv->ntonGroups[groupId]->senders);
   6.846 +        u.vp = receivePr->slaveNum;
   6.847          u.task = receivePr->numTimesAssignedToASlot +1;
   6.848 -        addToListOfArrays(Unit,u,semEnv->ntonGroups[groupId]->receivers);
   6.849 +        addToListOfArrays(Unit,u,langEnv->ntonGroups[groupId]->receivers);
   6.850         #endif
   6.851        
   6.852 -      resume_slaveVP( senderSlv,   semEnv );
   6.853 -      resume_slaveVP( receiverSlv, semEnv );
   6.854 +      resume_slaveVP( senderSlv,   langEnv );
   6.855 +      resume_slaveVP( receiverSlv, langEnv );
   6.856  
   6.857        return;
   6.858      }
   6.859 @@ -947,20 +1043,21 @@
   6.860  
   6.861  /*
   6.862   */
   6.863 -inline void
   6.864 -handleReceiveFromTo( VSsSemReq *semReq, VSsSemEnv *semEnv)
   6.865 +//inline 
   6.866 +void
   6.867 +handleReceiveFromTo( VSsLangReq *langReq, VSsLangEnv *langEnv)
   6.868   { SlaveVP     *senderSlv, *receiverSlv;
   6.869     int32       *senderID,  *receiverID;
   6.870     int32       *key, keySz, receiverIDNumInt, senderIDNumInt;
   6.871 -   VSsSemReq   *waitingReq;
   6.872 +   VSsLangReq   *waitingReq;
   6.873     HashEntry   *entry;
   6.874 -   HashTable   *commHashTbl = semEnv->commHashTbl;
   6.875 +   HashTable   *commHashTbl = langEnv->commHashTbl;
   6.876  
   6.877 -         DEBUG__printf2(dbgRqstHdlr,"RecFromTo req from ID: %d to ID: %d",semReq->senderID[1],semReq->receiverID[1])
   6.878 +         DEBUG__printf2(dbgRqstHdlr,"RecFromTo req from ID: %d to ID: %d",langReq->senderID[1],langReq->receiverID[1])
   6.879     
   6.880 -   receiverID  = semReq->receiverID; //For "send", know both send & recv procrs
   6.881 -   senderID    = semReq->senderID;
   6.882 -   receiverSlv = semReq->receiverSlv;
   6.883 +   receiverID  = langReq->receiverID; //For "send", know both send & recv procrs
   6.884 +   senderID    = langReq->senderID;
   6.885 +   receiverSlv = langReq->receiverSlv;
   6.886     
   6.887     receiverIDNumInt = receiverID[0] + 1; //pos 0 doesn't include itself
   6.888     senderIDNumInt   = senderID[0] + 1;
   6.889 @@ -970,24 +1067,24 @@
   6.890     memcpy( &key[1], receiverID, receiverIDNumInt * sizeof(int32) );
   6.891     memcpy( &key[1 + receiverIDNumInt], senderID, senderIDNumInt * sizeof(int32));
   6.892  
   6.893 -   entry = giveEntryElseInsertReqst32( key, semReq, commHashTbl );
   6.894 +   entry = giveEntryElseInsertReqst32( key, langReq, commHashTbl );
   6.895     if( entry == NULL ) //was just inserted, means task has to wait
   6.896      { return;
   6.897      }
   6.898  
   6.899 -   waitingReq = (VSsSemReq *)entry->content;
   6.900 +   waitingReq = (VSsLangReq *)entry->content;
   6.901  
   6.902        //At this point, know have a request to rendez-vous -- should be send
   6.903     if( waitingReq->reqType == send_from_to )
   6.904      {    //waiting request is a send, so pair it with this receive
   6.905        #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
   6.906          Dependency newD;
   6.907 -        newD.from_vp = sendPr->slaveID;
   6.908 +        newD.from_vp = sendPr->slaveNum;
   6.909          newD.from_task = sendPr->numTimesAssignedToASlot;
   6.910 -        newD.to_vp = receivePr->slaveID;
   6.911 +        newD.to_vp = receivePr->slaveNum;
   6.912          newD.to_task = receivePr->numTimesAssignedToASlot +1;
   6.913 -        //addToListOfArraysDependency(newD,semEnv->commDependenciesList);  
   6.914 -        addToListOfArrays(Dependency,newD,semEnv->commDependenciesList);    
   6.915 +        //addToListOfArraysDependency(newD,langEnv->commDependenciesList);  
   6.916 +        addToListOfArrays(Dependency,newD,langEnv->commDependenciesList);    
   6.917        #endif
   6.918        
   6.919           //have receiver slave, now set sender slave
   6.920 @@ -1005,8 +1102,8 @@
   6.921           //bring both processors back from suspend
   6.922        PR_PI__free( waitingReq );
   6.923  
   6.924 -      resume_slaveVP( senderSlv,   semEnv );
   6.925 -      resume_slaveVP( receiverSlv, semEnv );
   6.926 +      resume_slaveVP( senderSlv,   langEnv );
   6.927 +      resume_slaveVP( receiverSlv, langEnv );
   6.928  
   6.929        return;
   6.930      }
   6.931 @@ -1017,18 +1114,19 @@
   6.932  /*Waits for all tasks that are direct children to end, then resumes calling
   6.933   * task or thread
   6.934   */
   6.935 -inline void
   6.936 -handleTaskwait( VSsSemReq *semReq, SlaveVP *requestingSlv, VSsSemEnv *semEnv)
   6.937 +//inline 
   6.938 +void
   6.939 +handleTaskwait( VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv)
   6.940   { VSsTaskStub* taskStub;
   6.941   
   6.942              DEBUG__printf1(dbgRqstHdlr,"Taskwait request from processor %d",
   6.943 -                                                      requestingSlv->slaveID)
   6.944 +                                                      requestingSlv->slaveNum)
   6.945      
   6.946 -   taskStub = (VSsTaskStub *)PR_PI__give_lang_meta_task( requestingSlv, VSs_MAGIC_NUMBER);
   6.947 +   taskStub = (VSsTaskStub *)PR_PI__give_lang_meta_task_from_slave__ML( requestingSlv, VSs_MAGIC_NUMBER);
   6.948     
   6.949     if( taskStub->numLiveChildTasks == 0 )
   6.950      {    //nobody to wait for, resume
   6.951 -      resume_slaveVP( requestingSlv, semEnv );
   6.952 +      resume_slaveVP( requestingSlv, langEnv );
   6.953      }
   6.954     else  //have to wait, mark waiting
   6.955      {        
   6.956 @@ -1041,24 +1139,24 @@
   6.957  /*
   6.958   */
   6.959  void
   6.960 -handleMalloc( VSsSemReq *semReq, SlaveVP *requestingSlv, VSsSemEnv *semEnv )
   6.961 +handleMalloc( VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv )
   6.962   { void *ptr;
   6.963   
   6.964 -      DEBUG__printf1(dbgRqstHdlr,"Malloc request from processor %d",requestingSlv->slaveID)
   6.965 +      DEBUG__printf1(dbgRqstHdlr,"Malloc request from processor %d",requestingSlv->slaveNum)
   6.966  
   6.967 -   ptr = PR_PI__malloc( semReq->sizeToMalloc );
   6.968 +   ptr = PR_PI__malloc( langReq->sizeToMalloc );
   6.969     requestingSlv->dataRetFromReq = ptr;
   6.970 -   resume_slaveVP( requestingSlv, semEnv );
   6.971 +   resume_slaveVP( requestingSlv, langEnv );
   6.972   }
   6.973  
   6.974  /*
   6.975   */
   6.976  void
   6.977 -handleFree( VSsSemReq *semReq, SlaveVP *requestingSlv, VSsSemEnv *semEnv )
   6.978 +handleFree( VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv )
   6.979   {
   6.980 -         DEBUG__printf1(dbgRqstHdlr,"Free request from processor %d",requestingSlv->slaveID)
   6.981 -   PR_PI__free( semReq->ptrToFree );
   6.982 -   resume_slaveVP( requestingSlv, semEnv );
   6.983 +         DEBUG__printf1(dbgRqstHdlr,"Free request from processor %d",requestingSlv->slaveNum)
   6.984 +   PR_PI__free( langReq->ptrToFree );
   6.985 +   resume_slaveVP( requestingSlv, langEnv );
   6.986   }
   6.987  
   6.988  
   6.989 @@ -1067,14 +1165,15 @@
   6.990  /*Uses ID as index into array of flags.  If flag already set, resumes from
   6.991   * end-label.  Else, sets flag and resumes normally.
   6.992   */
   6.993 -void inline
   6.994 +void 
   6.995 +//inline
   6.996  handleStartSingleton_helper( VSsSingleton *singleton, SlaveVP *reqstingSlv,
   6.997 -                             VSsSemEnv    *semEnv )
   6.998 +                             VSsLangEnv    *langEnv )
   6.999   {
  6.1000     if( singleton->hasFinished )
  6.1001      {    //the code that sets the flag to true first sets the end instr addr
  6.1002        reqstingSlv->dataRetFromReq = singleton->endInstrAddr;
  6.1003 -      resume_slaveVP( reqstingSlv, semEnv );
  6.1004 +      resume_slaveVP( reqstingSlv, langEnv );
  6.1005        return;
  6.1006      }
  6.1007     else if( singleton->hasBeenStarted )
  6.1008 @@ -1086,42 +1185,45 @@
  6.1009      {    //hasn't been started, so this is the first attempt at the singleton
  6.1010        singleton->hasBeenStarted = TRUE;
  6.1011        reqstingSlv->dataRetFromReq = 0x0;
  6.1012 -      resume_slaveVP( reqstingSlv, semEnv );
  6.1013 +      resume_slaveVP( reqstingSlv, langEnv );
  6.1014        return;
  6.1015      }
  6.1016   }
  6.1017 -void inline
  6.1018 -handleStartFnSingleton( VSsSemReq *semReq, SlaveVP *requestingSlv,
  6.1019 -                      VSsSemEnv *semEnv )
  6.1020 +void 
  6.1021 +//inline
  6.1022 +handleStartFnSingleton( VSsLangReq *langReq, SlaveVP *requestingSlv,
  6.1023 +                      VSsLangEnv *langEnv )
  6.1024   { VSsSingleton *singleton;
  6.1025 -         DEBUG__printf1(dbgRqstHdlr,"StartFnSingleton request from processor %d",requestingSlv->slaveID)
  6.1026 +         DEBUG__printf1(dbgRqstHdlr,"StartFnSingleton request from processor %d",requestingSlv->slaveNum)
  6.1027  
  6.1028 -   singleton = &(semEnv->fnSingletons[ semReq->singletonID ]);
  6.1029 -   handleStartSingleton_helper( singleton, requestingSlv, semEnv );
  6.1030 +   singleton = &(langEnv->fnSingletons[ langReq->singletonID ]);
  6.1031 +   handleStartSingleton_helper( singleton, requestingSlv, langEnv );
  6.1032   }
  6.1033 -void inline
  6.1034 -handleStartDataSingleton( VSsSemReq *semReq, SlaveVP *requestingSlv,
  6.1035 -                      VSsSemEnv *semEnv )
  6.1036 +void 
  6.1037 +//inline
  6.1038 +handleStartDataSingleton( VSsLangReq *langReq, SlaveVP *requestingSlv,
  6.1039 +                      VSsLangEnv *langEnv )
  6.1040   { VSsSingleton *singleton;
  6.1041  
  6.1042 -         DEBUG__printf1(dbgRqstHdlr,"StartDataSingleton request from processor %d",requestingSlv->slaveID)
  6.1043 -   if( *(semReq->singletonPtrAddr) == NULL )
  6.1044 +         DEBUG__printf1(dbgRqstHdlr,"StartDataSingleton request from processor %d",requestingSlv->slaveNum)
  6.1045 +   if( *(langReq->singletonPtrAddr) == NULL )
  6.1046      { singleton                 = PR_PI__malloc( sizeof(VSsSingleton) );
  6.1047        singleton->waitQ          = makePRQ();
  6.1048        singleton->endInstrAddr   = 0x0;
  6.1049        singleton->hasBeenStarted = FALSE;
  6.1050        singleton->hasFinished    = FALSE;
  6.1051 -      *(semReq->singletonPtrAddr)  = singleton;
  6.1052 +      *(langReq->singletonPtrAddr)  = singleton;
  6.1053      }
  6.1054     else
  6.1055 -      singleton = *(semReq->singletonPtrAddr);
  6.1056 -   handleStartSingleton_helper( singleton, requestingSlv, semEnv );
  6.1057 +      singleton = *(langReq->singletonPtrAddr);
  6.1058 +   handleStartSingleton_helper( singleton, requestingSlv, langEnv );
  6.1059   }
  6.1060  
  6.1061  
  6.1062 -void inline
  6.1063 +void 
  6.1064 +//inline
  6.1065  handleEndSingleton_helper( VSsSingleton *singleton, SlaveVP *requestingSlv,
  6.1066 -                           VSsSemEnv    *semEnv )
  6.1067 +                           VSsLangEnv    *langEnv )
  6.1068   { PrivQueueStruc *waitQ;
  6.1069     int32           numWaiting, i;
  6.1070     SlaveVP      *resumingSlv;
  6.1071 @@ -1139,33 +1241,33 @@
  6.1072      {    //they will resume inside start singleton, then jmp to end singleton
  6.1073        resumingSlv = readPrivQ( waitQ );
  6.1074        resumingSlv->dataRetFromReq = singleton->endInstrAddr;
  6.1075 -      resume_slaveVP( resumingSlv, semEnv );
  6.1076 +      resume_slaveVP( resumingSlv, langEnv );
  6.1077      }
  6.1078  
  6.1079 -   resume_slaveVP( requestingSlv, semEnv );
  6.1080 +   resume_slaveVP( requestingSlv, langEnv );
  6.1081  
  6.1082  }
  6.1083 -void inline
  6.1084 -handleEndFnSingleton( VSsSemReq *semReq, SlaveVP *requestingSlv,
  6.1085 -                        VSsSemEnv *semEnv )
  6.1086 +void
  6.1087 +handleEndFnSingleton( VSsLangReq *langReq, SlaveVP *requestingSlv,
  6.1088 +                        VSsLangEnv *langEnv )
  6.1089   {
  6.1090     VSsSingleton   *singleton;
  6.1091  
  6.1092 -         DEBUG__printf1(dbgRqstHdlr,"EndFnSingleton request from processor %d",requestingSlv->slaveID)
  6.1093 +         DEBUG__printf1(dbgRqstHdlr,"EndFnSingleton request from processor %d",requestingSlv->slaveNum)
  6.1094     
  6.1095 -   singleton = &(semEnv->fnSingletons[ semReq->singletonID ]);
  6.1096 -   handleEndSingleton_helper( singleton, requestingSlv, semEnv );
  6.1097 +   singleton = &(langEnv->fnSingletons[ langReq->singletonID ]);
  6.1098 +   handleEndSingleton_helper( singleton, requestingSlv, langEnv );
  6.1099    }
  6.1100 -void inline
  6.1101 -handleEndDataSingleton( VSsSemReq *semReq, SlaveVP *requestingSlv,
  6.1102 -                        VSsSemEnv *semEnv )
  6.1103 +void
  6.1104 +handleEndDataSingleton( VSsLangReq *langReq, SlaveVP *requestingSlv,
  6.1105 +                        VSsLangEnv *langEnv )
  6.1106   {
  6.1107     VSsSingleton   *singleton;
  6.1108  
  6.1109 -         DEBUG__printf1(dbgRqstHdlr,"EndDataSingleton request from processor %d",requestingSlv->slaveID)
  6.1110 +         DEBUG__printf1(dbgRqstHdlr,"EndDataSingleton request from processor %d",requestingSlv->slaveNum)
  6.1111     
  6.1112 -   singleton = *(semReq->singletonPtrAddr);
  6.1113 -   handleEndSingleton_helper( singleton, requestingSlv, semEnv );
  6.1114 +   singleton = *(langReq->singletonPtrAddr);
  6.1115 +   handleEndSingleton_helper( singleton, requestingSlv, langEnv );
  6.1116    }
  6.1117  
  6.1118  
  6.1119 @@ -1173,11 +1275,11 @@
  6.1120   * pointer out of the request and call it, then resume the VP.
  6.1121   */
  6.1122  void
  6.1123 -handleAtomic( VSsSemReq *semReq, SlaveVP *requestingSlv, VSsSemEnv *semEnv )
  6.1124 +handleAtomic( VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv )
  6.1125   {
  6.1126 -         DEBUG__printf1(dbgRqstHdlr,"Atomic request from processor %d",requestingSlv->slaveID)
  6.1127 -   semReq->fnToExecInMaster( semReq->dataForFn );
  6.1128 -   resume_slaveVP( requestingSlv, semEnv );
  6.1129 +         DEBUG__printf1(dbgRqstHdlr,"Atomic request from processor %d",requestingSlv->slaveNum)
  6.1130 +   langReq->fnToExecInMaster( langReq->dataForFn );
  6.1131 +   resume_slaveVP( requestingSlv, langEnv );
  6.1132   }
  6.1133  
  6.1134  /*First, it looks at the VP's semantic data, to see the highest transactionID
  6.1135 @@ -1195,35 +1297,35 @@
  6.1136   *If NULL, then write requesting into the field and resume.
  6.1137   */
  6.1138  void
  6.1139 -handleTransStart( VSsSemReq *semReq, SlaveVP *requestingSlv,
  6.1140 -                  VSsSemEnv *semEnv )
  6.1141 - { VSsSemData *semData;
  6.1142 +handleTransStart( VSsLangReq *langReq, SlaveVP *requestingSlv,
  6.1143 +                  VSsLangEnv *langEnv )
  6.1144 + { VSsLangData *langData;
  6.1145     TransListElem *nextTransElem;
  6.1146  
  6.1147 -         DEBUG__printf1(dbgRqstHdlr,"TransStart request from processor %d",requestingSlv->slaveID)
  6.1148 +         DEBUG__printf1(dbgRqstHdlr,"TransStart request from processor %d",requestingSlv->slaveNum)
  6.1149     
  6.1150        //check ordering of entering transactions is correct
  6.1151 -   semData = requestingSlv->semanticData;
  6.1152 -   if( semData->highestTransEntered > semReq->transID )
  6.1153 +   langData = requestingSlv->langData;
  6.1154 +   if( langData->highestTransEntered > langReq->transID )
  6.1155      {    //throw PR exception, which shuts down PR.
  6.1156        PR_PI__throw_exception( "transID smaller than prev", requestingSlv, NULL);
  6.1157      }
  6.1158        //add this trans ID to the list of transactions entered -- check when
  6.1159        // end a transaction
  6.1160 -   semData->highestTransEntered = semReq->transID;
  6.1161 +   langData->highestTransEntered = langReq->transID;
  6.1162     nextTransElem = PR_PI__malloc( sizeof(TransListElem) );
  6.1163 -   nextTransElem->transID = semReq->transID;
  6.1164 -   nextTransElem->nextTrans = semData->lastTransEntered;
  6.1165 -   semData->lastTransEntered = nextTransElem;
  6.1166 +   nextTransElem->transID = langReq->transID;
  6.1167 +   nextTransElem->nextTrans = langData->lastTransEntered;
  6.1168 +   langData->lastTransEntered = nextTransElem;
  6.1169  
  6.1170        //get the structure for this transaction ID
  6.1171     VSsTrans *
  6.1172 -   transStruc = &(semEnv->transactionStrucs[ semReq->transID ]);
  6.1173 +   transStruc = &(langEnv->transactionStrucs[ langReq->transID ]);
  6.1174  
  6.1175     if( transStruc->VPCurrentlyExecuting == NULL )
  6.1176      {
  6.1177        transStruc->VPCurrentlyExecuting = requestingSlv;
  6.1178 -      resume_slaveVP( requestingSlv, semEnv );
  6.1179 +      resume_slaveVP( requestingSlv, langEnv );
  6.1180      }
  6.1181     else
  6.1182      {    //note, might make future things cleaner if save request with VP and
  6.1183 @@ -1248,15 +1350,15 @@
  6.1184   * resume both.
  6.1185   */
  6.1186  void
  6.1187 -handleTransEnd(VSsSemReq *semReq, SlaveVP *requestingSlv, VSsSemEnv *semEnv)
  6.1188 - { VSsSemData    *semData;
  6.1189 +handleTransEnd(VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv)
  6.1190 + { VSsLangData    *langData;
  6.1191     SlaveVP     *waitingSlv;
  6.1192     VSsTrans      *transStruc;
  6.1193     TransListElem *lastTrans;
  6.1194     
  6.1195 -         DEBUG__printf1(dbgRqstHdlr,"TransEnd request from processor %d",requestingSlv->slaveID)
  6.1196 +         DEBUG__printf1(dbgRqstHdlr,"TransEnd request from processor %d",requestingSlv->slaveNum)
  6.1197     
  6.1198 -   transStruc = &(semEnv->transactionStrucs[ semReq->transID ]);
  6.1199 +   transStruc = &(langEnv->transactionStrucs[ langReq->transID ]);
  6.1200  
  6.1201        //make sure transaction ended in same VP as started it.
  6.1202     if( transStruc->VPCurrentlyExecuting != requestingSlv )
  6.1203 @@ -1265,21 +1367,21 @@
  6.1204      }
  6.1205  
  6.1206        //make sure nesting is correct -- last ID entered should == this ID
  6.1207 -   semData = requestingSlv->semanticData;
  6.1208 -   lastTrans = semData->lastTransEntered;
  6.1209 -   if( lastTrans->transID != semReq->transID )
  6.1210 +   langData = requestingSlv->langData;
  6.1211 +   lastTrans = langData->lastTransEntered;
  6.1212 +   if( lastTrans->transID != langReq->transID )
  6.1213      {
  6.1214        PR_PI__throw_exception( "trans incorrectly nested", requestingSlv, NULL );
  6.1215      }
  6.1216  
  6.1217 -   semData->lastTransEntered = semData->lastTransEntered->nextTrans;
  6.1218 +   langData->lastTransEntered = langData->lastTransEntered->nextTrans;
  6.1219  
  6.1220  
  6.1221     waitingSlv = readPrivQ( transStruc->waitingVPQ );
  6.1222     transStruc->VPCurrentlyExecuting = waitingSlv;
  6.1223  
  6.1224     if( waitingSlv != NULL )
  6.1225 -      resume_slaveVP( waitingSlv, semEnv );
  6.1226 +      resume_slaveVP( waitingSlv, langEnv );
  6.1227  
  6.1228 -   resume_slaveVP( requestingSlv, semEnv );
  6.1229 +   resume_slaveVP( requestingSlv, langEnv );
  6.1230   }
     7.1 --- a/VSs_Request_Handlers.h	Thu Oct 18 02:44:30 2012 -0700
     7.2 +++ b/VSs_Request_Handlers.h	Sat Jan 12 11:31:51 2013 -0800
     7.3 @@ -1,5 +1,5 @@
     7.4  /*
     7.5 - *  Copyright 2009 OpenSourceStewardshipFoundation.org
     7.6 + *  Copyright 2009 OpenSourceResearchInstitute.org
     7.7   *  Licensed under GNU General Public License version 2
     7.8   *
     7.9   * Author: seanhalle@yahoo.com
    7.10 @@ -14,46 +14,47 @@
    7.11  /*This header defines everything specific to the VSs semantic plug-in
    7.12   */
    7.13  
    7.14 +inline 
    7.15 +void *
    7.16 +handleSubmitTask( VSsLangReq *langReq, VSsLangEnv *langEnv);
    7.17  inline void
    7.18 -handleSubmitTask( VSsSemReq *semReq, VSsSemEnv *semEnv);
    7.19 +handleEndTask( VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv );
    7.20  inline void
    7.21 -handleEndTask( VSsSemReq *semReq, VSsSemEnv *semEnv);
    7.22 +handleSendTypeTo( VSsLangReq *langReq, VSsLangEnv *langEnv);
    7.23  inline void
    7.24 -handleSendTypeTo( VSsSemReq *semReq, VSsSemEnv *semEnv);
    7.25 +handleSendFromTo( VSsLangReq *langReq, VSsLangEnv *langEnv);
    7.26  inline void
    7.27 -handleSendFromTo( VSsSemReq *semReq, VSsSemEnv *semEnv);
    7.28 +handleReceiveTypeTo( VSsLangReq *langReq, VSsLangEnv *langEnv);
    7.29  inline void
    7.30 -handleReceiveTypeTo( VSsSemReq *semReq, VSsSemEnv *semEnv);
    7.31 +handleReceiveFromTo( VSsLangReq *langReq, VSsLangEnv *langEnv);
    7.32  inline void
    7.33 -handleReceiveFromTo( VSsSemReq *semReq, VSsSemEnv *semEnv);
    7.34 -inline void
    7.35 -handleTaskwait(VSsSemReq *semReq, SlaveVP *requestingSlv, VSsSemEnv *semEnv);
    7.36 +handleTaskwait(VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv);
    7.37  
    7.38  inline void
    7.39 -handleMalloc( VSsSemReq *semReq, SlaveVP *requestingSlv, VSsSemEnv *semEnv);
    7.40 +handleMalloc( VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv);
    7.41  inline void
    7.42 -handleFree( VSsSemReq *semReq, SlaveVP *requestingSlv, VSsSemEnv *semEnv );
    7.43 +handleFree( VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv );
    7.44  inline void
    7.45 -handleTransEnd(VSsSemReq *semReq, SlaveVP *requestingSlv, VSsSemEnv*semEnv);
    7.46 +handleTransEnd(VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv*langEnv);
    7.47  inline void
    7.48 -handleTransStart( VSsSemReq *semReq, SlaveVP *requestingSlv,
    7.49 -                  VSsSemEnv *semEnv );
    7.50 +handleTransStart( VSsLangReq *langReq, SlaveVP *requestingSlv,
    7.51 +                  VSsLangEnv *langEnv );
    7.52  inline void
    7.53 -handleAtomic( VSsSemReq *semReq, SlaveVP *requestingSlv, VSsSemEnv *semEnv);
    7.54 +handleAtomic( VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv);
    7.55  inline void
    7.56 -handleStartFnSingleton( VSsSemReq *semReq, SlaveVP *reqstingSlv,
    7.57 -                      VSsSemEnv *semEnv );
    7.58 +handleStartFnSingleton( VSsLangReq *langReq, SlaveVP *reqstingSlv,
    7.59 +                      VSsLangEnv *langEnv );
    7.60  inline void
    7.61 -handleEndFnSingleton( VSsSemReq *semReq, SlaveVP *requestingSlv,
    7.62 -                    VSsSemEnv *semEnv );
    7.63 +handleEndFnSingleton( VSsLangReq *langReq, SlaveVP *requestingSlv,
    7.64 +                    VSsLangEnv *langEnv );
    7.65  inline void
    7.66 -handleStartDataSingleton( VSsSemReq *semReq, SlaveVP *reqstingSlv,
    7.67 -                      VSsSemEnv *semEnv );
    7.68 +handleStartDataSingleton( VSsLangReq *langReq, SlaveVP *reqstingSlv,
    7.69 +                      VSsLangEnv *langEnv );
    7.70  inline void
    7.71 -handleEndDataSingleton( VSsSemReq *semReq, SlaveVP *requestingSlv,
    7.72 -                    VSsSemEnv *semEnv );
    7.73 +handleEndDataSingleton( VSsLangReq *langReq, SlaveVP *requestingSlv,
    7.74 +                    VSsLangEnv *langEnv );
    7.75  inline void
    7.76 -free_task_stub( PRMetaTask *stubToFree );
    7.77 +free_task_stub( VSsTaskStub *stubToFree );
    7.78  
    7.79  
    7.80  #endif	/* _VSs_REQ_H */
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/VSs_SS.c	Sat Jan 12 11:31:51 2013 -0800
     8.3 @@ -0,0 +1,268 @@
     8.4 +/*
     8.5 + * Copyright 2010  OpenSourceCodeStewardshipFoundation
     8.6 + *
     8.7 + * Licensed under BSD
     8.8 + */
     8.9 +
    8.10 +#include <stdio.h>
    8.11 +#include <stdlib.h>
    8.12 +#include <malloc.h>
    8.13 +
    8.14 +#include "Queue_impl/PrivateQueue.h"
    8.15 +#include "Hash_impl/PrivateHash.h"
    8.16 +
    8.17 +#include "VSs.h"
    8.18 +#include "Measurement/VSs_Counter_Recording.h"
    8.19 +
    8.20 +//==========================================================================
    8.21 +
    8.22 +
    8.23 +
    8.24 +//===========================================================================
    8.25 +
    8.26 +/*
    8.27 + */
    8.28 +void
    8.29 +VSs__start( SlaveVP *seedSlv )
    8.30 + { VSsLangEnv       *langEnv;
    8.31 +   int32             i, coreNum, slotNum;
    8.32 +   VSsLangData       *langData;
    8.33 +   VSsTaskStub      *threadTaskStub, *parentTaskStub;
    8.34 +   
    8.35 +   langEnv = 
    8.36 +         PR_SS__create_lang_env( sizeof(VSsLangEnv), seedSlv, VSs_MAGIC_NUMBER);
    8.37 +   
    8.38 +      //seed slave is a thread slave, so make a thread's task stub for it
    8.39 +      // and then make another to stand for the seed's parent task.  Make
    8.40 +      // the parent be already ended, and have one child (the seed).  This
    8.41 +      // will make the dissipate handler do the right thing when the seed
    8.42 +      // is dissipated.
    8.43 +   threadTaskStub = 
    8.44 +    PR_int__create_lang_meta_task_in_slave__ML( sizeof(VSsTaskStub), seedSlv, VSs_MAGIC_NUMBER );
    8.45 +
    8.46 +   threadTaskStub->isEnded = FALSE;
    8.47 +   threadTaskStub->isWaitingForChildTasksToEnd = FALSE;
    8.48 +   
    8.49 +   parentTaskStub =
    8.50 +    PR_int__create_lang_meta_task__ML(sizeof(VSsTaskStub), seedSlv, VSs_MAGIC_NUMBER);
    8.51 +   
    8.52 +   parentTaskStub->isEnded = TRUE;
    8.53 +   parentTaskStub->numLiveChildThreads = 1; //so dissipate works for seed
    8.54 +   threadTaskStub->parentTaskStub = parentTaskStub;
    8.55 +      //Note: threadTaskStub and parentTaskStub freed when dissipate seedSlv 
    8.56 +   
    8.57 +      //register the langlet's handlers with PR
    8.58 +/*
    8.59 +   PR_SS__register_create_task_handler(     &createTaskHandler, seedVP, VSs_MAGIC_NUMBER );
    8.60 +   PR_SS__register_end_task_handler(        &endTaskHandler, seedVP, VSs_MAGIC_NUMBER );
    8.61 +   PR_SS__register_create_slave_handler(    &createThreadHandler, seedVP, VSs_MAGIC_NUMBER );
    8.62 +   PR_SS__register_dissipate_slave_handler( &endThreadHandler, seedVP, VSs_MAGIC_NUMBER );
    8.63 +   RequestHandler createInitialLangDataFn;
    8.64 +   RequestHandler resetLangDataFn;
    8.65 +*/
    8.66 +   PR_SS__register_request_handler(         &VSs__Request_Handler, seedSlv, VSs_MAGIC_NUMBER );
    8.67 +   PR_SS__register_assigner(                &VSs__assign_work_to_slot, seedSlv, VSs_MAGIC_NUMBER );
    8.68 +   PR_SS__register_shutdown_handler(        &VSs__shutdown, seedSlv, VSs_MAGIC_NUMBER );
    8.69 +
    8.70 +   #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
    8.71 +   _PRTopEnv->counterHandler = &VSs__counter_handler;
    8.72 +   VSs__init_counter_data_structs();
    8.73 +   #endif
    8.74 +
    8.75 +
    8.76 +      //create the ready queues, hash tables used for matching and so forth
    8.77 +   langEnv->slavesReadyToResumeQ = makePRQ();
    8.78 +   langEnv->taskReadyQ           = makePRQ();
    8.79 +   
    8.80 +   langEnv->argPtrHashTbl  = makeHashTable32( 16, &PR_int__free );
    8.81 +   langEnv->commHashTbl    = makeHashTable32( 16, &PR_int__free );
    8.82 +   
    8.83 +   langEnv->nextCoreToGetNewSlv = 0;
    8.84 +   
    8.85 +
    8.86 +   //TODO: bug -- turn these arrays into dyn arrays to eliminate limit
    8.87 +   //langEnv->singletonHasBeenExecutedFlags = makeDynArrayInfo( );
    8.88 +   //langEnv->transactionStrucs = makeDynArrayInfo( );
    8.89 +   for( i = 0; i < NUM_STRUCS_IN_LANG_ENV; i++ )
    8.90 +    {
    8.91 +      langEnv->fnSingletons[i].endInstrAddr      = NULL;
    8.92 +      langEnv->fnSingletons[i].hasBeenStarted    = FALSE;
    8.93 +      langEnv->fnSingletons[i].hasFinished       = FALSE;
    8.94 +      langEnv->fnSingletons[i].waitQ             = makePRQ();
    8.95 +      langEnv->transactionStrucs[i].waitingVPQ   = makePRQ();
    8.96 +    }
    8.97 +
    8.98 +
    8.99 +   #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
   8.100 +   langEnv->unitList = makeListOfArrays(sizeof(Unit),128);
   8.101 +   langEnv->ctlDependenciesList = makeListOfArrays(sizeof(Dependency),128);
   8.102 +   langEnv->commDependenciesList = makeListOfArrays(sizeof(Dependency),128);
   8.103 +   langEnv->dynDependenciesList = makeListOfArrays(sizeof(Dependency),128);
   8.104 +   langEnv->ntonGroupsInfo = makePrivDynArrayOfSize((void***)&(langEnv->ntonGroups),8);
   8.105 +   
   8.106 +   langEnv->hwArcs = makeListOfArrays(sizeof(Dependency),128);
   8.107 +   memset(langEnv->last_in_slot,0,sizeof(NUM_CORES * NUM_ANIM_SLOTS * sizeof(Unit)));
   8.108 +   #endif
   8.109 + }
   8.110 +
   8.111 +
   8.112 +/*This shuts down the langket
   8.113 + * Frees any memory allocated by VSs__init() and deletes any slaves or tasks
   8.114 + * still in ready Qs.
   8.115 + */
   8.116 +void
   8.117 +VSs__shutdown( void *_langEnv )
   8.118 + { VSsLangEnv *langEnv = (VSsLangEnv *)_langEnv;
   8.119 +   
   8.120 +   #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
   8.121 +   //UCC
   8.122 +   FILE* output;
   8.123 +   int n;
   8.124 +   char filename[255];    
   8.125 +    for(n=0;n<255;n++)
   8.126 +    {
   8.127 +        sprintf(filename, "./counters/UCC.%d",n);
   8.128 +        output = fopen(filename,"r");
   8.129 +        if(output)
   8.130 +        {
   8.131 +            fclose(output);
   8.132 +        }else{
   8.133 +            break;
   8.134 +        }
   8.135 +    }
   8.136 +   if(n<255){
   8.137 +    printf("Saving UCC to File: %s ...\n", filename);
   8.138 +    output = fopen(filename,"w+");
   8.139 +    if(output!=NULL){
   8.140 +        set_dependency_file(output);
   8.141 +        //fprintf(output,"digraph Dependencies {\n");
   8.142 +        //set_dot_file(output);
   8.143 +        //FIXME:  first line still depends on counters being enabled, replace w/ unit struct!
   8.144 +        //forAllInDynArrayDo(_PRTopEnv->counter_history_array_info, &print_dot_node_info );
   8.145 +        forAllInListOfArraysDo(langEnv->unitList, &print_unit_to_file);
   8.146 +        forAllInListOfArraysDo( langEnv->commDependenciesList, &print_comm_dependency_to_file );
   8.147 +        forAllInListOfArraysDo( langEnv->ctlDependenciesList, &print_ctl_dependency_to_file );
   8.148 +        forAllInDynArrayDo(langEnv->ntonGroupsInfo,&print_nton_to_file);
   8.149 +        //fprintf(output,"}\n");
   8.150 +        fflush(output);
   8.151 +
   8.152 +    } else
   8.153 +        printf("Opening UCC file failed. Please check that folder \"counters\" exists in run directory and has write permission.\n");
   8.154 +   } else {
   8.155 +       printf("Could not open UCC file, please clean \"counters\" folder. (Must contain less than 255 files.)\n");
   8.156 +   }
   8.157 +   //Loop Graph
   8.158 +   for(n=0;n<255;n++)
   8.159 +    {
   8.160 +        sprintf(filename, "./counters/LoopGraph.%d",n);
   8.161 +        output = fopen(filename,"r");
   8.162 +        if(output)
   8.163 +        {
   8.164 +            fclose(output);
   8.165 +        }else{
   8.166 +            break;
   8.167 +        }
   8.168 +    }
   8.169 +   if(n<255){
   8.170 +    printf("Saving LoopGraph to File: %s ...\n", filename);
   8.171 +    output = fopen(filename,"w+");
   8.172 +    if(output!=NULL){
   8.173 +        set_dependency_file(output);
   8.174 +        //fprintf(output,"digraph Dependencies {\n");
   8.175 +        //set_dot_file(output);
   8.176 +        //FIXME:  first line still depends on counters being enabled, replace w/ unit struct!
   8.177 +        //forAllInDynArrayDo(_PRTopEnv->counter_history_array_info, &print_dot_node_info );
   8.178 +        forAllInListOfArraysDo( langEnv->unitList, &print_unit_to_file );
   8.179 +        forAllInListOfArraysDo( langEnv->commDependenciesList, &print_comm_dependency_to_file );
   8.180 +        forAllInListOfArraysDo( langEnv->ctlDependenciesList, &print_ctl_dependency_to_file );
   8.181 +        forAllInListOfArraysDo( langEnv->dynDependenciesList, &print_dyn_dependency_to_file );
   8.182 +        forAllInListOfArraysDo( langEnv->hwArcs, &print_hw_dependency_to_file );
   8.183 +        //fprintf(output,"}\n");
   8.184 +        fflush(output);
   8.185 +
   8.186 +    } else
   8.187 +        printf("Opening LoopGraph file failed. Please check that folder \"counters\" exists in run directory and has write permission.\n");
   8.188 +   } else {
   8.189 +       printf("Could not open LoopGraph file, please clean \"counters\" folder. (Must contain less than 255 files.)\n");
   8.190 +   }
   8.191 +   
   8.192 +   
   8.193 +   freeListOfArrays(langEnv->unitList);
   8.194 +   freeListOfArrays(langEnv->commDependenciesList);
   8.195 +   freeListOfArrays(langEnv->ctlDependenciesList);
   8.196 +   freeListOfArrays(langEnv->dynDependenciesList);
   8.197 +   
   8.198 +   #endif
   8.199 +#ifdef HOLISTIC__TURN_ON_PERF_COUNTERS    
   8.200 +    for(n=0;n<255;n++)
   8.201 +    {
   8.202 +        sprintf(filename, "./counters/Counters.%d.csv",n);
   8.203 +        output = fopen(filename,"r");
   8.204 +        if(output)
   8.205 +        {
   8.206 +            fclose(output);
   8.207 +        }else{
   8.208 +            break;
   8.209 +        }
   8.210 +    }
   8.211 +    if(n<255){
   8.212 +    printf("Saving Counter measurements to File: %s ...\n", filename);
   8.213 +    output = fopen(filename,"w+");
   8.214 +    if(output!=NULL){
   8.215 +        set_counter_file(output);
   8.216 +        int i;
   8.217 +        for(i=0;i<NUM_CORES;i++){
   8.218 +            forAllInListOfArraysDo( langEnv->counterList[i], &print_counter_events_to_file );
   8.219 +            fflush(output);
   8.220 +        }
   8.221 +
   8.222 +    } else
   8.223 +        printf("Opening UCC file failed. Please check that folder \"counters\" exists in run directory and has write permission.\n");
   8.224 +   } else {
   8.225 +       printf("Could not open UCC file, please clean \"counters\" folder. (Must contain less than 255 files.)\n");
   8.226 +   }
   8.227 +    
   8.228 +#endif
   8.229 +   
   8.230 +   //Things to free:
   8.231 +   // tasks and slaves in ready Qs
   8.232 +   // ready Qs
   8.233 +   // tasks and slaves in the comm hash table
   8.234 +   // comm hash table
   8.235 +   // tasks in the argPtrHashTbl
   8.236 +   // the argPtrHashTbl
   8.237 +   PrivQueueStruc *queue;
   8.238 +   SlaveVP *slave;
   8.239 +   VSsTaskStub *task;
   8.240 +   
   8.241 +   queue = langEnv->slavesReadyToResumeQ;
   8.242 +   slave = readPrivQ( queue );
   8.243 +   while( slave != NULL )
   8.244 +    { handleShutdownDissipate(slave);
   8.245 +      PR_int__recycle_slave__ML( slave ); //recycler is for all of PR
   8.246 +      slave = readPrivQ( queue );
   8.247 +    }
   8.248 +   freePrivQ( queue );
   8.249 +   
   8.250 +   queue = langEnv->taskReadyQ;
   8.251 +   task = readPrivQ( queue );
   8.252 +   while( task != NULL )
   8.253 +    { handleFreeTask( task );
   8.254 +      task = readPrivQ( queue );
   8.255 +    }
   8.256 +   freePrivQ( queue );
   8.257 +   
   8.258 +   freeHashTable( langEnv->commHashTbl );   
   8.259 +   freeHashTable( langEnv->argPtrHashTbl );
   8.260 +   
   8.261 +   int32 i;
   8.262 +   for( i = 0; i < NUM_STRUCS_IN_LANG_ENV; i++ )
   8.263 +    {
   8.264 +      freePrivQ( langEnv->fnSingletons[i].waitQ );
   8.265 +      freePrivQ( langEnv->transactionStrucs[i].waitingVPQ );
   8.266 +    }
   8.267 +   
   8.268 +   PR_int__free_lang_env( langEnv ); 
   8.269 + }
   8.270 +
   8.271 +