msach@6: /* msach@6: * Copyright 2009 OpenSourceStewardshipFoundation.org msach@6: * Licensed under GNU General Public License version 2 msach@6: * msach@6: * Author: seanhalle@yahoo.com msach@6: * msach@6: */ msach@6: msach@6: #ifndef _VCilk_H msach@6: #define _VCilk_H msach@6: msach@6: #include "VMS/Queue_impl/PrivateQueue.h" msach@6: #include "VMS/Hash_impl/PrivateHash.h" msach@6: #include "VMS/VMS.h" msach@6: msach@6: msach@6: msach@6: /*This header defines everything specific to the VCilk semantic plug-in msach@6: */ msach@6: msach@6: //=========================================================================== msach@6: #define NUM_STRUCS_IN_SEM_ENV 1000 msach@6: msach@6: //=========================================================================== msach@6: typedef struct _VCilkSemReq VCilkSemReq; msach@6: typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master msach@6: msach@6: //=========================================================================== msach@6: msach@6: msach@6: /*WARNING: assembly hard-codes position of endInstrAddr as first field msach@6: */ msach@6: typedef struct msach@6: { msach@6: void *endInstrAddr; msach@6: int32 hasBeenStarted; msach@6: int32 hasFinished; msach@6: PrivQueueStruc *waitQ; msach@6: } msach@6: VCilkSingleton; msach@6: msach@6: /*Semantic layer-specific data sent inside a request from lib called in app msach@6: * to request handler called in MasterLoop msach@6: */ msach@6: enum VCilkReqType msach@6: { msach@6: syncReq = 1, msach@6: mallocReq, msach@6: freeReq, msach@6: singleton_fn_start, msach@6: singleton_fn_end, msach@6: singleton_data_start, msach@6: singleton_data_end, msach@6: atomic, msach@6: trans_start, msach@6: trans_end msach@6: }; msach@6: msach@6: struct _VCilkSemReq msach@6: { enum VCilkReqType reqType; msach@6: VirtProcr *requestingPr; msach@6: msach@6: int32 sizeToMalloc; msach@6: void *ptrToFree; msach@6: msach@6: VirtProcrFnPtr fnPtr; msach@6: void *initData; msach@6: int32 coreToSpawnOnto; msach@6: msach@6: int32 singletonID; msach@6: VCilkSingleton **singletonPtrAddr; msach@6: msach@6: PtrToAtomicFn fnToExecInMaster; msach@6: void *dataForFn; msach@6: msach@6: int32 transID; msach@6: } msach@6: /* VCilkSemReq */; msach@6: msach@6: typedef struct msach@6: { msach@6: VirtProcr *VPCurrentlyExecuting; msach@6: PrivQueueStruc *waitingVPQ; msach@6: } msach@6: VCilkTrans; msach@6: msach@6: typedef struct msach@6: { msach@6: PrivQueueStruc **readyVPQs; msach@6: HashTable *commHashTbl; msach@6: int32 numVirtPr; msach@6: int32 nextCoreToGetNewPr; msach@6: int32 primitiveStartTime; msach@6: msach@6: //fix limit on num with dynArray msach@6: VCilkSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV]; msach@6: VCilkTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV]; msach@6: } msach@6: VCilkSemEnv; msach@6: msach@6: typedef struct _TransListElem TransListElem; msach@6: struct _TransListElem msach@6: { msach@6: int32 transID; msach@6: TransListElem *nextTrans; msach@6: }; msach@6: //TransListElem msach@6: msach@6: typedef struct msach@6: { msach@6: int32 syncPending; msach@6: int32 numLiveChildren; msach@6: VirtProcr *parentPr; msach@6: msach@6: int32 highestTransEntered; msach@6: TransListElem *lastTransEntered; msach@6: } msach@6: VCilkSemData; msach@6: msach@6: //=========================================================================== msach@6: msach@6: void msach@6: VCilk__create_seed_procr_and_do_work( VirtProcrFnPtr fn, void *initData ); msach@6: msach@6: int32 msach@6: VCilk__giveMinWorkUnitCycles( float32 percentOverhead ); msach@6: msach@6: void inline msach@6: VCilk__start_primitive(); msach@6: msach@6: int32 inline msach@6: VCilk__end_primitive_and_give_cycles(); msach@6: msach@6: int32 msach@6: VCilk__giveIdealNumWorkUnits(); msach@6: msach@6: //======================= msach@6: msach@6: void msach@6: VCilk__init(); msach@6: msach@6: void msach@6: VCilk__cleanup_at_end_of_shutdown(); msach@6: msach@6: //======================= msach@6: msach@6: void inline msach@6: VCilk__spawn( int32 coreToSpawnOnto, VirtProcrFnPtr fnPtr, msach@6: void *initData, VirtProcr *creatingPr ); msach@6: msach@6: int32 msach@6: VCilk__give_number_of_cores_to_spawn_onto(); msach@6: msach@6: void msach@6: VCilk__sync( VirtProcr *animatingPr ); msach@6: msach@6: void * msach@6: VCilk__malloc( int32 sizeToMalloc, VirtProcr *animPr ); msach@6: msach@6: void msach@6: VCilk__free( void *ptrToFree, VirtProcr *animPr ); msach@6: msach@6: void msach@6: VCilk__dissipate_procr( VirtProcr *procrToDissipate ); msach@6: msach@6: msach@6: //======================= Concurrency Stuff ====================== msach@6: void msach@6: VCilk__start_fn_singleton( int32 singletonID, VirtProcr *animPr ); msach@6: msach@6: void msach@6: VCilk__end_fn_singleton( int32 singletonID, VirtProcr *animPr ); msach@6: msach@6: void msach@6: VCilk__start_data_singleton( VCilkSingleton **singeltonAddr, VirtProcr *animPr ); msach@6: msach@6: void msach@6: VCilk__end_data_singleton( VCilkSingleton **singletonAddr, VirtProcr *animPr ); msach@6: msach@6: void msach@6: VCilk__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster, msach@6: void *data, VirtProcr *animPr ); msach@6: msach@6: void msach@6: VCilk__start_transaction( int32 transactionID, VirtProcr *animPr ); msach@6: msach@6: void msach@6: VCilk__end_transaction( int32 transactionID, VirtProcr *animPr ); msach@6: msach@6: msach@6: //========================= Internal use only ============================= msach@6: void msach@6: VCilk__Request_Handler( VirtProcr *requestingPr, void *_semEnv ); msach@6: msach@6: VirtProcr * msach@6: VCilk__schedule_virt_procr( void *_semEnv, int coreNum ); msach@6: msach@6: msach@6: #endif /* _VCilk_H */ msach@6: