Me@0: /* Me@0: * Copyright 2009 OpenSourceStewardshipFoundation.org Me@0: * Licensed under GNU General Public License version 2 Me@0: * Me@0: * Author: seanhalle@yahoo.com Me@0: * Me@0: */ Me@0: Me@0: #ifndef _VPThread_H Me@0: #define _VPThread_H Me@0: Me@0: #include "VMS/VMS.h" Me@0: #include "VMS/Queue_impl/PrivateQueue.h" Me@0: #include "VMS/DynArray/DynArray.h" Me@0: Me@0: Me@0: //=========================================================================== Me@0: #define INIT_NUM_MUTEX 10000 Me@0: #define INIT_NUM_COND 10000 Me@0: //=========================================================================== Me@0: Me@0: /*This header defines everything specific to the VPThread semantic plug-in Me@0: */ Me@0: typedef struct _VPThreadSemReq VPThreadSemReq; Me@0: Me@0: Me@0: /*Semantic layer-specific data sent inside a request from lib called in app Me@0: * to request handler called in MasterLoop Me@0: */ Me@0: enum VPThreadReqType Me@0: { Me@0: make_mutex = 1, Me@0: mutex_lock, Me@0: mutex_unlock, Me@0: make_cond, Me@0: cond_wait, Me@0: cond_signal, Me@0: make_procr Me@0: }; Me@0: Me@0: struct _VPThreadSemReq Me@0: { enum VPThreadReqType reqType; Me@0: VirtProcr *requestingPr; Me@0: int32 mutexIdx; Me@0: int32 condIdx; Me@0: void *initData; Me@0: VirtProcrFnPtr fnPtr; Me@0: } Me@0: /* VPThreadSemReq */; Me@0: Me@0: typedef struct Me@0: { Me@0: //Standard stuff will be in most every semantic env Me@0: PrivQueueStruc **readyVPQs; Me@0: int32 numVirtPr; Me@0: int32 nextCoreToGetNewPr; Me@0: Me@0: //Specific to this semantic layer Me@0: int32 currMutexIdx; Me@0: DynArray32 *mutexDynArray; Me@0: Me@0: int32 currCondIdx; Me@0: DynArray32 *condDynArray; Me@0: Me@0: void *applicationGlobals; Me@0: } Me@0: VPThreadSemEnv; Me@0: Me@0: Me@0: typedef struct Me@0: { Me@0: int32 mutexIdx; Me@0: VirtProcr *holderOfLock; Me@0: PrivQueueStruc *waitingQueue; Me@0: } Me@0: VPTMutex; Me@0: Me@0: Me@0: typedef struct Me@0: { Me@0: int32 condIdx; Me@0: PrivQueueStruc *waitingQueue; Me@0: VPTMutex *partnerMutex; Me@0: } Me@0: VPTCond; Me@0: Me@0: Me@0: //=========================================================================== Me@0: Me@0: void Me@0: VPThread__create_seed_procr_and_do_work( VirtProcrFnPtr fn, void *initData ); Me@0: Me@0: //======================= Me@0: Me@0: inline VirtProcr * Me@0: VPThread__create_thread( VirtProcrFnPtr fnPtr, void *initData, Me@0: VirtProcr *creatingPr ); Me@0: Me@0: void Me@0: VPThread__dissipate_thread( VirtProcr *procrToDissipate ); Me@0: Me@0: //======================= Me@0: void Me@0: VPThread__set_globals_to( void *globals ); Me@0: Me@0: void * Me@0: VPThread__give_globals(); Me@0: Me@0: //======================= Me@0: int32 Me@0: VPThread__make_mutex( VirtProcr *animPr ); Me@0: Me@0: void Me@0: VPThread__mutex_lock( int32 mutexIdx, VirtProcr *acquiringPr ); Me@0: Me@0: void Me@0: VPThread__mutex_unlock( int32 mutexIdx, VirtProcr *releasingPr ); Me@0: Me@0: Me@0: //======================= Me@0: int32 Me@0: VPThread__make_cond( int32 ownedMutexIdx, VirtProcr *animPr); Me@0: Me@0: void Me@0: VPThread__cond_wait( int32 condIdx, VirtProcr *waitingPr); Me@0: Me@0: void * Me@0: VPThread__cond_signal( int32 condIdx, VirtProcr *signallingPr ); Me@0: Me@0: Me@0: Me@0: Me@0: //========================= Internal use only ============================= Me@0: void Me@0: VPThread__Request_Handler( VirtProcr *requestingPr, void *_semEnv ); Me@0: Me@0: VirtProcr * Me@0: VPThread__schedule_virt_procr( void *_semEnv, int coreNum ); Me@0: Me@0: //======================= Me@0: void Me@0: VPThread__free_semantic_request( VPThreadSemReq *semReq ); Me@0: Me@0: //======================= Me@0: Me@0: void Me@0: VPThread__init(); Me@0: Me@0: void Me@0: VPThread__cleanup_after_shutdown(); Me@0: Me@0: #endif /* _VPThread_H */ Me@0: