# HG changeset patch # User Nina Engelhardt # Date 1368624355 -7200 # Node ID c8d4f6d3c7d323d7f036101b90fd7b32961b8cb2 # Parent 94911329b0678ec9d1e3513aaca95973d3ac4e5a hide animating VP and entry point diff -r 94911329b067 -r c8d4f6d3c7d3 VSs.c --- a/VSs.c Mon Apr 15 16:41:31 2013 +0200 +++ b/VSs.c Wed May 15 15:25:55 2013 +0200 @@ -183,9 +183,9 @@ } -void idle_fn(void* data, SlaveVP *animatingSlv){ +void idle_fn(void* data){ while(1){ - VMS_int__suspend_slaveVP_and_send_req(animatingSlv); + VMS_int__suspend_slaveVP_and_send_req(currVP); } } @@ -487,10 +487,10 @@ *It simply sends a dissipate request, which handles all the state cleanup. */ void -VSs__end_thread( SlaveVP *thdToEnd ) +VSs__end_thread() { - VMS_WL__send_dissipate_req( thdToEnd ); + VMS_WL__send_dissipate_req( currVP ); } @@ -502,22 +502,22 @@ /* */ void -VSs__submit_task( VSsTaskType *taskType, void *args, SlaveVP *animSlv) +VSs__submit_task( VSsTaskType *taskType, void *args) { VSsSemReq reqData; reqData.reqType = submit_task; reqData.taskType = taskType; reqData.args = args; - reqData.callingSlv = animSlv; + reqData.callingSlv = currVP; reqData.taskID = NULL; - VMS_WL__send_sem_request( &reqData, animSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); } int32 * -VSs__create_taskID_of_size( int32 numInts, SlaveVP *animSlv ) +VSs__create_taskID_of_size( int32 numInts) { int32 *taskID; taskID = VMS_WL__malloc( sizeof(int32) + numInts * sizeof(int32) ); @@ -526,8 +526,7 @@ } void -VSs__submit_task_with_ID( VSsTaskType *taskType, void *args, int32 *taskID, - SlaveVP *animSlv) +VSs__submit_task_with_ID( VSsTaskType *taskType, void *args, int32 *taskID) { VSsSemReq reqData; reqData.reqType = submit_task; @@ -535,9 +534,9 @@ reqData.taskType = taskType; reqData.args = args; reqData.taskID = taskID; - reqData.callingSlv = animSlv; + reqData.callingSlv = currVP; - VMS_WL__send_sem_request( &reqData, animSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); } @@ -559,77 +558,78 @@ *But, to stay compatible with all the other VMS languages, leave it in.. */ void -VSs__end_task( SlaveVP *animSlv ) +VSs__end_task() { VSsSemReq reqData; reqData.reqType = end_task; - reqData.callingSlv = animSlv; + reqData.callingSlv = currVP; - VMS_WL__send_sem_request( &reqData, animSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); } +void plugin__end_VP(){ +VSs__end_task();} void -VSs__taskwait(SlaveVP *animSlv) +VSs__taskwait() { VSsSemReq reqData; reqData.reqType = taskwait; - reqData.callingSlv = animSlv; + reqData.callingSlv = currVP; - VMS_WL__send_sem_request( &reqData, animSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); } void -VSs__taskwait_on(SlaveVP *animSlv,void* ptr){ +VSs__taskwait_on(void* ptr){ VSsSemReq reqData; reqData.reqType = taskwait_on; - reqData.callingSlv = animSlv; + reqData.callingSlv = currVP; reqData.args = ptr; - VMS_WL__send_sem_request( &reqData, animSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); } void -VSs__start_critical(SlaveVP *animSlv,int32 name){ +VSs__start_critical(int32 name){ VSsSemReq reqData; reqData.reqType = critical_start; - reqData.callingSlv = animSlv; + reqData.callingSlv = currVP; reqData.criticalID = name; - VMS_WL__send_sem_request( &reqData, animSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); } void -VSs__end_critical(SlaveVP *animSlv,int32 name){ +VSs__end_critical(int32 name){ VSsSemReq reqData; reqData.reqType = critical_end; - reqData.callingSlv = animSlv; + reqData.callingSlv = currVP; reqData.criticalID = name; - VMS_WL__send_sem_request( &reqData, animSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); } //========================== send and receive ============================ // int32 * -VSs__give_self_taskID( SlaveVP *animSlv ) +VSs__give_self_taskID() { - return ((VSsSemData*)animSlv->semanticData)->taskStub->taskID; + return ((VSsSemData*)currVP->semanticData)->taskStub->taskID; } //================================ send =================================== void -VSs__send_of_type_to( void *msg, const int32 type, int32 *receiverID, - SlaveVP *senderSlv ) +VSs__send_of_type_to( void *msg, const int32 type, int32 *receiverID) { VSsSemReq reqData; reqData.reqType = send_type_to; @@ -637,17 +637,17 @@ reqData.msg = msg; reqData.msgType = type; reqData.receiverID = receiverID; - reqData.senderSlv = senderSlv; + reqData.senderSlv = currVP; reqData.nextReqInHashEntry = NULL; - VMS_WL__send_sem_request( &reqData, senderSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); //When come back from suspend, no longer own data reachable from msg } void -VSs__send_from_to( void *msg, int32 *senderID, int32 *receiverID, SlaveVP *senderSlv ) +VSs__send_from_to( void *msg, int32 *senderID, int32 *receiverID) { VSsSemReq reqData; reqData.reqType = send_from_to; @@ -655,11 +655,11 @@ reqData.msg = msg; reqData.senderID = senderID; reqData.receiverID = receiverID; - reqData.senderSlv = senderSlv; + reqData.senderSlv = currVP; reqData.nextReqInHashEntry = NULL; - VMS_WL__send_sem_request( &reqData, senderSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); } @@ -672,7 +672,7 @@ * messages. */ void * -VSs__receive_type_to( const int32 type, int32* receiverID, SlaveVP *receiverSlv ) +VSs__receive_type_to( const int32 type, int32* receiverID ) { DEBUG__printf1(dbgRqstHdlr,"WL: receive type to %d",receiverID[1] ); VSsSemReq reqData; @@ -680,13 +680,13 @@ reqData.msgType = type; reqData.receiverID = receiverID; - reqData.receiverSlv = receiverSlv; + reqData.receiverSlv = currVP; reqData.nextReqInHashEntry = NULL; - VMS_WL__send_sem_request( &reqData, receiverSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); - return receiverSlv->dataRetFromReq; + return currVP->dataRetFromReq; } @@ -696,7 +696,7 @@ * between sender and receiver. */ void * -VSs__receive_from_to( int32 *senderID, int32 *receiverID, SlaveVP *receiverSlv ) +VSs__receive_from_to( int32 *senderID, int32 *receiverID) { VSsSemReq reqData; @@ -704,14 +704,14 @@ reqData.senderID = senderID; reqData.receiverID = receiverID; - reqData.receiverSlv = receiverSlv; + reqData.receiverSlv = currVP; reqData.nextReqInHashEntry = NULL; DEBUG__printf2(dbgRqstHdlr,"WL: receive from %d to: %d", reqData.senderID[1], reqData.receiverID[1]); - VMS_WL__send_sem_request( &reqData, receiverSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); - return receiverSlv->dataRetFromReq; + return currVP->dataRetFromReq; } @@ -737,7 +737,7 @@ * semantic environment. */ void -VSs__start_fn_singleton( int32 singletonID, SlaveVP *animSlv ) +VSs__start_fn_singleton( int32 singletonID) { VSsSemReq reqData; @@ -745,10 +745,10 @@ reqData.reqType = singleton_fn_start; reqData.singletonID = singletonID; - VMS_WL__send_sem_request( &reqData, animSlv ); - if( animSlv->dataRetFromReq ) //will be 0 or addr of label in end singleton + VMS_WL__send_sem_request( &reqData, currVP ); + if( currVP->dataRetFromReq ) //will be 0 or addr of label in end singleton { - VSsSemEnv *semEnv = VMS_int__give_sem_env_for( animSlv ); + VSsSemEnv *semEnv = VMS_int__give_sem_env_for( currVP ); asm_write_ret_from_singleton(&(semEnv->fnSingletons[ singletonID])); } } @@ -758,7 +758,7 @@ * location. */ void -VSs__start_data_singleton( VSsSingleton **singletonAddr, SlaveVP *animSlv ) +VSs__start_data_singleton( VSsSingleton **singletonAddr ) { VSsSemReq reqData; @@ -768,8 +768,8 @@ reqData.reqType = singleton_data_start; reqData.singletonPtrAddr = singletonAddr; - VMS_WL__send_sem_request( &reqData, animSlv ); - if( animSlv->dataRetFromReq ) //either 0 or end singleton's return addr + VMS_WL__send_sem_request( &reqData, currVP ); + if( currVP->dataRetFromReq ) //either 0 or end singleton's return addr { //Assembly code changes the return addr on the stack to the one // saved into the singleton by the end-singleton-fn //The return addr is at 0x4(%%ebp) @@ -787,26 +787,26 @@ * inside is shared by all invocations of a given singleton ID. */ void -VSs__end_fn_singleton( int32 singletonID, SlaveVP *animSlv ) +VSs__end_fn_singleton( int32 singletonID ) { VSsSemReq reqData; //don't need this addr until after at least one singleton has reached // this function - VSsSemEnv *semEnv = VMS_int__give_sem_env_for( animSlv ); + VSsSemEnv *semEnv = VMS_int__give_sem_env_for( currVP ); asm_write_ret_from_singleton(&(semEnv->fnSingletons[ singletonID])); reqData.reqType = singleton_fn_end; reqData.singletonID = singletonID; - VMS_WL__send_sem_request( &reqData, animSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); //EndSingletonInstrAddr: return; } void -VSs__end_data_singleton( VSsSingleton **singletonPtrAddr, SlaveVP *animSlv ) +VSs__end_data_singleton( VSsSingleton **singletonPtrAddr ) { VSsSemReq reqData; @@ -824,7 +824,7 @@ reqData.reqType = singleton_data_end; reqData.singletonPtrAddr = singletonPtrAddr; - VMS_WL__send_sem_request( &reqData, animSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); } /*This executes the function in the masterVP, so it executes in isolation @@ -839,7 +839,7 @@ */ void VSs__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster, - void *data, SlaveVP *animSlv ) + void *data ) { VSsSemReq reqData; @@ -848,7 +848,7 @@ reqData.fnToExecInMaster = ptrToFnToExecInMaster; reqData.dataForFn = data; - VMS_WL__send_sem_request( &reqData, animSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); } @@ -866,16 +866,16 @@ *If NULL, then write requesting into the field and resume. */ void -VSs__start_transaction( int32 transactionID, SlaveVP *animSlv ) +VSs__start_transaction( int32 transactionID ) { VSsSemReq reqData; // - reqData.callingSlv = animSlv; + reqData.callingSlv = currVP; reqData.reqType = trans_start; reqData.transID = transactionID; - VMS_WL__send_sem_request( &reqData, animSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); } /*This suspends to the master, then uses transactionID as index into an @@ -888,16 +888,16 @@ * resumes both. */ void -VSs__end_transaction( int32 transactionID, SlaveVP *animSlv ) +VSs__end_transaction( int32 transactionID ) { VSsSemReq reqData; // - reqData.callingSlv = animSlv; + reqData.callingSlv = currVP; reqData.reqType = trans_end; reqData.transID = transactionID; - VMS_WL__send_sem_request( &reqData, animSlv ); + VMS_WL__send_sem_request( &reqData, currVP ); } //======================== Internal ================================== @@ -941,3 +941,20 @@ return creatingSlv->dataRetFromReq; } +int __main_ret; + +void __entry_point(void* _args) { + __main_args* args = (__main_args*) _args; + __main_ret = __program_main(args->argc, args->argv); + VSs__end_thread(); +} + +#undef main + +int main(int argc, char** argv) { + __main_args args; + args.argc = argc; + args.argv = argv; + VSs__create_seed_slave_and_do_work(__entry_point, (void*) &args); + return __main_ret; +} \ No newline at end of file diff -r 94911329b067 -r c8d4f6d3c7d3 VSs.h --- a/VSs.h Mon Apr 15 16:41:31 2013 +0200 +++ b/VSs.h Wed May 15 15:25:55 2013 +0200 @@ -39,7 +39,7 @@ /*This header defines everything specific to the VSs semantic plug-in */ typedef struct _VSsSemReq VSsSemReq; -typedef void (*VSsTaskFnPtr ) ( void *, SlaveVP *); +typedef void (*VSsTaskFnPtr ) ( void * ); typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master //=========================================================================== @@ -318,7 +318,7 @@ SlaveVP *creatingThd ); void -VSs__end_thread( SlaveVP *thdToEnd ); +VSs__end_thread(); //======================= @@ -329,69 +329,67 @@ //======================= void -VSs__submit_task( VSsTaskType *taskType, void *args, SlaveVP *animSlv); +VSs__submit_task( VSsTaskType *taskType, void *args); int32 * -VSs__create_taskID_of_size( int32 numInts, SlaveVP *animSlv ); +VSs__create_taskID_of_size( int32 numInts); void -VSs__submit_task_with_ID( VSsTaskType *taskType, void *args, int32 *taskID, - SlaveVP *animSlv); +VSs__submit_task_with_ID( VSsTaskType *taskType, void *args, int32 *taskID); void -VSs__end_task( SlaveVP *animSlv ); +VSs__end_task(); //========================= void -VSs__taskwait(SlaveVP *animSlv); +VSs__taskwait(); void -VSs__taskwait_on(SlaveVP *animSlv,void* ptr); +VSs__taskwait_on(void* ptr); void -VSs__start_critical(SlaveVP *animSlv,int32 name); +VSs__start_critical(int32 name); void -VSs__end_critical(SlaveVP *animSlv,int32 name); +VSs__end_critical(int32 name); int32 * -VSs__give_self_taskID( SlaveVP *animSlv ); +VSs__give_self_taskID(); void -VSs__send_of_type_to( void *msg, const int32 type, int32 *receiverID, - SlaveVP *senderSlv ); +VSs__send_of_type_to( void *msg, const int32 type, int32 *receiverID); void -VSs__send_from_to( void *msg, int32 *senderID, int32 *receiverID, SlaveVP *senderSlv ); +VSs__send_from_to( void *msg, int32 *senderID, int32 *receiverID); void * -VSs__receive_type_to( const int32 type, int32* receiverID, SlaveVP *receiverSlv ); +VSs__receive_type_to( const int32 type, int32* receiverID ); void * -VSs__receive_from_to( int32 *senderID, int32 *receiverID, SlaveVP *receiverSlv ); +VSs__receive_from_to( int32 *senderID, int32 *receiverID ); //======================= Concurrency Stuff ====================== void -VSs__start_fn_singleton( int32 singletonID, SlaveVP *animSlv ); +VSs__start_fn_singleton( int32 singletonID ); void -VSs__end_fn_singleton( int32 singletonID, SlaveVP *animSlv ); +VSs__end_fn_singleton( int32 singletonID ); void -VSs__start_data_singleton( VSsSingleton **singeltonAddr, SlaveVP *animSlv ); +VSs__start_data_singleton( VSsSingleton **singeltonAddr ); void -VSs__end_data_singleton( VSsSingleton **singletonAddr, SlaveVP *animSlv ); +VSs__end_data_singleton( VSsSingleton **singletonAddr ); void VSs__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster, - void *data, SlaveVP *animSlv ); + void *data ); void -VSs__start_transaction( int32 transactionID, SlaveVP *animSlv ); +VSs__start_transaction( int32 transactionID ); void -VSs__end_transaction( int32 transactionID, SlaveVP *animSlv ); +VSs__end_transaction( int32 transactionID ); //========================= Internal use only ============================= @@ -418,7 +416,7 @@ SlaveVP *creatingSlv, int32 coreToAssignOnto); void -idle_fn(void* data, SlaveVP *animatingSlv); +idle_fn(void* data); void resume_slaveVP(SlaveVP *slave, VSsSemEnv *semEnv); @@ -427,5 +425,24 @@ #include "Measurement/VSs_Measurement.h" //=========================================================================== + +/* Hide entry point trick */ + +typedef struct { + int argc; + char** argv; +} __main_args; + +extern int __main_ret; + +int __program_main(int argc, char** argv); + +void __entry_point(void* _args); + +int main(int argc, char** argv); + + +#define main __program_main + #endif /* _VSs_H */