# HG changeset patch # User Nina Engelhardt # Date 1368805789 -7200 # Node ID a951b38d2cfc27bcd12f071548c9b4b66e71af7d # Parent c8d4f6d3c7d323d7f036101b90fd7b32961b8cb2 remove need for end_thread() diff -r c8d4f6d3c7d3 -r a951b38d2cfc VSs.c --- a/VSs.c Wed May 15 15:25:55 2013 +0200 +++ b/VSs.c Fri May 17 17:49:49 2013 +0200 @@ -85,8 +85,9 @@ //VSs starts with one processor, which is put into initial environ, // and which then calls create() to create more, thereby expanding work - seedSlv = VSs__create_slave_helper( fnPtr, initData, - semEnv, semEnv->nextCoreToGetNewSlv++ ); + seedSlv = VSs__create_slave_helper( &VSs__run_thread , fnPtr, initData, semEnv, semEnv->nextCoreToGetNewSlv++ ); + //NB: this assumes that after VSs_init() nextCoreToGetNewSlv is still 0, + // and also that there is more than 1 core. //seed slave is a thread slave, so make a thread's task stub for it // and then make another to stand for the seed's parent task. Make @@ -221,14 +222,14 @@ for( slotNum = 0; slotNum < NUM_ANIM_SLOTS; ++slotNum ) { #ifdef IDLE_SLAVES - idleSlv = VSs__create_slave_helper( &idle_fn, NULL, semanticEnv, 0); + idleSlv = VSs__create_slave_helper( &VSs__run_thread, &idle_fn, NULL, semanticEnv, 0); idleSlv->coreAnimatedBy = coreNum; idleSlv->animSlotAssignedTo = _VMSMasterEnv->allAnimSlots[coreNum][slotNum]; semanticEnv->idleSlv[coreNum][slotNum] = idleSlv; #endif - slotTaskSlv = VSs__create_slave_helper( &idle_fn, NULL, semanticEnv, 0); + slotTaskSlv = VSs__create_slave_helper(&VSs__run_thread, &idle_fn, NULL, semanticEnv, 0); slotTaskSlv->coreAnimatedBy = coreNum; slotTaskSlv->animSlotAssignedTo = _VMSMasterEnv->allAnimSlots[coreNum][slotNum]; @@ -493,7 +494,10 @@ VMS_WL__send_dissipate_req( currVP ); } - +void VSs__run_thread(TopLevelFnPtr fnPtr, void *initData){ + (*fnPtr)(initData); + VSs__end_thread(); +} //=========================================================================== @@ -567,8 +571,10 @@ VMS_WL__send_sem_request( &reqData, currVP ); } -void plugin__end_VP(){ -VSs__end_task();} +void VSs__run_task(TopLevelFnPtr fnPtr, void *initData){ + (*fnPtr)(initData); + VSs__end_task(); +} void VSs__taskwait() @@ -946,7 +952,6 @@ void __entry_point(void* _args) { __main_args* args = (__main_args*) _args; __main_ret = __program_main(args->argc, args->argv); - VSs__end_thread(); } #undef main diff -r c8d4f6d3c7d3 -r a951b38d2cfc VSs.h --- a/VSs.h Wed May 15 15:25:55 2013 +0200 +++ b/VSs.h Fri May 17 17:49:49 2013 +0200 @@ -317,6 +317,8 @@ VSs__create_thread( TopLevelFnPtr fnPtr, void *initData, SlaveVP *creatingThd ); +void VSs__run_thread(TopLevelFnPtr fnPtr, void *initData); + void VSs__end_thread(); @@ -337,6 +339,8 @@ void VSs__submit_task_with_ID( VSsTaskType *taskType, void *args, int32 *taskID); +void VSs__run_task(TopLevelFnPtr fnPtr, void *initData); + void VSs__end_task(); @@ -400,7 +404,7 @@ VSs__assign_slaveVP_to_slot( void *_semEnv, AnimSlot *slot ); SlaveVP* -VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData, +VSs__create_slave_helper(TopLevelFnWrapper fnWrapper, TopLevelFnPtr fnPtr, void *initData, VSsSemEnv *semEnv, int32 coreToAssignOnto ); VSsTaskStub * diff -r c8d4f6d3c7d3 -r a951b38d2cfc VSs_PluginFns.c --- a/VSs_PluginFns.c Wed May 15 15:25:55 2013 +0200 +++ b/VSs_PluginFns.c Fri May 17 17:49:49 2013 +0200 @@ -93,7 +93,7 @@ // (task slaves that are resuming are in resumeQ) newTaskStub = readPrivQ(semEnv->taskReadyQ); if (newTaskStub != NULL) { //point slave to task's function, and mark slave as having task - VMS_int__reset_slaveVP_to_TopLvlFn(returnSlv, + VMS_int__reset_slaveVP_to_TopLvlFnWrapper(returnSlv, &VSs__run_task, newTaskStub->taskType->fn, newTaskStub->args); semData->taskStub = newTaskStub; newTaskStub->slaveAssignedTo = returnSlv; @@ -362,13 +362,13 @@ /*Re-use this in the entry-point fn */ SlaveVP * -VSs__create_slave_helper(TopLevelFnPtr fnPtr, void *initData, +VSs__create_slave_helper(TopLevelFnWrapper fnWrapper, TopLevelFnPtr fnPtr, void *initData, VSsSemEnv *semEnv, int32 coreToAssignOnto) { SlaveVP *newSlv; VSsSemData *semData; //This is running in master, so use internal version - newSlv = VMS_PI__create_slaveVP(fnPtr, initData); + newSlv = VMS_int__create_slaveVP_with_wrapper(fnWrapper, fnPtr, initData); //task slaves differ from thread slaves by the settings in the taskStub //so, don't create task stub here, only create semData, which is same @@ -462,11 +462,11 @@ semData = (VSsSemData *) newSlv->semanticData; semData->highestTransEntered = -1; semData->lastTransEntered = NULL; - VMS_int__reset_slaveVP_to_TopLvlFn(newSlv, semReq->fnPtr, + VMS_int__reset_slaveVP_to_TopLvlFnWrapper(newSlv, &VSs__run_thread, semReq->fnPtr, semReq->initData); } else //no idle ones, create a new { - newSlv = VSs__create_slave_helper(semReq->fnPtr, semReq->initData, + newSlv = VSs__create_slave_helper(&VSs__run_thread, semReq->fnPtr, semReq->initData, semEnv, semReq->coreToAssignOnto); semData = (VSsSemData *) newSlv->semanticData; } diff -r c8d4f6d3c7d3 -r a951b38d2cfc VSs_Request_Handlers.c --- a/VSs_Request_Handlers.c Wed May 15 15:25:55 2013 +0200 +++ b/VSs_Request_Handlers.c Fri May 17 17:49:49 2013 +0200 @@ -1122,7 +1122,7 @@ //get a new slave to be the slot slave newSlotSlv = readPrivQ(semEnv->freeExtraTaskSlvQ); if (newSlotSlv == NULL) { - newSlotSlv = VSs__create_slave_helper(&idle_fn, NULL, semEnv, 0); + newSlotSlv = VSs__create_slave_helper(&VSs__run_thread, &idle_fn, NULL, semEnv, 0); //just made a new extra task slave, so count it semEnv->numLiveExtraTaskSlvs += 1; }