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@27: #ifndef _VPThread_H seanhalle@27: #define _VPThread_H 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@27: /*This header defines everything specific to the VPThread 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@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@27: typedef struct _VPThreadSemReq VPThdSemReq; 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@27: void *endInstrAddr; seanhalle@27: int32 hasBeenStarted; seanhalle@27: int32 hasFinished; seanhalle@27: PrivQueueStruc *waitQ; seanhalle@27: } seanhalle@27: VPThdSingleton; 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@27: enum VPThreadReqType 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@27: make_procr, 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@27: struct _VPThreadSemReq seanhalle@27: { enum VPThreadReqType reqType; seanhalle@27: SlaveVP *requestingVP; 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@27: VPThdSingleton **singletonPtrAddr; seanhalle@27: seanhalle@27: PtrToAtomicFn fnToExecInMaster; seanhalle@27: void *dataForFn; seanhalle@27: seanhalle@27: int32 transID; seanhalle@27: } seanhalle@27: /* VPThreadSemReq */; seanhalle@27: seanhalle@27: seanhalle@27: typedef struct seanhalle@27: { seanhalle@27: SlaveVP *VPCurrentlyExecuting; seanhalle@27: PrivQueueStruc *waitingVPQ; seanhalle@27: } seanhalle@27: VPThdTrans; 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@27: VPThdMutex; seanhalle@27: seanhalle@27: seanhalle@27: typedef struct seanhalle@27: { seanhalle@27: int32 condIdx; seanhalle@27: PrivQueueStruc *waitingQueue; seanhalle@27: VPThdMutex *partnerMutex; seanhalle@27: } seanhalle@27: VPThdCond; 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@27: VPThdSemData; seanhalle@27: seanhalle@27: seanhalle@27: typedef struct seanhalle@27: { seanhalle@27: //Standard stuff will be in most every semantic env seanhalle@27: PrivQueueStruc **readyVPQs; seanhalle@27: int32 numVirtVP; seanhalle@27: int32 nextCoreToGetNewVP; seanhalle@27: int32 primitiveStartTime; seanhalle@27: seanhalle@27: //Specific to this semantic layer seanhalle@27: VPThdMutex **mutexDynArray; seanhalle@27: PrivDynArrayInfo *mutexDynArrayInfo; seanhalle@27: seanhalle@27: VPThdCond **condDynArray; seanhalle@27: PrivDynArrayInfo *condDynArrayInfo; seanhalle@27: seanhalle@27: void *applicationGlobals; seanhalle@27: seanhalle@27: //fix limit on num with dynArray seanhalle@27: VPThdSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV]; seanhalle@27: seanhalle@27: VPThdTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV]; seanhalle@27: } seanhalle@27: VPThdSemEnv; seanhalle@27: seanhalle@27: seanhalle@27: //=========================================================================== seanhalle@27: seanhalle@27: inline void seanhalle@27: VPThread__create_seed_procr_and_do_work( TopLevelFnPtr fn, void *initData ); seanhalle@27: seanhalle@27: //======================= seanhalle@27: seanhalle@27: inline SlaveVP * seanhalle@27: VPThread__create_thread( TopLevelFnPtr fnPtr, void *initData, seanhalle@27: SlaveVP *creatingVP ); seanhalle@27: seanhalle@27: inline SlaveVP * seanhalle@27: VPThread__create_thread_with_affinity( TopLevelFnPtr fnPtr, void *initData, seanhalle@27: SlaveVP *creatingVP, int32 coreToScheduleOnto ); seanhalle@27: seanhalle@27: inline void seanhalle@27: VPThread__dissipate_thread( SlaveVP *procrToDissipate ); seanhalle@27: seanhalle@27: //======================= seanhalle@27: inline void seanhalle@27: VPThread__set_globals_to( void *globals ); seanhalle@27: seanhalle@27: inline void * seanhalle@27: VPThread__give_globals(); seanhalle@27: seanhalle@27: //======================= seanhalle@27: inline int32 seanhalle@27: VPThread__make_mutex( SlaveVP *animVP ); seanhalle@27: seanhalle@27: inline void seanhalle@27: VPThread__mutex_lock( int32 mutexIdx, SlaveVP *acquiringVP ); seanhalle@27: seanhalle@27: inline void seanhalle@27: VPThread__mutex_unlock( int32 mutexIdx, SlaveVP *releasingVP ); seanhalle@27: seanhalle@27: seanhalle@27: //======================= seanhalle@27: inline int32 seanhalle@27: VPThread__make_cond( int32 ownedMutexIdx, SlaveVP *animPr); seanhalle@27: seanhalle@27: inline void seanhalle@27: VPThread__cond_wait( int32 condIdx, SlaveVP *waitingPr); seanhalle@27: seanhalle@27: inline void * seanhalle@27: VPThread__cond_signal( int32 condIdx, SlaveVP *signallingVP ); seanhalle@27: seanhalle@27: seanhalle@27: //======================= seanhalle@27: void seanhalle@27: VPThread__start_fn_singleton( int32 singletonID, SlaveVP *animVP ); seanhalle@27: seanhalle@27: void seanhalle@27: VPThread__end_fn_singleton( int32 singletonID, SlaveVP *animVP ); seanhalle@27: seanhalle@27: void seanhalle@27: VPThread__start_data_singleton( VPThdSingleton **singeltonAddr, SlaveVP *animVP ); seanhalle@27: seanhalle@27: void seanhalle@27: VPThread__end_data_singleton( VPThdSingleton **singletonAddr, SlaveVP *animVP ); seanhalle@27: seanhalle@27: void seanhalle@27: VPThread__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster, seanhalle@27: void *data, SlaveVP *animVP ); seanhalle@27: seanhalle@27: void seanhalle@27: VPThread__start_transaction( int32 transactionID, SlaveVP *animVP ); seanhalle@27: seanhalle@27: void seanhalle@27: VPThread__end_transaction( int32 transactionID, SlaveVP *animVP ); seanhalle@27: seanhalle@27: seanhalle@27: seanhalle@27: //========================= Internal use only ============================= seanhalle@27: inline void seanhalle@27: VPThread__Request_Handler( SlaveVP *requestingVP, void *_semEnv ); seanhalle@27: seanhalle@27: inline SlaveVP * seanhalle@27: VPThread__schedule_virt_procr( void *_semEnv, int coreNum ); seanhalle@27: seanhalle@27: //======================= seanhalle@27: inline void seanhalle@27: VPThread__free_semantic_request( VPThdSemReq *semReq ); seanhalle@27: seanhalle@27: //======================= seanhalle@27: seanhalle@27: void * seanhalle@27: VPThread__malloc( size_t sizeToMalloc, SlaveVP *animVP ); seanhalle@27: seanhalle@27: void seanhalle@27: VPThread__init(); seanhalle@27: seanhalle@27: void seanhalle@27: VPThread__cleanup_after_shutdown(); seanhalle@27: seanhalle@27: void inline seanhalle@27: resume_procr( SlaveVP *procr, VPThdSemEnv *semEnv ); seanhalle@27: seanhalle@27: #endif /* _VPThread_H */ seanhalle@27: