seanhalle@260: /* seanhalle@260: * Copyright 2009 OpenSourceStewardshipFoundation.org seanhalle@260: * Licensed under GNU General Public License version 2 seanhalle@260: * seanhalle@260: * Author: seanhalle@yahoo.com seanhalle@260: * seanhalle@260: */ seanhalle@260: seanhalle@260: #ifndef _PR_H seanhalle@260: #define _PR_H seanhalle@260: #define _GNU_SOURCE seanhalle@260: seanhalle@260: #include "DynArray/DynArray.h" seanhalle@260: #include "Hash_impl/PrivateHash.h" seanhalle@260: #include "Histogram/Histogram.h" seanhalle@260: #include "Queue_impl/PrivateQueue.h" seanhalle@260: seanhalle@260: #include "PR_primitive_data_types.h" seanhalle@260: #include "Services_Offered_by_PR/Memory_Handling/vmalloc.h" seanhalle@260: seanhalle@260: #include seanhalle@260: #include seanhalle@260: seanhalle@260: //================= Defines: included from separate files ================= seanhalle@260: // seanhalle@260: // Note: ALL defines are in other files, none are in here seanhalle@260: // seanhalle@260: #include "Defines/PR_defs.h" seanhalle@260: seanhalle@260: seanhalle@260: //================================ Typedefs ================================= seanhalle@260: // seanhalle@260: typedef unsigned long long TSCount; seanhalle@260: seanhalle@261: typedef struct _AnimSlot AnimSlot; seanhalle@261: typedef struct _PRReqst PRReqst; seanhalle@260: typedef struct _SlaveVP SlaveVP; seanhalle@260: typedef struct _MasterVP MasterVP; seanhalle@260: typedef struct _IntervalProbe IntervalProbe; seanhalle@261: typedef struct _PRMetaTask PRMetaTask; seanhalle@260: seanhalle@260: seanhalle@260: typedef SlaveVP *(*SlaveAssigner) ( void *, AnimSlot*); //semEnv, slot for HW info seanhalle@260: typedef void (*RequestHandler) ( SlaveVP *, void * ); //prWReqst, semEnv seanhalle@261: typedef void (*IndivReqHandler)( SlaveVP *, void * ); //prWReqst, semEnv seanhalle@260: typedef void (*TopLevelFnPtr) ( void *, SlaveVP * ); //initData, animSlv seanhalle@260: typedef void TopLevelFn ( void *, SlaveVP * ); //initData, animSlv seanhalle@260: typedef void (*ResumeSlvFnPtr) ( SlaveVP *, void * ); seanhalle@260: //=========== MEASUREMENT STUFF ========== seanhalle@260: MEAS__Insert_Counter_Handler seanhalle@260: //======================================== seanhalle@260: seanhalle@260: //============================ HW Dependent Fns ================================ seanhalle@260: seanhalle@260: #include "HW_Dependent_Primitives/PR__HW_measurement.h" seanhalle@260: #include "HW_Dependent_Primitives/PR__primitives.h" seanhalle@260: seanhalle@260: seanhalle@260: //============= Request Related =========== seanhalle@260: // seanhalle@260: seanhalle@261: enum PRReqstType //avoid starting enums at 0, for debug reasons seanhalle@260: { seanhalle@261: TaskCreate = 1, seanhalle@261: TaskEnd, seanhalle@261: SlvCreate, seanhalle@261: SlvDissipate, seanhalle@261: Language, seanhalle@261: Service, //To invoke a PR provided equivalent of a language request (ex: probe) seanhalle@261: Hardware, seanhalle@261: IO, seanhalle@261: OSCall seanhalle@260: }; seanhalle@260: seanhalle@260: struct _PRReqst seanhalle@260: { seanhalle@261: enum PRReqstType reqType;//used for special forms that have PR behavior seanhalle@261: void *semReq; seanhalle@261: PRProcess *processReqIsIn; seanhalle@261: int32 langMagicNumber; seanhalle@261: PRMetaTask *metaTask; seanhalle@261: TopLevelFn topLevelFn; seanhalle@261: void *initData; seanhalle@261: int32 *ID; seanhalle@261: seanhalle@261: //The request handling structure is a bit messy.. for special forms, seanhalle@261: // such as create and dissipate, the language inserts pointer to handler seanhalle@261: // fn directly into the request.. might change to this for all requests seanhalle@261: IndivReqHandler handler; //pointer to handler fn for create, dissip, etc seanhalle@261: seanhalle@260: PRReqst *nextReqst; seanhalle@260: }; seanhalle@260: //PRReqst seanhalle@260: seanhalle@261: enum PRServReqType //These are equivalent to semantic requests, but for seanhalle@261: { // PR's services available directly to app, like OS seanhalle@260: make_probe = 1, // and probe services -- like a PR-wide built-in lang seanhalle@260: throw_excp, seanhalle@260: openFile, seanhalle@260: otherIO seanhalle@260: }; seanhalle@260: seanhalle@260: typedef struct seanhalle@261: { enum PRServReqType reqType; seanhalle@260: SlaveVP *requestingSlv; seanhalle@260: char *nameStr; //for create probe seanhalle@260: char *msgStr; //for exception seanhalle@260: void *exceptionData; seanhalle@260: } seanhalle@261: PRServReq; seanhalle@260: seanhalle@260: seanhalle@260: //==================== Core data structures =================== seanhalle@260: seanhalle@260: typedef struct seanhalle@260: { seanhalle@260: //for future expansion seanhalle@260: } seanhalle@260: SlotPerfInfo; seanhalle@260: seanhalle@260: struct _AnimSlot seanhalle@260: { seanhalle@260: int workIsDone; seanhalle@260: int needsSlaveAssigned; seanhalle@260: SlaveVP *slaveAssignedToSlot; seanhalle@260: seanhalle@260: int slotIdx; //needed by Holistic Model's data gathering seanhalle@260: int coreSlotIsOn; seanhalle@260: SlotPerfInfo *perfInfo; //used by assigner to pick best slave for core seanhalle@260: }; seanhalle@260: //AnimSlot seanhalle@260: seanhalle@260: enum VPtype seanhalle@266: { SlotTaskSlv = 1,//Slave tied to an anim slot, only animates tasks seanhalle@266: FreeTaskSlv, //When a suspended task ends, the slave becomes this seanhalle@261: GenericSlv, //the VP is explicitly seen in the app code, or task suspends seanhalle@260: Master, seanhalle@260: Shutdown, seanhalle@260: Idle seanhalle@260: }; seanhalle@260: seanhalle@260: /*This structure embodies the state of a slaveVP. It is reused for masterVP seanhalle@260: * and shutdownVPs. seanhalle@260: */ seanhalle@260: struct _SlaveVP seanhalle@260: { //The offsets of these fields are hard-coded into assembly seanhalle@260: void *stackPtr; //save the core's stack ptr when suspend seanhalle@260: void *framePtr; //save core's frame ptr when suspend seanhalle@260: void *resumeInstrPtr; //save core's program-counter when suspend seanhalle@260: void *coreCtlrFramePtr; //restore before jmp back to core controller seanhalle@260: void *coreCtlrStackPtr; //restore before jmp back to core controller seanhalle@260: seanhalle@260: //============ below this, no fields are used in asm ============= seanhalle@260: seanhalle@261: void *startOfStack; //used to free, and to point slave to Fn seanhalle@261: PRProcess *processSlaveIsIn; seanhalle@261: PRMetaTask *metaTask; seanhalle@261: enum VPtype typeOfVP; //Slave vs Master vs Shutdown.. seanhalle@260: int slaveID; //each slave given a globally unique ID seanhalle@260: int coreAnimatedBy; seanhalle@261: int numTimesAssignedToASlot; //Each assign is for one work-unit, so is an ID seanhalle@260: //note, a scheduling decision is uniquely identified by the triple: seanhalle@261: // -- used in record & replay seanhalle@260: seanhalle@260: //for comm -- between master and coreCtlr & btwn wrapper lib and plugin seanhalle@260: AnimSlot *animSlotAssignedTo; seanhalle@261: PRReqst *request; //wrapper lib puts in requests, plugin takes out seanhalle@260: void *dataRetFromReq;//Return vals from plugin to Wrapper Lib seanhalle@260: seanhalle@261: //For language specific data that needs to be in the slave seanhalle@260: void *semanticData; //Lang saves lang-specific things in slave here seanhalle@260: seanhalle@261: //Task related stuff seanhalle@261: bool needsTaskAssigned; seanhalle@261: seanhalle@260: //=========== MEASUREMENT STUFF ========== seanhalle@260: MEAS__Insert_Meas_Fields_into_Slave; seanhalle@260: float64 createPtInSecs; //time VP created, in seconds seanhalle@260: //======================================== seanhalle@260: }; seanhalle@260: //SlaveVP seanhalle@260: seanhalle@260: seanhalle@260: /* The one and only global variable, holds many odds and ends seanhalle@260: */ seanhalle@260: typedef struct seanhalle@260: { //The offsets of these fields are hard-coded into assembly seanhalle@260: void *coreCtlrReturnPt; //offset to this field used in asm seanhalle@260: int8 falseSharePad1[256 - sizeof(void*)]; seanhalle@260: int32 masterLock; //offset to this field used in asm seanhalle@260: int8 falseSharePad2[256 - sizeof(int32)]; seanhalle@260: //============ below this, no fields are used in asm ============= seanhalle@260: seanhalle@260: //Basic PR infrastructure seanhalle@260: SlaveVP **masterVPs; seanhalle@260: AnimSlot ***allAnimSlots; seanhalle@261: seanhalle@261: PRProcess **processes; seanhalle@260: seanhalle@261: //move to processEnv //Slave creation -- global count of slaves existing, across langs and processes seanhalle@260: int32 numSlavesCreated; //used to give unique ID to processor seanhalle@261: int32 numTasksCreated; //to give unique ID to a task seanhalle@260: seanhalle@260: //Initialization related seanhalle@260: int32 setupComplete; //use while starting up coreCtlr seanhalle@260: seanhalle@260: //Memory management related seanhalle@260: MallocArrays *freeLists; seanhalle@260: int32 amtOfOutstandingMem;//total currently allocated seanhalle@260: seanhalle@260: //Random number seeds -- random nums used in various places seanhalle@260: uint32_t seed1; seanhalle@260: uint32_t seed2; seanhalle@260: seanhalle@261: These_Prob_belong_in_PRPRocess; seanhalle@261: // SlaveVP *slotTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS]; seanhalle@261: // int32 numLiveFreeTaskSlvs; seanhalle@261: // int32 numLiveThreadSlvs; seanhalle@261: // bool32 *coreIsDone; seanhalle@261: // int32 numCoresDone; seanhalle@261: seanhalle@261: // SlaveVP* idleSlv[NUM_CORES][NUM_ANIM_SLOTS]; seanhalle@261: // int shutdownInitiated; seanhalle@261: seanhalle@260: //=========== MEASUREMENT STUFF ============= seanhalle@260: IntervalProbe **intervalProbes; seanhalle@261: PrivDynArrayInfo *dynIntervalProbesInfo; seanhalle@260: HashTable *probeNameHashTbl; seanhalle@260: int32 masterCreateProbeID; seanhalle@260: float64 createPtInSecs; //real-clock time PR initialized seanhalle@260: Histogram **measHists; seanhalle@261: PrivDynArrayInfo *measHistsInfo; seanhalle@260: MEAS__Insert_Susp_Meas_Fields_into_MasterEnv; seanhalle@260: MEAS__Insert_Master_Meas_Fields_into_MasterEnv; seanhalle@260: MEAS__Insert_Master_Lock_Meas_Fields_into_MasterEnv; seanhalle@260: MEAS__Insert_Malloc_Meas_Fields_into_MasterEnv; seanhalle@260: MEAS__Insert_Plugin_Meas_Fields_into_MasterEnv; seanhalle@260: MEAS__Insert_System_Meas_Fields_into_MasterEnv; seanhalle@260: MEAS__Insert_Counter_Meas_Fields_into_MasterEnv; seanhalle@260: //========================================== seanhalle@260: } seanhalle@260: MasterEnv; seanhalle@260: seanhalle@260: //===================== seanhalle@260: typedef struct seanhalle@261: { int32 langMagicNumber; //indexes into hash array of semEnvs in PRProcess seanhalle@261: PRSemEnv *chainedSemEnv; //chains to semEnvs with same hash seanhalle@261: void *langSemEnv; seanhalle@260: seanhalle@261: SlaveAssigner slaveAssigner; seanhalle@261: RequestHandler requestHdlr; seanhalle@261: seanhalle@261: RequestHandler createTaskHdlr; seanhalle@261: RequestHandler endTaskHdlr; seanhalle@261: RequestHandler createSlaveHdlr; seanhalle@261: RequestHandler dissipateSlaveHdlr; seanhalle@261: RequestHandler semDataCreator; seanhalle@261: RequestHandler semDataInitializer; seanhalle@261: seanhalle@261: seanhalle@261: //Track slaves created, separately for each langlet? (in each process) seanhalle@261: // int32 numSlavesCreated; //gives ordering to processor creation seanhalle@261: // int32 numSlavesAlive; //used to detect fail-safe shutdown seanhalle@260: seanhalle@260: //when multi-lang, master polls sem env's to find one with work in it.. seanhalle@260: // in single-lang case, flag ignored, master always asks lang for work seanhalle@261: int32 hasWork; seanhalle@260: } seanhalle@260: PRSemEnv; seanhalle@260: seanhalle@261: //The semantic env of every langlet must start with these two fields, so that seanhalle@261: // PR can cast the void * to this struct, in order to access these two fields seanhalle@260: typedef struct seanhalle@261: { int32 langMagicNumber; seanhalle@261: PRSemEnv *protoSemEnv; seanhalle@261: } seanhalle@261: PRLangSemEnv; seanhalle@261: seanhalle@261: //can cast any langlet's sem env to one of these, so PR can access values seanhalle@261: typedef struct seanhalle@261: { int32 langMagicNumber; seanhalle@261: PRSemEnv *protoSemEnv; seanhalle@261: } seanhalle@261: PRServSemEnv; seanhalle@261: seanhalle@261: enum PRTaskType seanhalle@261: { GenericSlave = 1, seanhalle@261: AtomicTask, seanhalle@261: SuspendedTask seanhalle@261: }; seanhalle@261: seanhalle@261: struct _PRMetaTask seanhalle@260: { seanhalle@261: PRTaskType taskType; seanhalle@266: // RequestHandler reqHandler; //Lang-specific hdlr for create, end, etc seanhalle@261: int32 *taskID; //is standard PR ID seanhalle@261: SlaveVP *slaveAssignedTo; //no valid until task animated seanhalle@261: TopLevelFn topLevelFn; //This is the Fn executes as the task seanhalle@261: void *initData; //The data taken by the function seanhalle@261: void *langMetaTask; seanhalle@261: seanhalle@261: //NOTE: info needed for "wait" functionality is inside lang's metaTask seanhalle@261: }; seanhalle@261: //PRMetaTask seanhalle@261: seanhalle@261: /*The language's meta task is cast to this struct, inside PR, then the seanhalle@261: * back pointer to protoMetaTask is set. Keeps existence of PRMetaTask hidden seanhalle@261: * from plugin -- so can change later. seanhalle@261: */ seanhalle@261: typedef struct seanhalle@261: { int32 langMagicNumber; seanhalle@261: PRMetaTask *protoMetaTask; seanhalle@260: } seanhalle@261: PRLangMetaTask; seanhalle@261: seanhalle@261: typedef struct seanhalle@261: { seanhalle@261: void (*freeFn)(void *); seanhalle@261: } seanhalle@261: PRSemDataTemplate; seanhalle@261: seanhalle@261: typedef struct seanhalle@261: { PRSemDataTemplate **semDatas; seanhalle@261: PRSemDataTemplate **semDatasIter; seanhalle@261: int32 numSemDatas; seanhalle@261: } seanhalle@261: PRSemDataHolder; seanhalle@261: //===================== Top Process level Data Strucs ====================== seanhalle@261: seanhalle@260: /*This structure holds all the information PR needs to manage a program. PR seanhalle@260: * stores information about what percent of CPU time the program is getting, seanhalle@260: * seanhalle@260: */ seanhalle@260: typedef struct seanhalle@261: { seanhalle@261: PRSemEnv semEnvs[NUM_SEM_ENVS_IN_PROCESS]; //used as a hash table seanhalle@261: PRSemEnv semEnvList[NUM_SEM_ENVS_IN_PROCESS]; //lines up the semEnvs, so can iterate through seanhalle@261: int32 numSemEnvs; //must be less than num sem envs.. used to iterate through seanhalle@261: seanhalle@266: int32 numLiveGenericSlvs; seanhalle@266: int32 numLiveFreeTaskSlvs; seanhalle@261: int32 numLiveTasks; seanhalle@266: // bool32 coreIsDone[NUM_CORES][CACHE_LINE_SZ]; //Fixes false sharing seanhalle@266: seanhalle@266: PrivQ *freeTaskSlvRecycleQ; seanhalle@266: SlaveVP slotTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS]; seanhalle@261: void *resultToReturn; seanhalle@260: seanhalle@260: SlaveVP *seedSlv; seanhalle@260: seanhalle@261: //These are used to coord with OS thread waiting for process to end seanhalle@260: bool32 executionIsComplete; seanhalle@261: pthread_mutex_t doneLock; seanhalle@260: pthread_cond_t doneCond; seanhalle@260: } seanhalle@260: PRProcess; seanhalle@260: seanhalle@260: seanhalle@260: //========================= Extra Stuff Data Strucs ======================= seanhalle@260: typedef struct seanhalle@260: { seanhalle@260: seanhalle@260: } seanhalle@260: PRExcp; //exception seanhalle@260: seanhalle@260: //======================= OS Thread related =============================== seanhalle@260: seanhalle@260: void * coreController( void *paramsIn ); //standard PThreads fn prototype seanhalle@260: void * coreCtlr_Seq( void *paramsIn ); //standard PThreads fn prototype seanhalle@260: void animationMaster( void *initData, SlaveVP *masterVP ); seanhalle@260: seanhalle@260: seanhalle@260: typedef struct seanhalle@260: { seanhalle@260: void *endThdPt; seanhalle@260: unsigned int coreNum; seanhalle@260: } seanhalle@260: ThdParams; seanhalle@260: seanhalle@260: //============================= Global Vars ================================ seanhalle@260: seanhalle@261: volatile MasterEnv *_PRTopEnv __align_to_cacheline__; seanhalle@260: seanhalle@260: //these are global, but only used for startup and shutdown seanhalle@260: pthread_t coreCtlrThdHandles[ NUM_CORES ]; //pthread's virt-procr state seanhalle@260: ThdParams *coreCtlrThdParams [ NUM_CORES ]; seanhalle@260: seanhalle@260: pthread_mutex_t suspendLock; seanhalle@260: pthread_cond_t suspendCond; seanhalle@260: seanhalle@260: //========================= Function Prototypes =========================== seanhalle@260: /* MEANING OF WL PI SS int PROS seanhalle@260: * These indicate which places the function is safe to use. They stand for: seanhalle@260: * seanhalle@260: * WL Wrapper Library -- wrapper lib code should only use these seanhalle@260: * PI Plugin -- plugin code should only use these seanhalle@260: * SS Startup and Shutdown -- designates these relate to startup & shutdown seanhalle@260: * int internal to PR -- should not be used in wrapper lib or plugin seanhalle@260: * PROS means "OS functions for applications to use" seanhalle@260: * seanhalle@260: * PR_int__ functions touch internal PR data structs and are only safe seanhalle@260: * to be used inside the master lock. However, occasionally, they appear seanhalle@260: * in wrapper-lib or plugin code. In those cases, very careful analysis seanhalle@260: * has been done to be sure no concurrency issues could arise. seanhalle@260: * seanhalle@260: * PR_WL__ functions are all safe for use outside the master lock. seanhalle@260: * seanhalle@260: * PROS are only safe for applications to use -- they're like a second seanhalle@260: * language mixed in -- but they can't be used inside plugin code, and seanhalle@260: * aren't meant for use in wrapper libraries, because they are themselves seanhalle@260: * wrapper-library calls! seanhalle@260: */ seanhalle@260: //========== Startup and shutdown ========== seanhalle@260: void seanhalle@260: PR__start(); seanhalle@260: seanhalle@260: SlaveVP* seanhalle@260: PR_SS__create_shutdown_slave(); seanhalle@260: seanhalle@260: void seanhalle@260: PR_SS__shutdown(); seanhalle@260: seanhalle@260: void seanhalle@260: PR_SS__cleanup_at_end_of_shutdown(); seanhalle@260: seanhalle@260: void seanhalle@261: PR_SS__register_langlets_semEnv( PRSemEnv *semEnv, SlaveVP *seedVP, int32 VSs_MAGIC_NUMBER ); seanhalle@260: seanhalle@260: seanhalle@260: //============== =============== seanhalle@260: seanhalle@260: inline SlaveVP * seanhalle@260: PR_int__create_slaveVP( TopLevelFnPtr fnPtr, void *dataParam ); seanhalle@260: #define PR_PI__create_slaveVP PR_int__create_slaveVP seanhalle@260: #define PR_WL__create_slaveVP PR_int__create_slaveVP seanhalle@260: seanhalle@261: inline seanhalle@260: SlaveVP * seanhalle@261: PR_int__create_slot_slave(); seanhalle@260: seanhalle@261: inline seanhalle@261: SlaveVP * seanhalle@260: PR_int__create_slaveVP_helper( SlaveVP *newSlv, TopLevelFnPtr fnPtr, seanhalle@260: void *dataParam, void *stackLocs ); seanhalle@260: seanhalle@261: inline seanhalle@261: PRMetaTask * seanhalle@261: PR_int__create_generic_slave_meta_task( void *initData ); seanhalle@261: seanhalle@261: inline seanhalle@261: void seanhalle@260: PR_int__reset_slaveVP_to_TopLvlFn( SlaveVP *slaveVP, TopLevelFnPtr fnPtr, seanhalle@260: void *dataParam); seanhalle@260: seanhalle@261: inline seanhalle@261: void seanhalle@260: PR_int__point_slaveVP_to_OneParamFn( SlaveVP *slaveVP, void *fnPtr, seanhalle@260: void *param); seanhalle@260: seanhalle@261: inline seanhalle@261: void seanhalle@260: PR_int__point_slaveVP_to_TwoParamFn( SlaveVP *slaveVP, void *fnPtr, seanhalle@260: void *param1, void *param2); seanhalle@260: seanhalle@261: inline seanhalle@260: void seanhalle@260: PR_int__dissipate_slaveVP( SlaveVP *slaveToDissipate ); seanhalle@260: #define PR_PI__dissipate_slaveVP PR_int__dissipate_slaveVP seanhalle@260: //WL: dissipate a SlaveVP by sending a request seanhalle@260: seanhalle@261: inline seanhalle@260: void seanhalle@261: PR_int__dissipate_slaveVP_multilang( SlaveVP *slaveToDissipate ); seanhalle@260: seanhalle@261: inline seanhalle@260: void seanhalle@260: PR_int__throw_exception( char *msgStr, SlaveVP *reqstSlv, PRExcp *excpData ); seanhalle@260: #define PR_PI__throw_exception PR_int__throw_exception seanhalle@260: void seanhalle@260: PR_WL__throw_exception( char *msgStr, SlaveVP *reqstSlv, PRExcp *excpData ); seanhalle@260: #define PR_App__throw_exception PR_WL__throw_exception seanhalle@260: seanhalle@261: inline seanhalle@260: void * seanhalle@261: PR_int__give_sem_env_for_slave( SlaveVP *slave, int32 magicNumber ); seanhalle@261: #define PR_PI__give_sem_env_for PR_int__give_sem_env_for_slave seanhalle@261: #define PR_SS__give_sem_env_for_slave PR_int__give_sem_env_for_slave seanhalle@261: //No WL version -- not safe! if use env in WL, be sure data rd & wr is stable seanhalle@261: inline seanhalle@261: PRSemEnv * seanhalle@261: PR_int__give_proto_sem_env_for_slave( SlaveVP *slave, int32 magicNumber ); seanhalle@261: #define PR_PI__give_proto_sem_env_for PR_int__give_proto_sem_env_for_slave seanhalle@261: #define PR_SS__give_proto_sem_env_for_slave PR_int__give_proto_sem_env_for_slave seanhalle@261: //No WL version -- not safe! if use env in WL, be sure data rd & wr is stable seanhalle@261: inline seanhalle@261: void * seanhalle@261: PR_int__give_sem_env_from_process( PRProcess *process, int32 magicNumer ); seanhalle@261: #define PR_PI__give_sem_env_from_process PR_int__give_sem_env_from_process seanhalle@261: #define PR_SS__give_sem_env_from_process PR_int__give_sem_env_from_process seanhalle@261: //#define PR_WL__give_sem_env_from_process PR_int__give_sem_env_from_process seanhalle@261: //No WL version -- not safe! if use env in WL, be sure data rd & wr is stable seanhalle@260: seanhalle@261: inline seanhalle@261: void * seanhalle@261: PR_int__give_sem_data( SlaveVP *slave, int32 magicNumer ); seanhalle@261: #define PR_PI__give_sem_data PR_int__give_sem_data seanhalle@261: #define PR_SS__give_sem_data PR_int__give_sem_data seanhalle@261: #define PR_WL__give_sem_data PR_int__give_sem_data seanhalle@261: seanhalle@261: seanhalle@261: #define PR_int__give_lang_meta_task( slave, magicNumber )\ seanhalle@261: slave->metaTask->langMetaTask; seanhalle@261: #define PR_PI__give_lang_meta_task PR_int__give_lang_meta_task seanhalle@261: #define PR_SS__give_lang_meta_task PR_int__give_lang_meta_task seanhalle@261: #define PR_WL__give_lang_meta_task PR_int__give_lang_meta_task seanhalle@261: seanhalle@261: inline seanhalle@261: SlaveVP * seanhalle@261: PR_PI__give_slave_assigned_to( PRLangMetaTask *langMetaTask ); seanhalle@261: seanhalle@261: void seanhalle@261: idle_fn(void* data, SlaveVP *animatingSlv); seanhalle@260: seanhalle@260: inline void seanhalle@260: PR_int__get_master_lock(); seanhalle@260: seanhalle@261: #define PR_int__release_master_lock() _PRTopEnv->masterLock = UNLOCKED seanhalle@260: seanhalle@260: inline uint32_t seanhalle@260: PR_int__randomNumber(); seanhalle@260: seanhalle@260: //============== Request Related =============== seanhalle@260: seanhalle@260: void seanhalle@261: PR_WL__suspend_slaveVP_and_send_req( SlaveVP *callingSlv ); seanhalle@260: seanhalle@260: inline void seanhalle@260: PR_WL__add_sem_request_in_mallocd_PRReqst( void *semReqData, SlaveVP *callingSlv ); seanhalle@260: seanhalle@260: inline void seanhalle@261: PR_WL__send_sem_request( void *semReq, SlaveVP *callingSlv, int32 magicNum ); seanhalle@260: seanhalle@260: void seanhalle@260: PR_WL__send_create_slaveVP_req( void *semReqData, SlaveVP *reqstingSlv ); seanhalle@260: seanhalle@260: void inline seanhalle@260: PR_WL__send_dissipate_req( SlaveVP *prToDissipate ); seanhalle@260: seanhalle@260: inline void seanhalle@261: PR_WL__send_service_request( void *semReqData, SlaveVP *callingSlv ); seanhalle@260: seanhalle@260: PRReqst * seanhalle@260: PR_PI__take_next_request_out_of( SlaveVP *slaveWithReq ); seanhalle@260: //#define PR_PI__take_next_request_out_of( slave ) slave->requests seanhalle@260: seanhalle@260: //inline void * seanhalle@260: //PR_PI__take_sem_reqst_from( PRReqst *req ); seanhalle@260: #define PR_PI__take_sem_reqst_from( req ) req->semReqData seanhalle@260: seanhalle@260: void inline seanhalle@261: PR_int__handle_PRServiceReq( PRReqst *req, SlaveVP *requestingSlv, void *semEnv, seanhalle@260: ResumeSlvFnPtr resumeSlvFnPtr ); seanhalle@260: seanhalle@260: //======================== MEASUREMENT ====================== seanhalle@260: uint64 seanhalle@260: PR_WL__give_num_plugin_cycles(); seanhalle@260: uint32 seanhalle@260: PR_WL__give_num_plugin_animations(); seanhalle@260: seanhalle@260: seanhalle@260: //========================= Utilities ======================= seanhalle@260: inline char * seanhalle@260: PR_int__strDup( char *str ); seanhalle@260: seanhalle@260: seanhalle@261: //========================= PR request handlers ======================== seanhalle@261: void inline seanhalle@261: handleMakeProbe( PRServReq *semReq, void *semEnv, ResumeSlvFnPtr resumeFn ); seanhalle@261: seanhalle@261: void inline seanhalle@261: handleThrowException( PRServReq *semReq, void *semEnv, ResumeSlvFnPtr resumeFn ); seanhalle@261: //======================================================================= seanhalle@261: seanhalle@260: //========================= Probes ======================= seanhalle@260: #include "Services_Offered_by_PR/Measurement_and_Stats/probes.h" seanhalle@260: seanhalle@260: //================================================ seanhalle@260: #endif /* _PR_H */ seanhalle@260: