Mercurial > cgi-bin > hgwebdir.cgi > VMS > VMS_Implementations > VSs_impls > VSs__MC_shared_impl
comparison VSs.c @ 8:eb3d77ca9f59
Code complete -- not debuggedd yet
| author | Sean Halle <seanhalle@yahoo.com> |
|---|---|
| date | Thu, 02 Aug 2012 01:03:14 -0700 |
| parents | 3999b8429ddd |
| children | 832bc715fbf2 |
comparison
equal
deleted
inserted
replaced
| 6:fb263b95cd61 | 7:ae096282b759 |
|---|---|
| 74 void | 74 void |
| 75 VSs__create_seed_slave_and_do_work( TopLevelFnPtr fnPtr, void *initData ) | 75 VSs__create_seed_slave_and_do_work( TopLevelFnPtr fnPtr, void *initData ) |
| 76 { VSsSemEnv *semEnv; | 76 { VSsSemEnv *semEnv; |
| 77 SlaveVP *seedSlv; | 77 SlaveVP *seedSlv; |
| 78 VSsSemData *semData; | 78 VSsSemData *semData; |
| 79 VSsTaskStub *explPrTaskStub; | 79 VSsTaskStub *threadTaskStub, *parentTaskStub; |
| 80 | 80 |
| 81 VSs__init(); //normal multi-thd | 81 VSs__init(); //normal multi-thd |
| 82 | 82 |
| 83 semEnv = _VMSMasterEnv->semanticEnv; | 83 semEnv = _VMSMasterEnv->semanticEnv; |
| 84 | 84 |
| 85 //VSs starts with one processor, which is put into initial environ, | 85 //VSs starts with one processor, which is put into initial environ, |
| 86 // and which then calls create() to create more, thereby expanding work | 86 // and which then calls create() to create more, thereby expanding work |
| 87 seedSlv = VSs__create_slave_helper( fnPtr, initData, | 87 seedSlv = VSs__create_slave_helper( fnPtr, initData, |
| 88 semEnv, semEnv->nextCoreToGetNewSlv++ ); | 88 semEnv, semEnv->nextCoreToGetNewSlv++ ); |
| 89 | 89 |
| 90 //seed slave is an explicit processor, so make one of the special | 90 //seed slave is a thread slave, so make a thread's task stub for it |
| 91 // task stubs for explicit processors, and attach it to the slave | 91 // and then make another to stand for the seed's parent task. Make |
| 92 explPrTaskStub = create_expl_proc_task_stub( initData ); | 92 // the parent be already ended, and have one child (the seed). This |
| 93 // will make the dissipate handler do the right thing when the seed | |
| 94 // is dissipated. | |
| 95 threadTaskStub = create_thread_task_stub( initData ); | |
| 96 parentTaskStub = create_thread_task_stub( NULL ); | |
| 97 parentTaskStub->isEnded = TRUE; | |
| 98 parentTaskStub->numLiveChildThreads = 1; //so dissipate works for seed | |
| 99 threadTaskStub->parentTasksStub = parentTaskStub; | |
| 93 | 100 |
| 94 semData = (VSsSemData *)seedSlv->semanticData; | 101 semData = (VSsSemData *)seedSlv->semanticData; |
| 95 //seedVP already has a permanent task | 102 //seedVP is a thread, so has a permanent task |
| 96 semData->needsTaskAssigned = FALSE; | 103 semData->needsTaskAssigned = FALSE; |
| 97 semData->taskStub = explPrTaskStub; | 104 semData->taskStub = threadTaskStub; |
| 98 | 105 |
| 99 resume_slaveVP( seedSlv, semEnv ); //returns right away, just queues Slv | 106 resume_slaveVP( seedSlv, semEnv ); //returns right away, just queues Slv |
| 100 | 107 |
| 101 VMS_SS__start_the_work_then_wait_until_done(); //normal multi-thd | 108 VMS_SS__start_the_work_then_wait_until_done(); //normal multi-thd |
| 102 | 109 |
| 237 semanticEnv->fnSingletons[i].hasFinished = FALSE; | 244 semanticEnv->fnSingletons[i].hasFinished = FALSE; |
| 238 semanticEnv->fnSingletons[i].waitQ = makeVMSQ(); | 245 semanticEnv->fnSingletons[i].waitQ = makeVMSQ(); |
| 239 semanticEnv->transactionStrucs[i].waitingVPQ = makeVMSQ(); | 246 semanticEnv->transactionStrucs[i].waitingVPQ = makeVMSQ(); |
| 240 } | 247 } |
| 241 | 248 |
| 242 semanticEnv->numAdditionalSlvs = 0; //must be last | 249 semanticEnv->numLiveExtraTaskSlvs = 0; //must be last |
| 250 semanticEnv->numLiveThreadSlvs = 1; //must be last, count the seed | |
| 243 | 251 |
| 244 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC | 252 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC |
| 245 semanticEnv->unitList = makeListOfArrays(sizeof(Unit),128); | 253 semanticEnv->unitList = makeListOfArrays(sizeof(Unit),128); |
| 246 semanticEnv->ctlDependenciesList = makeListOfArrays(sizeof(Dependency),128); | 254 semanticEnv->ctlDependenciesList = makeListOfArrays(sizeof(Dependency),128); |
| 247 semanticEnv->commDependenciesList = makeListOfArrays(sizeof(Dependency),128); | 255 semanticEnv->commDependenciesList = makeListOfArrays(sizeof(Dependency),128); |
| 413 * Normally, this would be the last line of the thread's top level function. | 421 * Normally, this would be the last line of the thread's top level function. |
| 414 * But, if the thread exits from any point, it has to do so by calling | 422 * But, if the thread exits from any point, it has to do so by calling |
| 415 * this. | 423 * this. |
| 416 * | 424 * |
| 417 *This must update the count of active sub-tasks (sub-threads) of parents, | 425 *This must update the count of active sub-tasks (sub-threads) of parents, |
| 418 * and the semantic data and task stub must stay | 426 * and the semantic data and task stub must stay. |
| 419 */ | 427 */ |
| 420 void | 428 void |
| 421 VSs__end_thread( SlaveVP *thdToEnd ) | 429 VSs__end_thread( SlaveVP *thdToEnd ) |
| 422 { | 430 { VSsSemData *semData; |
| 431 | |
| 423 //check whether all sub-tasks have ended.. if not, don't free the | 432 //check whether all sub-tasks have ended.. if not, don't free the |
| 424 // semantic data nor task stub of this thread. | 433 // semantic data nor task stub of this thread. |
| 425 check_sub_tasks(); | 434 semData = (VSsSemData *)thdToEnd->semanticData; |
| 435 if( semData->taskStub->numLiveChildTasks != 0 ) | |
| 436 { | |
| 437 fix_me(); | |
| 438 } | |
| 426 | 439 |
| 427 //Update the count of live sub-tasks in parent. If parent was a | 440 //Update the count of live sub-tasks in parent. If parent was a |
| 428 // thread and has already ended, then if this was the last sub-task, | 441 // thread and has already ended, then if this was the last sub-task, |
| 429 // free the semantic data and task stub of the parent. | 442 // free the semantic data and task stub of the parent. |
| 443 | |
| 430 VMS_WL__send_dissipate_req( thdToEnd ); | 444 VMS_WL__send_dissipate_req( thdToEnd ); |
| 431 } | 445 } |
| 432 | 446 |
| 433 | 447 |
| 434 //=========================================================================== | 448 //=========================================================================== |
