seanhalle@27: /* seanhalle@27: * Copyright 2009 OpenSourceStewardshipFoundation.org seanhalle@27: * Licensed under GNU General Public License version 2 seanhalle@27: * seanhalle@27: * Author: seanhalle@yahoo.com seanhalle@27: * seanhalle@27: */ seanhalle@27: seanhalle@28: #ifndef _Vthread_H seanhalle@28: #define _Vthread_H seanhalle@28: seanhalle@28: #define _LANG_NAME_ "Vthread" seanhalle@27: seanhalle@27: #include "VMS_impl/VMS.h" seanhalle@27: #include "C_Libraries/Queue_impl/PrivateQueue.h" seanhalle@27: #include "C_Libraries/DynArray/DynArray.h" seanhalle@27: seanhalle@27: seanhalle@28: /*This header defines everything specific to the Vthread semantic plug-in seanhalle@27: */ seanhalle@27: seanhalle@27: seanhalle@27: //=========================================================================== seanhalle@27: //turn on the counter measurements of language overhead -- comment to turn off seanhalle@27: #define MEAS__TURN_ON_LANG_MEAS seanhalle@29: #include "Vthread__Measurement.h" seanhalle@27: seanhalle@27: #define INIT_NUM_MUTEX 10000 seanhalle@27: #define INIT_NUM_COND 10000 seanhalle@27: seanhalle@27: #define NUM_STRUCS_IN_SEM_ENV 1000 seanhalle@27: //=========================================================================== seanhalle@27: seanhalle@27: //=========================================================================== seanhalle@28: typedef struct _VthreadSemReq VthdSemReq; seanhalle@27: typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master seanhalle@27: //=========================================================================== seanhalle@27: seanhalle@27: seanhalle@27: /*WARNING: assembly hard-codes position of endInstrAddr as first field seanhalle@27: */ seanhalle@27: typedef struct seanhalle@27: { seanhalle@28: void *savedRetAddr; seanhalle@27: int32 hasBeenStarted; seanhalle@27: int32 hasFinished; seanhalle@27: PrivQueueStruc *waitQ; seanhalle@27: } seanhalle@28: VthdSingleton; seanhalle@27: seanhalle@27: /*Semantic layer-specific data sent inside a request from lib called in app seanhalle@27: * to request handler called in MasterLoop seanhalle@27: */ seanhalle@28: enum VthreadReqType seanhalle@27: { seanhalle@27: make_mutex = 1, seanhalle@27: mutex_lock, seanhalle@27: mutex_unlock, seanhalle@27: make_cond, seanhalle@27: cond_wait, seanhalle@27: cond_signal, seanhalle@28: make_slaveVP, seanhalle@27: malloc_req, seanhalle@27: free_req, seanhalle@27: singleton_fn_start, seanhalle@27: singleton_fn_end, seanhalle@27: singleton_data_start, seanhalle@27: singleton_data_end, seanhalle@27: atomic, seanhalle@27: trans_start, seanhalle@27: trans_end seanhalle@27: }; seanhalle@27: seanhalle@28: struct _VthreadSemReq seanhalle@28: { enum VthreadReqType reqType; seanhalle@28: SlaveVP *requestingSlv; seanhalle@27: int32 mutexIdx; seanhalle@27: int32 condIdx; seanhalle@27: seanhalle@27: void *initData; seanhalle@27: TopLevelFnPtr fnPtr; seanhalle@27: int32 coreToScheduleOnto; seanhalle@27: seanhalle@27: size_t sizeToMalloc; seanhalle@27: void *ptrToFree; seanhalle@27: seanhalle@27: int32 singletonID; seanhalle@28: VthdSingleton *singleton; seanhalle@27: seanhalle@27: PtrToAtomicFn fnToExecInMaster; seanhalle@27: void *dataForFn; seanhalle@27: seanhalle@27: int32 transID; seanhalle@27: } seanhalle@28: /* VthreadSemReq */; seanhalle@27: seanhalle@27: seanhalle@27: typedef struct seanhalle@27: { seanhalle@28: SlaveVP *SlvCurrentlyExecuting; seanhalle@28: PrivQueueStruc *waitingSlvQ; seanhalle@27: } seanhalle@28: VthdTrans; seanhalle@27: seanhalle@27: seanhalle@27: typedef struct seanhalle@27: { seanhalle@27: int32 mutexIdx; seanhalle@27: SlaveVP *holderOfLock; seanhalle@27: PrivQueueStruc *waitingQueue; seanhalle@27: } seanhalle@28: VthdMutex; seanhalle@27: seanhalle@27: seanhalle@27: typedef struct seanhalle@27: { seanhalle@27: int32 condIdx; seanhalle@27: PrivQueueStruc *waitingQueue; seanhalle@28: VthdMutex *partnerMutex; seanhalle@27: } seanhalle@28: VthdCond; seanhalle@27: seanhalle@27: typedef struct _TransListElem TransListElem; seanhalle@27: struct _TransListElem seanhalle@27: { seanhalle@27: int32 transID; seanhalle@27: TransListElem *nextTrans; seanhalle@27: }; seanhalle@27: //TransListElem seanhalle@27: seanhalle@27: typedef struct seanhalle@27: { seanhalle@27: int32 highestTransEntered; seanhalle@27: TransListElem *lastTransEntered; seanhalle@27: } seanhalle@28: VthdSemData; seanhalle@27: seanhalle@27: seanhalle@27: typedef struct seanhalle@27: { seanhalle@27: //Standard stuff will be in most every semantic env seanhalle@28: PrivQueueStruc **readySlvQs; seanhalle@28: int32 nextCoreToGetNewSlv; seanhalle@27: int32 primitiveStartTime; seanhalle@27: seanhalle@27: //Specific to this semantic layer seanhalle@28: VthdMutex **mutexDynArray; seanhalle@27: PrivDynArrayInfo *mutexDynArrayInfo; seanhalle@27: seanhalle@28: VthdCond **condDynArray; seanhalle@27: PrivDynArrayInfo *condDynArrayInfo; seanhalle@27: seanhalle@27: void *applicationGlobals; seanhalle@27: seanhalle@27: //fix limit on num with dynArray seanhalle@28: VthdSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV]; seanhalle@27: seanhalle@28: VthdTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV]; seanhalle@27: } seanhalle@28: VthdSemEnv; seanhalle@27: seanhalle@29: //========================================================================== seanhalle@29: seanhalle@29: void seanhalle@29: Vthread__init(); seanhalle@29: seanhalle@29: void seanhalle@29: Vthread__init_Seq(); seanhalle@29: seanhalle@29: void seanhalle@29: Vthread__init_Helper(); seanhalle@29: seanhalle@27: seanhalle@27: //=========================================================================== seanhalle@27: seanhalle@27: inline void seanhalle@28: Vthread__create_seed_slaveVP_and_do_work( TopLevelFnPtr fn, void *initData ); seanhalle@27: seanhalle@29: inline SlaveVP * seanhalle@29: Vthread__create_slaveVP_helper( TopLevelFnPtr fnPtr, void *initData, seanhalle@29: VthdSemEnv *semEnv, int32 coreToScheduleOnto ); seanhalle@29: seanhalle@27: //======================= seanhalle@27: seanhalle@27: inline SlaveVP * seanhalle@28: Vthread__create_thread( TopLevelFnPtr fnPtr, void *initData, seanhalle@28: SlaveVP *creatingSlv ); seanhalle@27: seanhalle@27: inline SlaveVP * seanhalle@28: Vthread__create_thread_with_affinity( TopLevelFnPtr fnPtr, void *initData, seanhalle@28: SlaveVP *creatingSlv, int32 coreToScheduleOnto ); seanhalle@27: seanhalle@27: inline void seanhalle@28: Vthread__dissipate_thread( SlaveVP *procrToDissipate ); seanhalle@27: seanhalle@27: //======================= seanhalle@27: inline void seanhalle@28: Vthread__set_globals_to( void *globals ); seanhalle@27: seanhalle@27: inline void * seanhalle@28: Vthread__give_globals(); seanhalle@27: seanhalle@27: //======================= seanhalle@27: inline int32 seanhalle@28: Vthread__make_mutex( SlaveVP *animSlv ); seanhalle@27: seanhalle@27: inline void seanhalle@28: Vthread__mutex_lock( int32 mutexIdx, SlaveVP *acquiringSlv ); seanhalle@27: seanhalle@27: inline void seanhalle@28: Vthread__mutex_unlock( int32 mutexIdx, SlaveVP *releasingSlv ); seanhalle@27: seanhalle@27: seanhalle@27: //======================= seanhalle@27: inline int32 seanhalle@28: Vthread__make_cond( int32 ownedMutexIdx, SlaveVP *animSlv); seanhalle@27: seanhalle@27: inline void seanhalle@28: Vthread__cond_wait( int32 condIdx, SlaveVP *waitingSlv); seanhalle@27: seanhalle@27: inline void * seanhalle@28: Vthread__cond_signal( int32 condIdx, SlaveVP *signallingSlv ); seanhalle@27: seanhalle@27: seanhalle@27: //======================= seanhalle@27: void seanhalle@28: Vthread__start_fn_singleton( int32 singletonID, SlaveVP *animSlv ); seanhalle@27: seanhalle@27: void seanhalle@28: Vthread__end_fn_singleton( int32 singletonID, SlaveVP *animSlv ); seanhalle@27: seanhalle@27: void seanhalle@28: Vthread__start_data_singleton( VthdSingleton *singelton, SlaveVP *animSlv ); seanhalle@27: seanhalle@27: void seanhalle@28: Vthread__end_data_singleton( VthdSingleton *singleton, SlaveVP *animSlv ); seanhalle@27: seanhalle@27: void seanhalle@28: Vthread__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster, seanhalle@28: void *data, SlaveVP *animSlv ); seanhalle@27: seanhalle@27: void seanhalle@28: Vthread__start_transaction( int32 transactionID, SlaveVP *animSlv ); seanhalle@27: seanhalle@27: void seanhalle@28: Vthread__end_transaction( int32 transactionID, SlaveVP *animSlv ); seanhalle@27: seanhalle@27: seanhalle@27: seanhalle@27: //========================= Internal use only ============================= seanhalle@27: inline void seanhalle@28: Vthread__Request_Handler( SlaveVP *requestingSlv, void *_semEnv ); seanhalle@27: seanhalle@27: inline SlaveVP * seanhalle@28: Vthread__schedule_slaveVP( void *_semEnv, int coreNum ); seanhalle@27: seanhalle@27: //======================= seanhalle@27: inline void seanhalle@28: Vthread__free_semantic_request( VthdSemReq *semReq ); seanhalle@27: seanhalle@27: //======================= seanhalle@27: seanhalle@27: void * seanhalle@28: Vthread__malloc( size_t sizeToMalloc, SlaveVP *animSlv ); seanhalle@27: seanhalle@27: void seanhalle@28: Vthread__init(); seanhalle@27: seanhalle@27: void seanhalle@28: Vthread__cleanup_after_shutdown(); seanhalle@27: seanhalle@27: void inline seanhalle@28: resume_slaveVP( SlaveVP *procr, VthdSemEnv *semEnv ); seanhalle@27: seanhalle@28: #endif /* _Vthread_H */ seanhalle@27: