Mercurial > cgi-bin > hgwebdir.cgi > VMS > VMS_Implementations > VSs_impls > VSs__MC_shared_impl
changeset 28:91caa8a9d591 ML_dev
Back to compile process, fixing compile errors
| author | Sean Halle <seanhalle@yahoo.com> |
|---|---|
| date | Tue, 05 Feb 2013 20:24:25 -0800 |
| parents | 3b30da4643d1 |
| children | dd1efbf29ff9 |
| files | VSs.c VSs.h VSs_PluginFns.c VSs_Request_Handlers.c VSs_Request_Handlers.h VSs_SS.c |
| diffstat | 6 files changed, 179 insertions(+), 163 deletions(-) [+] |
line diff
1.1 --- a/VSs.c Sat Jan 12 11:31:51 2013 -0800 1.2 +++ b/VSs.c Tue Feb 05 20:24:25 2013 -0800 1.3 @@ -161,7 +161,7 @@ 1.4 reqData.fnPtr = fnPtr; 1.5 reqData.initData = initData; 1.6 1.7 - PR_WL__send_create_slaveVP_req( &reqData, thdID, &handleCreateThd, 1.8 + PR_WL__send_create_slaveVP_req( &reqData, thdID, (CreateHandler)&handleCreateThd, 1.9 creatingThd, VSs_MAGIC_NUMBER ); 1.10 return (SlaveVP *)creatingThd->dataRetFromReq; 1.11 } 1.12 @@ -177,7 +177,8 @@ 1.13 VSs__end_thread( SlaveVP *thdToEnd ) 1.14 { 1.15 //the lang request is null for VSs version of end slave 1.16 - PR_WL__send_end_slave_req( NULL, &handleDissipate, thdToEnd, VSs_MAGIC_NUMBER ); 1.17 + PR_WL__send_end_slave_req( NULL, (RequestHandler)&handleDissipate, thdToEnd, 1.18 + VSs_MAGIC_NUMBER ); 1.19 } 1.20 1.21 1.22 @@ -258,7 +259,8 @@ 1.23 reqData.reqType = taskwait; 1.24 reqData.callingSlv = animSlv; 1.25 1.26 - PR_WL__send_lang_request( &reqData, &handleTaskwait, animSlv, VSs_MAGIC_NUMBER ); 1.27 + PR_WL__send_lang_request( &reqData, (RequestHandler)&handleTaskwait, animSlv, 1.28 + VSs_MAGIC_NUMBER ); 1.29 } 1.30 1.31 1.32 @@ -266,7 +268,8 @@ 1.33 //========================== send and receive ============================ 1.34 // 1.35 1.36 -inline int32 * 1.37 +inline 1.38 +int32 * 1.39 VSs__give_self_taskID( SlaveVP *animSlv ) 1.40 { 1.41 return PR__give_ID_from_slave( animSlv, VSs_MAGIC_NUMBER ); 1.42 @@ -288,7 +291,8 @@ 1.43 1.44 reqData.nextReqInHashEntry = NULL; 1.45 1.46 - PR_WL__send_lang_request( &reqData, &handleSendTypeTo, senderSlv, VSs_MAGIC_NUMBER ); 1.47 + PR_WL__send_lang_request( &reqData, (RequestHandler)&handleSendTypeTo, 1.48 + senderSlv, VSs_MAGIC_NUMBER ); 1.49 1.50 //When come back from suspend, no longer own data reachable from msg 1.51 } 1.52 @@ -306,7 +310,8 @@ 1.53 1.54 reqData.nextReqInHashEntry = NULL; 1.55 1.56 - PR_WL__send_lang_request( &reqData, &handleSendFromTo, senderSlv, VSs_MAGIC_NUMBER ); 1.57 + PR_WL__send_lang_request( &reqData, (RequestHandler)&handleSendFromTo, 1.58 + senderSlv, VSs_MAGIC_NUMBER ); 1.59 } 1.60 1.61 1.62 @@ -331,7 +336,8 @@ 1.63 1.64 reqData.nextReqInHashEntry = NULL; 1.65 1.66 - PR_WL__send_lang_request( &reqData, &handleReceiveTypeTo, receiverSlv, VSs_MAGIC_NUMBER ); 1.67 + PR_WL__send_lang_request( &reqData, (RequestHandler)&handleReceiveTypeTo, 1.68 + receiverSlv, VSs_MAGIC_NUMBER ); 1.69 1.70 return receiverSlv->dataRetFromReq; 1.71 } 1.72 @@ -356,7 +362,8 @@ 1.73 reqData.nextReqInHashEntry = NULL; 1.74 DEBUG__printf2(dbgRqstHdlr,"WL: receive from %d to: %d", reqData.senderID[1], reqData.receiverID[1]); 1.75 1.76 - PR_WL__send_lang_request( &reqData, &handleReceiveFromTo, receiverSlv, VSs_MAGIC_NUMBER ); 1.77 + PR_WL__send_lang_request( &reqData, (RequestHandler)&handleReceiveFromTo, 1.78 + receiverSlv, VSs_MAGIC_NUMBER ); 1.79 1.80 return receiverSlv->dataRetFromReq; 1.81 } 1.82 @@ -392,11 +399,12 @@ 1.83 reqData.reqType = singleton_fn_start; 1.84 reqData.singletonID = singletonID; 1.85 1.86 - PR_WL__send_lang_request( &reqData, &handleStartFnSingleton, animSlv, VSs_MAGIC_NUMBER ); 1.87 + PR_WL__send_lang_request( &reqData, (RequestHandler)&handleStartFnSingleton, 1.88 + animSlv, VSs_MAGIC_NUMBER ); 1.89 if( animSlv->dataRetFromReq ) //will be 0 or addr of label in end singleton 1.90 { 1.91 VSsLangEnv *langEnv = 1.92 - PR_int__give_lang_env_for_slave__ML( animSlv, VSs_MAGIC_NUMBER ); 1.93 + PR_int__give_lang_env_for_slave( animSlv, VSs_MAGIC_NUMBER ); 1.94 asm_write_ret_from_singleton(&(langEnv->fnSingletons[ singletonID])); 1.95 } 1.96 } 1.97 @@ -416,7 +424,8 @@ 1.98 reqData.reqType = singleton_data_start; 1.99 reqData.singletonPtrAddr = singletonAddr; 1.100 1.101 - PR_WL__send_lang_request( &reqData, &handleStartDataSingleton, animSlv, VSs_MAGIC_NUMBER ); 1.102 + PR_WL__send_lang_request( &reqData, (RequestHandler)&handleStartDataSingleton, 1.103 + animSlv, VSs_MAGIC_NUMBER ); 1.104 if( animSlv->dataRetFromReq ) //either 0 or end singleton's return addr 1.105 { //Assembly code changes the return addr on the stack to the one 1.106 // saved into the singleton by the end-singleton-fn 1.107 @@ -442,14 +451,15 @@ 1.108 //don't need this addr until after at least one singleton has reached 1.109 // this function 1.110 VSsLangEnv * 1.111 - langEnv = PR_int__give_lang_env_for_slave__ML( animSlv, VSs_MAGIC_NUMBER ); 1.112 + langEnv = PR_int__give_lang_env_for_slave( animSlv, VSs_MAGIC_NUMBER ); 1.113 1.114 asm_write_ret_from_singleton(&(langEnv->fnSingletons[ singletonID])); 1.115 1.116 reqData.reqType = singleton_fn_end; 1.117 reqData.singletonID = singletonID; 1.118 1.119 - PR_WL__send_lang_request( &reqData, &handleEndFnSingleton, animSlv, VSs_MAGIC_NUMBER ); 1.120 + PR_WL__send_lang_request( &reqData, (RequestHandler)&handleEndFnSingleton, 1.121 + animSlv, VSs_MAGIC_NUMBER ); 1.122 1.123 EndSingletonInstrAddr: 1.124 return; 1.125 @@ -471,7 +481,8 @@ 1.126 reqData.reqType = singleton_data_end; 1.127 reqData.singletonPtrAddr = singletonPtrAddr; 1.128 1.129 - PR_WL__send_lang_request( &reqData, &handleEndDataSingleton, animSlv, VSs_MAGIC_NUMBER ); 1.130 + PR_WL__send_lang_request( &reqData, (RequestHandler)&handleEndDataSingleton, 1.131 + animSlv, VSs_MAGIC_NUMBER ); 1.132 } 1.133 1.134 /*This executes the function in the masterVP, so it executes in isolation 1.135 @@ -495,7 +506,8 @@ 1.136 reqData.fnToExecInMaster = ptrToFnToExecInMaster; 1.137 reqData.dataForFn = data; 1.138 1.139 - PR_WL__send_lang_request( &reqData, &handleAtomic, animSlv, VSs_MAGIC_NUMBER ); 1.140 + PR_WL__send_lang_request( &reqData, (RequestHandler)&handleAtomic, 1.141 + animSlv, VSs_MAGIC_NUMBER ); 1.142 } 1.143 1.144 1.145 @@ -522,7 +534,8 @@ 1.146 reqData.reqType = trans_start; 1.147 reqData.transID = transactionID; 1.148 1.149 - PR_WL__send_lang_request( &reqData, &handleTransStart, animSlv, VSs_MAGIC_NUMBER ); 1.150 + PR_WL__send_lang_request( &reqData, (RequestHandler)&handleTransStart, 1.151 + animSlv, VSs_MAGIC_NUMBER ); 1.152 } 1.153 1.154 /*This suspends to the master, then uses transactionID as index into an 1.155 @@ -544,7 +557,8 @@ 1.156 reqData.reqType = trans_end; 1.157 reqData.transID = transactionID; 1.158 1.159 - PR_WL__send_lang_request( &reqData, &handleTransEnd, animSlv, VSs_MAGIC_NUMBER ); 1.160 + PR_WL__send_lang_request( &reqData, (RequestHandler)&handleTransEnd, 1.161 + animSlv, VSs_MAGIC_NUMBER ); 1.162 } 1.163 1.164 //======================== Internal ==================================
2.1 --- a/VSs.h Sat Jan 12 11:31:51 2013 -0800 2.2 +++ b/VSs.h Tue Feb 05 20:24:25 2013 -0800 2.3 @@ -366,13 +366,8 @@ 2.4 SlaveVP *creatingSlv, int32 coreToAssignOnto); 2.5 2.6 //===================== ===================== 2.7 -inline 2.8 -void * 2.9 -handleSubmitTask( VSsLangReq *langReq, VSsLangEnv *langEnv ); 2.10 -inline 2.11 -void 2.12 -handleEndTask( VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv ); 2.13 2.14 +#include "VSs_Request_Handlers.h" 2.15 2.16 //===================== Measurement of Lang Overheads ===================== 2.17 #include "Measurement/VSs_Measurement.h"
3.1 --- a/VSs_PluginFns.c Sat Jan 12 11:31:51 2013 -0800 3.2 +++ b/VSs_PluginFns.c Tue Feb 05 20:24:25 2013 -0800 3.3 @@ -13,7 +13,7 @@ 3.4 3.5 //=========================== Local Fn Prototypes =========================== 3.6 void 3.7 -resume_slaveVP( SlaveVP *slave, VSsLangEnv *langEnv ); 3.8 +VSs__resume_slave( SlaveVP *slave, VSsLangEnv *langEnv ); 3.9 3.10 inline void 3.11 handleLangReq( PRReqst *req, SlaveVP *requestingSlv, VSsLangEnv *langEnv ); 3.12 @@ -51,12 +51,11 @@ 3.13 * to suspend both kinds, but also to keep explicit slave stacks clean from 3.14 * the junk tasks are allowed to leave behind. 3.15 */ 3.16 -SlaveVP * 3.17 +void 3.18 VSs__assign_work_to_slot( void *_langEnv, AnimSlot *slot ) 3.19 { SlaveVP *returnSlv; 3.20 VSsLangEnv *langEnv; 3.21 int32 coreNum, slotNum; 3.22 - PRMetaTask *returnMetaTask = NULL; 3.23 VSsTaskStub *newTaskStub; 3.24 3.25 coreNum = slot->coreSlotIsOn; 3.26 @@ -68,19 +67,26 @@ 3.27 returnSlv = readPrivQ( langEnv->slavesReadyToResumeQ ); 3.28 if( returnSlv != NULL ) //Yes, have a slave, so return it. 3.29 { returnSlv->coreAnimatedBy = coreNum; 3.30 - //returnMetaTask = returnSlv->metaTask; 3.31 - fixme; //use PR_int__put_slave_into_slot( SlaveVP *slave, AnimSlot *slot ) 3.32 - goto ReturnTheMetaTask; 3.33 + 3.34 + fixme; //check that putting into slot and call chain are correct 3.35 + PR_int__put_slave_into_slot( returnSlv, slot ); 3.36 + goto Success; 3.37 } 3.38 3.39 + //No ready slaves, so check for ready tasks 3.40 newTaskStub = readPrivQ( langEnv->taskReadyQ ); 3.41 if( newTaskStub != NULL ) 3.42 - { //returnMetaTask = newTaskStub->protoMetaTask; 3.43 - fixme; //use PR_int__put_task_into_slot( SlaveVP *slave, AnimSlot *slot ) 3.44 - goto ReturnTheMetaTask; 3.45 + { 3.46 + fixme; //check that putting into slot and call chain are correct 3.47 + PR_int__put_task_into_slot( newTaskStub, slot ); 3.48 + goto Success; 3.49 } 3.50 + 3.51 + //If here, didn't assign any work 3.52 + Fail: 3.53 + fixme; //figure out what to do -- go through holistic code still? 3.54 3.55 -ReturnTheMetaTask: //doing gotos to here should help with holistic.. 3.56 + Success: //doing gotos to here should help with holistic.. 3.57 3.58 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC 3.59 //This no longer works -- should be moved into PR in master 3.60 @@ -105,7 +111,7 @@ 3.61 newD.to_task = returnSlv->numTimesAssignedToASlot; 3.62 addToListOfArrays(Dependency, newD, langEnv->ctlDependenciesList); 3.63 } 3.64 - returnMetaTask = returnSlv->metaTask; 3.65 + returnMetaTask = returnSlv->metaTasks; 3.66 } 3.67 else //returnSlv != NULL 3.68 { //assignSlv->numTimesAssigned++; 3.69 @@ -125,72 +131,24 @@ 3.70 prev_in_slot; 3.71 } 3.72 #endif 3.73 +/* PR handles work available in lang env and in process.. 3.74 if( isEmptyPrivQ(langEnv->slavesReadyToResumeQ) && 3.75 isEmptyPrivQ(langEnv->taskReadyQ) ) 3.76 PR_int__clear_work_in_lang_env(langEnv); 3.77 - 3.78 - return( returnMetaTask ); 3.79 + */ 3.80 + 3.81 + return; 3.82 } 3.83 3.84 3.85 -//=========================== Request Handler ============================ 3.86 -// 3.87 -/* 3.88 - * (Not inline because invoked indirectly via a pointer) 3.89 - */ 3.90 - 3.91 -void 3.92 -handleLangReq( void *_langReq, SlaveVP *reqSlv, VSsLangEnv *langEnv ) 3.93 - { VSsLangReq *langReq; 3.94 - 3.95 - langReq = (VSsLangReq *)_langReq; 3.96 - if( langReq == NULL ) return; 3.97 - 3.98 - switch( langReq->reqType ) //lang handlers are all in other file 3.99 - { 3.100 - case send_type_to: handleSendTypeTo( langReq, langEnv); 3.101 - break; 3.102 - case send_from_to: handleSendFromTo( langReq, langEnv); 3.103 - break; 3.104 - case receive_type_to: handleReceiveTypeTo(langReq, langEnv); 3.105 - break; 3.106 - case receive_from_to: handleReceiveFromTo(langReq, langEnv); 3.107 - break; 3.108 - case taskwait: handleTaskwait( langReq, reqSlv, langEnv); 3.109 - break; 3.110 - 3.111 - //==================================================================== 3.112 - case malloc_req: handleMalloc( langReq, reqSlv, langEnv); 3.113 - break; 3.114 - case free_req: handleFree( langReq, reqSlv, langEnv); 3.115 - break; 3.116 - case singleton_fn_start: handleStartFnSingleton(langReq, reqSlv, langEnv); 3.117 - break; 3.118 - case singleton_fn_end: handleEndFnSingleton( langReq, reqSlv, langEnv); 3.119 - break; 3.120 - case singleton_data_start:handleStartDataSingleton(langReq,reqSlv,langEnv); 3.121 - break; 3.122 - case singleton_data_end: handleEndDataSingleton(langReq, reqSlv, langEnv); 3.123 - break; 3.124 - case atomic: handleAtomic( langReq, reqSlv, langEnv); 3.125 - break; 3.126 - case trans_start: handleTransStart( langReq, reqSlv, langEnv); 3.127 - break; 3.128 - case trans_end: handleTransEnd( langReq, reqSlv, langEnv); 3.129 - break; 3.130 - } 3.131 - } 3.132 - 3.133 - 3.134 - 3.135 3.136 //=========================== Helper ============================== 3.137 void 3.138 -resume_slaveVP( SlaveVP *slave, VSsLangEnv *langEnv ) 3.139 +VSs__resume_slave( SlaveVP *slave, VSsLangEnv *langEnv ) 3.140 { 3.141 //both suspended tasks and suspended explicit slaves resumed with this 3.142 writePrivQ( slave, langEnv->slavesReadyToResumeQ ); 3.143 - PR_int__set_work_in_lang_env(langEnv); 3.144 +//PR handles this.. PR_int__set_work_in_lang_env(langEnv); 3.145 3.146 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS 3.147 /*
4.1 --- a/VSs_Request_Handlers.c Sat Jan 12 11:31:51 2013 -0800 4.2 +++ b/VSs_Request_Handlers.c Tue Feb 05 20:24:25 2013 -0800 4.3 @@ -18,7 +18,7 @@ 4.4 4.5 //=========================== Local Fn Prototypes =========================== 4.6 void 4.7 -resume_slaveVP( SlaveVP *slave, VSsLangEnv *langEnv ); 4.8 +VSs__resume_slave( SlaveVP *slave, VSsLangEnv *langEnv ); 4.9 4.10 4.11 4.12 @@ -90,8 +90,8 @@ 4.13 VSsTaskStub* newStub; 4.14 4.15 //Create a new task stub, with enough room at end to copy args there 4.16 - newStub = (VSsTaskStub *)PR_int__create_lang_meta_task__ML( 4.17 - sizeof(VSsTaskStub) + taskType->sizeOfArgs, VSs_MAGIC_NUMBER ); 4.18 + newStub = (VSsTaskStub *)PR_int__create_lang_meta_task( 4.19 + sizeof(VSsTaskStub) + taskType->sizeOfArgs, &VSs__lang_meta_task_freer, VSs_MAGIC_NUMBER ); 4.20 4.21 newStub->numBlockingProp = taskType->numCtldArgs; 4.22 newStub->taskType = taskType; 4.23 @@ -112,13 +112,24 @@ 4.24 return newStub; 4.25 } 4.26 4.27 +void 4.28 +VSs__lang_meta_task_freer( void *_langMetaTask ) 4.29 + { //no malloc'd structs inside task stub, so nothing to do 4.30 + } 4.31 + 4.32 +void * 4.33 +VSs__create_empty_lang_meta_task_in_slave( SlaveVP *slave ) 4.34 + { 4.35 + return (void *)VSs__create_generic_slave_task_stub_in_slave( slave ); 4.36 + } 4.37 + 4.38 4.39 VSsTaskStub * 4.40 VSs__create_generic_slave_task_stub_in_slave( SlaveVP *slave ) 4.41 { VSsTaskStub *newStub; 4.42 4.43 - newStub = (VSsTaskStub *)PR_int__create_lang_meta_task_in_slave__ML( 4.44 - sizeof(VSsTaskStub), slave, VSs_MAGIC_NUMBER ); 4.45 + newStub = (VSsTaskStub *)PR_int__create_lang_meta_task_in_slave( 4.46 + sizeof(VSsTaskStub), &VSs__lang_meta_task_freer, slave, VSs_MAGIC_NUMBER ); 4.47 newStub->numBlockingProp = 0; 4.48 newStub->taskType = NULL; 4.49 newStub->ptrEntries = NULL; 4.50 @@ -130,6 +141,30 @@ 4.51 return newStub; 4.52 } 4.53 4.54 +/*Initialize semantic data struct.. this initializer doesn't need any input, 4.55 + * but some languages may need something from inside the request that was sent 4.56 + * to create a slave.. in that case, just make initializer do the malloc then 4.57 + * use the PR_PI__give_lang_data inside the create handler, and fill in the 4.58 + * langData values there. 4.59 + */ 4.60 +void * 4.61 +VSs__create_lang_data_in_slave( SlaveVP *slave ) 4.62 + { VSsLangData *langData; 4.63 + 4.64 + 4.65 + langData = PR_PI__create_lang_data_in_slave( sizeof(VSsLangData), 4.66 + &VSs__langDataFreer, slave, VSs_MAGIC_NUMBER ); 4.67 + 4.68 + langData->highestTransEntered = -1; 4.69 + langData->lastTransEntered = NULL; 4.70 + return langData; 4.71 + } 4.72 + 4.73 +void 4.74 +VSs__langDataFreer( void *_langData ) 4.75 + { //no extra structs have been malloc'd into the lang data, so nothing to do 4.76 + } 4.77 + 4.78 inline 4.79 VSsTaskStubCarrier * 4.80 create_task_carrier( VSsTaskStub *taskStub, int32 argNum, int32 rdOrWrite ) 4.81 @@ -168,7 +203,9 @@ 4.82 langReq = (VSsLangReq *) _langReq; 4.83 langEnv = (VSsLangEnv *) _langEnv; 4.84 4.85 - newSlv = PR_int__create_slave( langReq->fnPtr, langReq->initData ); 4.86 + newSlv = PR_PI__create_slave( langReq->fnPtr, langReq->initData ); 4.87 + 4.88 + VSs__create_lang_data_in_slave( newSlv ); 4.89 4.90 parentTaskStub = PR_PI__give_lang_meta_task_from_slave__ML( requestingSlv, VSs_MAGIC_NUMBER ); 4.91 parentTaskStub->numLiveChildThreads += 1; 4.92 @@ -217,35 +254,19 @@ 4.93 4.94 //For VSs, caller needs ptr to created thread returned to it 4.95 requestingSlv->dataRetFromReq = newSlv; 4.96 - resume_slaveVP(requestingSlv , langEnv ); 4.97 - resume_slaveVP( newSlv, langEnv ); 4.98 + PR_PI__make_slave_ready(requestingSlv , langEnv ); 4.99 + PR_PI__make_slave_ready( newSlv, langEnv ); 4.100 4.101 return newSlv; 4.102 } 4.103 4.104 -/*Initialize semantic data struct.. this initializer doesn't need any input, 4.105 - * but some languages may need something from inside the request that was sent 4.106 - * to create a slave.. in that case, just make initializer do the malloc then 4.107 - * use the PR_PI__give_lang_data inside the create handler, and fill in the 4.108 - * langData values there. 4.109 - */ 4.110 -void * 4.111 -createInitialSemanticData( ) 4.112 - { VSsLangData *langData; 4.113 - 4.114 - langData = PR_PI__malloc( sizeof(VSsLangData) ); 4.115 - 4.116 - langData->highestTransEntered = -1; 4.117 - langData->lastTransEntered = NULL; 4.118 - return langData; 4.119 - } 4.120 4.121 /*SlaveVP dissipate -- this is NOT task-end!, only call this to end explicitly 4.122 * created threads 4.123 */ 4.124 //inline 4.125 void 4.126 -handleDissipate( SlaveVP *requestingSlv, VSsLangEnv *langEnv ) 4.127 +handleDissipate( void *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv ) 4.128 { 4.129 VSsTaskStub *parentTaskStub, *ownTaskStub; 4.130 4.131 @@ -271,7 +292,7 @@ 4.132 if( parentTaskStub->isWaitingForChildTasksToEnd ) 4.133 return; //still waiting on tasks (should be impossible) 4.134 else //parent free to resume 4.135 - resume_slaveVP( PR_PI__give_slave_lang_meta_task_assigned_to(parentTaskStub), langEnv ); 4.136 + PR_PI__make_slave_ready( PR_PI__give_slave_lang_meta_task_is_assigned_to(parentTaskStub), langEnv ); 4.137 } 4.138 4.139 //check if this is last child of ended parent (note, not possible to 4.140 @@ -286,6 +307,7 @@ 4.141 //PR frees the langData, task stub and requesting slave's base state 4.142 return; 4.143 } 4.144 + 4.145 inline 4.146 void 4.147 handleShutdownDissipate( SlaveVP *requestingSlv, VSsLangEnv *langEnv ) 4.148 @@ -308,9 +330,14 @@ 4.149 void 4.150 freeVSsLangData( void *_langData ) 4.151 { // 4.152 + fixme; //check -- PR should handle freeing the lang data itself. 4.153 + //this should only free stuff malloc'd into the langData 4.154 PR_PI__free( _langData ); 4.155 } 4.156 4.157 +/*Will be used by a landData recycler, when (and if) such a thing added 4.158 + to PR 4.159 + */ 4.160 void 4.161 resetVSsLangData( void *_langData ) 4.162 { VSsLangData *langData = (VSsLangData *)_langData; 4.163 @@ -479,8 +506,8 @@ 4.164 * the hash-entry's count of enabled and non-finished readers.*/ 4.165 taskStub->numBlockingProp -= 1; 4.166 if( taskStub->numBlockingProp == 0 ) 4.167 - { writePrivQ( taskStub, langEnv->taskReadyQ ); 4.168 - PR_int__set_work_in_lang_env( langEnv ); 4.169 + { PR_PI__make_task_ready( taskStub, langEnv ); 4.170 + //PR_int__set_work_in_lang_env( langEnv ); 4.171 } 4.172 ptrEntry->numEnabledNonDoneReaders += 1; 4.173 } 4.174 @@ -503,8 +530,8 @@ 4.175 * into the readyQ.*/ 4.176 taskStub->numBlockingProp -= 1; 4.177 if( taskStub->numBlockingProp == 0 ) 4.178 - { writePrivQ( taskStub, langEnv->taskReadyQ ); 4.179 - PR_int__set_work_in_lang_env( langEnv ); 4.180 + { PR_PI__make_task_ready( taskStub, langEnv ); 4.181 + //PR_int__set_work_in_lang_env( langEnv ); 4.182 } 4.183 ptrEntry->hasEnabledNonFinishedWriter = TRUE; 4.184 } 4.185 @@ -517,7 +544,7 @@ 4.186 } //for argNum 4.187 4.188 //resume the parent, creator 4.189 - resume_slaveVP( langReq->callingSlv, langEnv ); 4.190 + PR_PI__make_slave_ready( langReq->callingSlv, langEnv ); 4.191 4.192 return taskStub; 4.193 } 4.194 @@ -569,7 +596,7 @@ 4.195 VSsPointerEntry **ptrEntries; 4.196 4.197 endingTaskStub = 4.198 - (VSsTaskStub *)PR_int__give_lang_meta_task_from_slave__ML( requestingSlv, VSs_MAGIC_NUMBER ); 4.199 + (VSsTaskStub *)PR_int__give_lang_meta_task_from_slave( requestingSlv, VSs_MAGIC_NUMBER ); 4.200 4.201 args = endingTaskStub->args; 4.202 endingTaskType = endingTaskStub->taskType; 4.203 @@ -584,7 +611,7 @@ 4.204 parentStub->numLiveChildTasks == 0) 4.205 { 4.206 parentStub->isWaitingForChildTasksToEnd = FALSE; 4.207 - resume_slaveVP( PR_PI__give_slave_lang_meta_task_assigned_to(parentStub), langEnv ); 4.208 + PR_PI__make_slave_ready( PR_PI__give_slave_lang_meta_task_is_assigned_to(parentStub), langEnv ); 4.209 } 4.210 4.211 //Check if parent ended, and this was last descendent, then free it 4.212 @@ -628,8 +655,8 @@ 4.213 // task-stub into the readyQ. 4.214 waitingTaskStub->numBlockingProp -= 1; 4.215 if( waitingTaskStub->numBlockingProp == 0 ) 4.216 - { writePrivQ( waitingTaskStub, langEnv->taskReadyQ ); 4.217 - PR_int__set_work_in_lang_env( langEnv ); 4.218 + { PR_PI__make_task_ready( waitingTaskStub, langEnv ); 4.219 + //PR_int__set_work_in_lang_env( langEnv ); 4.220 } 4.221 } 4.222 } 4.223 @@ -653,8 +680,8 @@ 4.224 // If it becomes zero, then put the task-stub into the readyQ. 4.225 waitingTaskStub->numBlockingProp -= 1; 4.226 if( waitingTaskStub->numBlockingProp == 0 ) 4.227 - { writePrivQ( waitingTaskStub, langEnv->taskReadyQ ); 4.228 - PR_int__set_work_in_lang_env( langEnv ); 4.229 + { PR_PI__make_task_ready( waitingTaskStub, langEnv ); 4.230 + //PR_int__set_work_in_lang_env( langEnv ); 4.231 } 4.232 } 4.233 else 4.234 @@ -670,8 +697,8 @@ 4.235 // into the readyQ. 4.236 waitingTaskStub->numBlockingProp -= 1; 4.237 if( waitingTaskStub->numBlockingProp == 0 ) 4.238 - { writePrivQ( waitingTaskStub, langEnv->taskReadyQ ); 4.239 - PR_int__set_work_in_lang_env( langEnv ); 4.240 + { PR_PI__make_task_ready( waitingTaskStub, langEnv ); 4.241 + //PR_int__set_work_in_lang_env( langEnv ); 4.242 } 4.243 //Get next waiting task 4.244 waitingTaskCarrier = peekPrivQ( ptrEntry->waitersQ ); 4.245 @@ -772,7 +799,7 @@ 4.246 */ 4.247 //inline 4.248 void 4.249 -handleSendTypeTo( VSsLangReq *langReq, VSsLangEnv *langEnv ) 4.250 +handleSendTypeTo( VSsLangReq *langReq, SlaveVP *reqSlave, VSsLangEnv *langEnv ) 4.251 { SlaveVP *senderSlv, *receiverSlv; 4.252 int32 *senderID, *receiverID; 4.253 int32 *key, keySz, receiverIDNumInt; 4.254 @@ -780,6 +807,8 @@ 4.255 HashEntry *entry; 4.256 HashTable *commHashTbl = langEnv->commHashTbl; 4.257 4.258 + //Note, don't use reqSlave, but need it to match RequestHandler signature 4.259 + 4.260 receiverID = langReq->receiverID; //For "send", know both send & recv procrs 4.261 senderSlv = langReq->senderSlv; 4.262 4.263 @@ -860,8 +889,8 @@ 4.264 receiverSlv->dataRetFromReq = langReq->msg; 4.265 4.266 //bring both processors back from suspend 4.267 - resume_slaveVP( senderSlv, langEnv ); 4.268 - resume_slaveVP( receiverSlv, langEnv ); 4.269 + PR_PI__make_slave_ready( senderSlv, langEnv ); 4.270 + PR_PI__make_slave_ready( receiverSlv, langEnv ); 4.271 4.272 return; 4.273 } 4.274 @@ -878,7 +907,7 @@ 4.275 //TODO: combine both send handlers into single handler 4.276 //inline 4.277 void 4.278 -handleSendFromTo( VSsLangReq *langReq, VSsLangEnv *langEnv) 4.279 +handleSendFromTo( VSsLangReq *langReq, SlaveVP *dummySlave, VSsLangEnv *langEnv) 4.280 { SlaveVP *senderSlv, *receiverSlv; 4.281 int32 *senderID, *receiverID; 4.282 int32 *key, keySz, receiverIDNumInt, senderIDNumInt; 4.283 @@ -944,8 +973,8 @@ 4.284 receiverSlv->dataRetFromReq = langReq->msg; 4.285 4.286 //bring both processors back from suspend 4.287 - resume_slaveVP( senderSlv, langEnv ); 4.288 - resume_slaveVP( receiverSlv, langEnv ); 4.289 + PR_PI__make_slave_ready( senderSlv, langEnv ); 4.290 + PR_PI__make_slave_ready( receiverSlv, langEnv ); 4.291 4.292 return; 4.293 } 4.294 @@ -959,7 +988,7 @@ 4.295 4.296 //inline 4.297 void 4.298 -handleReceiveTypeTo( VSsLangReq *langReq, VSsLangEnv *langEnv) 4.299 +handleReceiveTypeTo( VSsLangReq *langReq, SlaveVP *dummySlv, VSsLangEnv *langEnv) 4.300 { SlaveVP *senderSlv, *receiverSlv; 4.301 int32 *receiverID; 4.302 int32 *key, keySz, receiverIDNumInt; 4.303 @@ -1032,8 +1061,8 @@ 4.304 addToListOfArrays(Unit,u,langEnv->ntonGroups[groupId]->receivers); 4.305 #endif 4.306 4.307 - resume_slaveVP( senderSlv, langEnv ); 4.308 - resume_slaveVP( receiverSlv, langEnv ); 4.309 + PR_PI__make_slave_ready( senderSlv, langEnv ); 4.310 + PR_PI__make_slave_ready( receiverSlv, langEnv ); 4.311 4.312 return; 4.313 } 4.314 @@ -1045,7 +1074,7 @@ 4.315 */ 4.316 //inline 4.317 void 4.318 -handleReceiveFromTo( VSsLangReq *langReq, VSsLangEnv *langEnv) 4.319 +handleReceiveFromTo( VSsLangReq *langReq, SlaveVP *dummySlv, VSsLangEnv *langEnv) 4.320 { SlaveVP *senderSlv, *receiverSlv; 4.321 int32 *senderID, *receiverID; 4.322 int32 *key, keySz, receiverIDNumInt, senderIDNumInt; 4.323 @@ -1102,8 +1131,8 @@ 4.324 //bring both processors back from suspend 4.325 PR_PI__free( waitingReq ); 4.326 4.327 - resume_slaveVP( senderSlv, langEnv ); 4.328 - resume_slaveVP( receiverSlv, langEnv ); 4.329 + PR_PI__make_slave_ready( senderSlv, langEnv ); 4.330 + PR_PI__make_slave_ready( receiverSlv, langEnv ); 4.331 4.332 return; 4.333 } 4.334 @@ -1126,7 +1155,7 @@ 4.335 4.336 if( taskStub->numLiveChildTasks == 0 ) 4.337 { //nobody to wait for, resume 4.338 - resume_slaveVP( requestingSlv, langEnv ); 4.339 + PR_PI__make_slave_ready( requestingSlv, langEnv ); 4.340 } 4.341 else //have to wait, mark waiting 4.342 { 4.343 @@ -1146,7 +1175,7 @@ 4.344 4.345 ptr = PR_PI__malloc( langReq->sizeToMalloc ); 4.346 requestingSlv->dataRetFromReq = ptr; 4.347 - resume_slaveVP( requestingSlv, langEnv ); 4.348 + PR_PI__make_slave_ready( requestingSlv, langEnv ); 4.349 } 4.350 4.351 /* 4.352 @@ -1156,7 +1185,7 @@ 4.353 { 4.354 DEBUG__printf1(dbgRqstHdlr,"Free request from processor %d",requestingSlv->slaveNum) 4.355 PR_PI__free( langReq->ptrToFree ); 4.356 - resume_slaveVP( requestingSlv, langEnv ); 4.357 + PR_PI__make_slave_ready( requestingSlv, langEnv ); 4.358 } 4.359 4.360 4.361 @@ -1173,7 +1202,7 @@ 4.362 if( singleton->hasFinished ) 4.363 { //the code that sets the flag to true first sets the end instr addr 4.364 reqstingSlv->dataRetFromReq = singleton->endInstrAddr; 4.365 - resume_slaveVP( reqstingSlv, langEnv ); 4.366 + PR_PI__make_slave_ready( reqstingSlv, langEnv ); 4.367 return; 4.368 } 4.369 else if( singleton->hasBeenStarted ) 4.370 @@ -1185,7 +1214,7 @@ 4.371 { //hasn't been started, so this is the first attempt at the singleton 4.372 singleton->hasBeenStarted = TRUE; 4.373 reqstingSlv->dataRetFromReq = 0x0; 4.374 - resume_slaveVP( reqstingSlv, langEnv ); 4.375 + PR_PI__make_slave_ready( reqstingSlv, langEnv ); 4.376 return; 4.377 } 4.378 } 4.379 @@ -1241,10 +1270,10 @@ 4.380 { //they will resume inside start singleton, then jmp to end singleton 4.381 resumingSlv = readPrivQ( waitQ ); 4.382 resumingSlv->dataRetFromReq = singleton->endInstrAddr; 4.383 - resume_slaveVP( resumingSlv, langEnv ); 4.384 + PR_PI__make_slave_ready( resumingSlv, langEnv ); 4.385 } 4.386 4.387 - resume_slaveVP( requestingSlv, langEnv ); 4.388 + PR_PI__make_slave_ready( requestingSlv, langEnv ); 4.389 4.390 } 4.391 void 4.392 @@ -1279,7 +1308,7 @@ 4.393 { 4.394 DEBUG__printf1(dbgRqstHdlr,"Atomic request from processor %d",requestingSlv->slaveNum) 4.395 langReq->fnToExecInMaster( langReq->dataForFn ); 4.396 - resume_slaveVP( requestingSlv, langEnv ); 4.397 + PR_PI__make_slave_ready( requestingSlv, langEnv ); 4.398 } 4.399 4.400 /*First, it looks at the VP's semantic data, to see the highest transactionID 4.401 @@ -1325,7 +1354,7 @@ 4.402 if( transStruc->VPCurrentlyExecuting == NULL ) 4.403 { 4.404 transStruc->VPCurrentlyExecuting = requestingSlv; 4.405 - resume_slaveVP( requestingSlv, langEnv ); 4.406 + PR_PI__make_slave_ready( requestingSlv, langEnv ); 4.407 } 4.408 else 4.409 { //note, might make future things cleaner if save request with VP and 4.410 @@ -1381,7 +1410,15 @@ 4.411 transStruc->VPCurrentlyExecuting = waitingSlv; 4.412 4.413 if( waitingSlv != NULL ) 4.414 - resume_slaveVP( waitingSlv, langEnv ); 4.415 + PR_PI__make_slave_ready( waitingSlv, langEnv ); 4.416 4.417 - resume_slaveVP( requestingSlv, langEnv ); 4.418 + PR_PI__make_slave_ready( requestingSlv, langEnv ); 4.419 } 4.420 + 4.421 +void 4.422 +VSs__make_task_ready( void *taskStub, void *_langEnv ) 4.423 + { 4.424 + writePrivQ( taskStub, ((VSsLangEnv*)_langEnv)->taskReadyQ ); 4.425 + } 4.426 + 4.427 +
5.1 --- a/VSs_Request_Handlers.h Sat Jan 12 11:31:51 2013 -0800 5.2 +++ b/VSs_Request_Handlers.h Tue Feb 05 20:24:25 2013 -0800 5.3 @@ -14,19 +14,25 @@ 5.4 /*This header defines everything specific to the VSs semantic plug-in 5.5 */ 5.6 5.7 +SlaveVP * 5.8 +handleCreateThd( void *_langReq, SlaveVP *requestingSlv, void *_langEnv ); 5.9 +void 5.10 +handleDissipate( void *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv ); 5.11 + 5.12 inline 5.13 void * 5.14 handleSubmitTask( VSsLangReq *langReq, VSsLangEnv *langEnv); 5.15 inline void 5.16 handleEndTask( VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv ); 5.17 + 5.18 inline void 5.19 -handleSendTypeTo( VSsLangReq *langReq, VSsLangEnv *langEnv); 5.20 +handleSendTypeTo( VSsLangReq *langReq, SlaveVP *dummySlv, VSsLangEnv *langEnv); 5.21 inline void 5.22 -handleSendFromTo( VSsLangReq *langReq, VSsLangEnv *langEnv); 5.23 +handleSendFromTo( VSsLangReq *langReq, SlaveVP* dummySlv, VSsLangEnv *langEnv); 5.24 inline void 5.25 -handleReceiveTypeTo( VSsLangReq *langReq, VSsLangEnv *langEnv); 5.26 +handleReceiveTypeTo( VSsLangReq *langReq, SlaveVP *dummySlv, VSsLangEnv *langEnv); 5.27 inline void 5.28 -handleReceiveFromTo( VSsLangReq *langReq, VSsLangEnv *langEnv); 5.29 +handleReceiveFromTo( VSsLangReq *langReq, SlaveVP *dummySlv, VSsLangEnv *langEnv); 5.30 inline void 5.31 handleTaskwait(VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv); 5.32
6.1 --- a/VSs_SS.c Sat Jan 12 11:31:51 2013 -0800 6.2 +++ b/VSs_SS.c Tue Feb 05 20:24:25 2013 -0800 6.3 @@ -38,13 +38,13 @@ 6.4 // will make the dissipate handler do the right thing when the seed 6.5 // is dissipated. 6.6 threadTaskStub = 6.7 - PR_int__create_lang_meta_task_in_slave__ML( sizeof(VSsTaskStub), seedSlv, VSs_MAGIC_NUMBER ); 6.8 + PR_int__create_lang_meta_task_in_slave( sizeof(VSsTaskStub), &VSs__lang_meta_task_freer, seedSlv, VSs_MAGIC_NUMBER ); 6.9 6.10 threadTaskStub->isEnded = FALSE; 6.11 threadTaskStub->isWaitingForChildTasksToEnd = FALSE; 6.12 6.13 parentTaskStub = 6.14 - PR_int__create_lang_meta_task__ML(sizeof(VSsTaskStub), seedSlv, VSs_MAGIC_NUMBER); 6.15 + PR_int__create_lang_meta_task(sizeof(VSsTaskStub), &VSs__lang_meta_task_freer, seedSlv, VSs_MAGIC_NUMBER); 6.16 6.17 parentTaskStub->isEnded = TRUE; 6.18 parentTaskStub->numLiveChildThreads = 1; //so dissipate works for seed 6.19 @@ -52,6 +52,12 @@ 6.20 //Note: threadTaskStub and parentTaskStub freed when dissipate seedSlv 6.21 6.22 //register the langlet's handlers with PR 6.23 + PR_SS__register_assigner( &VSs__assign_work_to_slot, seedSlv, VSs_MAGIC_NUMBER ); 6.24 + PR_SS__register_shutdown_handler( &VSs__handle_shutdown, seedSlv, VSs_MAGIC_NUMBER ); 6.25 + PR_SS__register_lang_data_creator( &VSs__create_lang_data_in_slave, seedSlv, VSs_MAGIC_NUMBER ); 6.26 + PR_SS__register_lang_meta_task_creator( &VSs__create_empty_lang_meta_task_in_slave, seedSlv, VSs_MAGIC_NUMBER ); 6.27 + PR_SS__register_make_slave_ready_fn( &VSs__resume_slave ); 6.28 + PR_SS__register_make_task_ready_fn( &VSs__make_task_ready ); 6.29 /* 6.30 PR_SS__register_create_task_handler( &createTaskHandler, seedVP, VSs_MAGIC_NUMBER ); 6.31 PR_SS__register_end_task_handler( &endTaskHandler, seedVP, VSs_MAGIC_NUMBER ); 6.32 @@ -59,10 +65,8 @@ 6.33 PR_SS__register_dissipate_slave_handler( &endThreadHandler, seedVP, VSs_MAGIC_NUMBER ); 6.34 RequestHandler createInitialLangDataFn; 6.35 RequestHandler resetLangDataFn; 6.36 -*/ 6.37 PR_SS__register_request_handler( &VSs__Request_Handler, seedSlv, VSs_MAGIC_NUMBER ); 6.38 - PR_SS__register_assigner( &VSs__assign_work_to_slot, seedSlv, VSs_MAGIC_NUMBER ); 6.39 - PR_SS__register_shutdown_handler( &VSs__shutdown, seedSlv, VSs_MAGIC_NUMBER ); 6.40 + */ 6.41 6.42 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS 6.43 _PRTopEnv->counterHandler = &VSs__counter_handler; 6.44 @@ -106,12 +110,12 @@ 6.45 } 6.46 6.47 6.48 -/*This shuts down the langket 6.49 +/*This shuts down the langlet 6.50 * Frees any memory allocated by VSs__init() and deletes any slaves or tasks 6.51 * still in ready Qs. 6.52 */ 6.53 void 6.54 -VSs__shutdown( void *_langEnv ) 6.55 +VSs__handle_shutdown( void *_langEnv ) 6.56 { VSsLangEnv *langEnv = (VSsLangEnv *)_langEnv; 6.57 6.58 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC 6.59 @@ -235,15 +239,17 @@ 6.60 SlaveVP *slave; 6.61 VSsTaskStub *task; 6.62 6.63 + //dissipate any slaves still in the readyQ 6.64 queue = langEnv->slavesReadyToResumeQ; 6.65 slave = readPrivQ( queue ); 6.66 while( slave != NULL ) 6.67 - { handleShutdownDissipate(slave); 6.68 - PR_int__recycle_slave__ML( slave ); //recycler is for all of PR 6.69 + { handleShutdownDissipate( slave ); 6.70 + PR_int__recycle_slave( slave ); //recycler is for all of PR 6.71 slave = readPrivQ( queue ); 6.72 } 6.73 freePrivQ( queue ); 6.74 6.75 + //end any tasks still in the readyQ 6.76 queue = langEnv->taskReadyQ; 6.77 task = readPrivQ( queue ); 6.78 while( task != NULL )
