annotate PR.h @ 266:a5fa1e087c7e

Save checkpoint to come back to -- about to mangle AnimationMaster.c
author Sean Halle <seanhalle@yahoo.com>
date Thu, 25 Oct 2012 23:35:36 -0700
parents dafae55597ce
children 608833ae2c5d
rev   line source
seanhalle@260 1 /*
seanhalle@260 2 * Copyright 2009 OpenSourceStewardshipFoundation.org
seanhalle@260 3 * Licensed under GNU General Public License version 2
seanhalle@260 4 *
seanhalle@260 5 * Author: seanhalle@yahoo.com
seanhalle@260 6 *
seanhalle@260 7 */
seanhalle@260 8
seanhalle@260 9 #ifndef _PR_H
seanhalle@260 10 #define _PR_H
seanhalle@260 11 #define _GNU_SOURCE
seanhalle@260 12
seanhalle@260 13 #include "DynArray/DynArray.h"
seanhalle@260 14 #include "Hash_impl/PrivateHash.h"
seanhalle@260 15 #include "Histogram/Histogram.h"
seanhalle@260 16 #include "Queue_impl/PrivateQueue.h"
seanhalle@260 17
seanhalle@260 18 #include "PR_primitive_data_types.h"
seanhalle@260 19 #include "Services_Offered_by_PR/Memory_Handling/vmalloc.h"
seanhalle@260 20
seanhalle@260 21 #include <pthread.h>
seanhalle@260 22 #include <sys/time.h>
seanhalle@260 23
seanhalle@260 24 //================= Defines: included from separate files =================
seanhalle@260 25 //
seanhalle@260 26 // Note: ALL defines are in other files, none are in here
seanhalle@260 27 //
seanhalle@260 28 #include "Defines/PR_defs.h"
seanhalle@260 29
seanhalle@260 30
seanhalle@260 31 //================================ Typedefs =================================
seanhalle@260 32 //
seanhalle@260 33 typedef unsigned long long TSCount;
seanhalle@260 34
seanhalle@261 35 typedef struct _AnimSlot AnimSlot;
seanhalle@261 36 typedef struct _PRReqst PRReqst;
seanhalle@260 37 typedef struct _SlaveVP SlaveVP;
seanhalle@260 38 typedef struct _MasterVP MasterVP;
seanhalle@260 39 typedef struct _IntervalProbe IntervalProbe;
seanhalle@261 40 typedef struct _PRMetaTask PRMetaTask;
seanhalle@260 41
seanhalle@260 42
seanhalle@260 43 typedef SlaveVP *(*SlaveAssigner) ( void *, AnimSlot*); //semEnv, slot for HW info
seanhalle@260 44 typedef void (*RequestHandler) ( SlaveVP *, void * ); //prWReqst, semEnv
seanhalle@261 45 typedef void (*IndivReqHandler)( SlaveVP *, void * ); //prWReqst, semEnv
seanhalle@260 46 typedef void (*TopLevelFnPtr) ( void *, SlaveVP * ); //initData, animSlv
seanhalle@260 47 typedef void TopLevelFn ( void *, SlaveVP * ); //initData, animSlv
seanhalle@260 48 typedef void (*ResumeSlvFnPtr) ( SlaveVP *, void * );
seanhalle@260 49 //=========== MEASUREMENT STUFF ==========
seanhalle@260 50 MEAS__Insert_Counter_Handler
seanhalle@260 51 //========================================
seanhalle@260 52
seanhalle@260 53 //============================ HW Dependent Fns ================================
seanhalle@260 54
seanhalle@260 55 #include "HW_Dependent_Primitives/PR__HW_measurement.h"
seanhalle@260 56 #include "HW_Dependent_Primitives/PR__primitives.h"
seanhalle@260 57
seanhalle@260 58
seanhalle@260 59 //============= Request Related ===========
seanhalle@260 60 //
seanhalle@260 61
seanhalle@261 62 enum PRReqstType //avoid starting enums at 0, for debug reasons
seanhalle@260 63 {
seanhalle@261 64 TaskCreate = 1,
seanhalle@261 65 TaskEnd,
seanhalle@261 66 SlvCreate,
seanhalle@261 67 SlvDissipate,
seanhalle@261 68 Language,
seanhalle@261 69 Service, //To invoke a PR provided equivalent of a language request (ex: probe)
seanhalle@261 70 Hardware,
seanhalle@261 71 IO,
seanhalle@261 72 OSCall
seanhalle@260 73 };
seanhalle@260 74
seanhalle@260 75 struct _PRReqst
seanhalle@260 76 {
seanhalle@261 77 enum PRReqstType reqType;//used for special forms that have PR behavior
seanhalle@261 78 void *semReq;
seanhalle@261 79 PRProcess *processReqIsIn;
seanhalle@261 80 int32 langMagicNumber;
seanhalle@261 81 PRMetaTask *metaTask;
seanhalle@261 82 TopLevelFn topLevelFn;
seanhalle@261 83 void *initData;
seanhalle@261 84 int32 *ID;
seanhalle@261 85
seanhalle@261 86 //The request handling structure is a bit messy.. for special forms,
seanhalle@261 87 // such as create and dissipate, the language inserts pointer to handler
seanhalle@261 88 // fn directly into the request.. might change to this for all requests
seanhalle@261 89 IndivReqHandler handler; //pointer to handler fn for create, dissip, etc
seanhalle@261 90
seanhalle@260 91 PRReqst *nextReqst;
seanhalle@260 92 };
seanhalle@260 93 //PRReqst
seanhalle@260 94
seanhalle@261 95 enum PRServReqType //These are equivalent to semantic requests, but for
seanhalle@261 96 { // PR's services available directly to app, like OS
seanhalle@260 97 make_probe = 1, // and probe services -- like a PR-wide built-in lang
seanhalle@260 98 throw_excp,
seanhalle@260 99 openFile,
seanhalle@260 100 otherIO
seanhalle@260 101 };
seanhalle@260 102
seanhalle@260 103 typedef struct
seanhalle@261 104 { enum PRServReqType reqType;
seanhalle@260 105 SlaveVP *requestingSlv;
seanhalle@260 106 char *nameStr; //for create probe
seanhalle@260 107 char *msgStr; //for exception
seanhalle@260 108 void *exceptionData;
seanhalle@260 109 }
seanhalle@261 110 PRServReq;
seanhalle@260 111
seanhalle@260 112
seanhalle@260 113 //==================== Core data structures ===================
seanhalle@260 114
seanhalle@260 115 typedef struct
seanhalle@260 116 {
seanhalle@260 117 //for future expansion
seanhalle@260 118 }
seanhalle@260 119 SlotPerfInfo;
seanhalle@260 120
seanhalle@260 121 struct _AnimSlot
seanhalle@260 122 {
seanhalle@260 123 int workIsDone;
seanhalle@260 124 int needsSlaveAssigned;
seanhalle@260 125 SlaveVP *slaveAssignedToSlot;
seanhalle@260 126
seanhalle@260 127 int slotIdx; //needed by Holistic Model's data gathering
seanhalle@260 128 int coreSlotIsOn;
seanhalle@260 129 SlotPerfInfo *perfInfo; //used by assigner to pick best slave for core
seanhalle@260 130 };
seanhalle@260 131 //AnimSlot
seanhalle@260 132
seanhalle@260 133 enum VPtype
seanhalle@266 134 { SlotTaskSlv = 1,//Slave tied to an anim slot, only animates tasks
seanhalle@266 135 FreeTaskSlv, //When a suspended task ends, the slave becomes this
seanhalle@261 136 GenericSlv, //the VP is explicitly seen in the app code, or task suspends
seanhalle@260 137 Master,
seanhalle@260 138 Shutdown,
seanhalle@260 139 Idle
seanhalle@260 140 };
seanhalle@260 141
seanhalle@260 142 /*This structure embodies the state of a slaveVP. It is reused for masterVP
seanhalle@260 143 * and shutdownVPs.
seanhalle@260 144 */
seanhalle@260 145 struct _SlaveVP
seanhalle@260 146 { //The offsets of these fields are hard-coded into assembly
seanhalle@260 147 void *stackPtr; //save the core's stack ptr when suspend
seanhalle@260 148 void *framePtr; //save core's frame ptr when suspend
seanhalle@260 149 void *resumeInstrPtr; //save core's program-counter when suspend
seanhalle@260 150 void *coreCtlrFramePtr; //restore before jmp back to core controller
seanhalle@260 151 void *coreCtlrStackPtr; //restore before jmp back to core controller
seanhalle@260 152
seanhalle@260 153 //============ below this, no fields are used in asm =============
seanhalle@260 154
seanhalle@261 155 void *startOfStack; //used to free, and to point slave to Fn
seanhalle@261 156 PRProcess *processSlaveIsIn;
seanhalle@261 157 PRMetaTask *metaTask;
seanhalle@261 158 enum VPtype typeOfVP; //Slave vs Master vs Shutdown..
seanhalle@260 159 int slaveID; //each slave given a globally unique ID
seanhalle@260 160 int coreAnimatedBy;
seanhalle@261 161 int numTimesAssignedToASlot; //Each assign is for one work-unit, so is an ID
seanhalle@260 162 //note, a scheduling decision is uniquely identified by the triple:
seanhalle@261 163 // <slaveID, coreAnimatedBy, numTimesAssignedToASlot> -- used in record & replay
seanhalle@260 164
seanhalle@260 165 //for comm -- between master and coreCtlr & btwn wrapper lib and plugin
seanhalle@260 166 AnimSlot *animSlotAssignedTo;
seanhalle@261 167 PRReqst *request; //wrapper lib puts in requests, plugin takes out
seanhalle@260 168 void *dataRetFromReq;//Return vals from plugin to Wrapper Lib
seanhalle@260 169
seanhalle@261 170 //For language specific data that needs to be in the slave
seanhalle@260 171 void *semanticData; //Lang saves lang-specific things in slave here
seanhalle@260 172
seanhalle@261 173 //Task related stuff
seanhalle@261 174 bool needsTaskAssigned;
seanhalle@261 175
seanhalle@260 176 //=========== MEASUREMENT STUFF ==========
seanhalle@260 177 MEAS__Insert_Meas_Fields_into_Slave;
seanhalle@260 178 float64 createPtInSecs; //time VP created, in seconds
seanhalle@260 179 //========================================
seanhalle@260 180 };
seanhalle@260 181 //SlaveVP
seanhalle@260 182
seanhalle@260 183
seanhalle@260 184 /* The one and only global variable, holds many odds and ends
seanhalle@260 185 */
seanhalle@260 186 typedef struct
seanhalle@260 187 { //The offsets of these fields are hard-coded into assembly
seanhalle@260 188 void *coreCtlrReturnPt; //offset to this field used in asm
seanhalle@260 189 int8 falseSharePad1[256 - sizeof(void*)];
seanhalle@260 190 int32 masterLock; //offset to this field used in asm
seanhalle@260 191 int8 falseSharePad2[256 - sizeof(int32)];
seanhalle@260 192 //============ below this, no fields are used in asm =============
seanhalle@260 193
seanhalle@260 194 //Basic PR infrastructure
seanhalle@260 195 SlaveVP **masterVPs;
seanhalle@260 196 AnimSlot ***allAnimSlots;
seanhalle@261 197
seanhalle@261 198 PRProcess **processes;
seanhalle@260 199
seanhalle@261 200 //move to processEnv //Slave creation -- global count of slaves existing, across langs and processes
seanhalle@260 201 int32 numSlavesCreated; //used to give unique ID to processor
seanhalle@261 202 int32 numTasksCreated; //to give unique ID to a task
seanhalle@260 203
seanhalle@260 204 //Initialization related
seanhalle@260 205 int32 setupComplete; //use while starting up coreCtlr
seanhalle@260 206
seanhalle@260 207 //Memory management related
seanhalle@260 208 MallocArrays *freeLists;
seanhalle@260 209 int32 amtOfOutstandingMem;//total currently allocated
seanhalle@260 210
seanhalle@260 211 //Random number seeds -- random nums used in various places
seanhalle@260 212 uint32_t seed1;
seanhalle@260 213 uint32_t seed2;
seanhalle@260 214
seanhalle@261 215 These_Prob_belong_in_PRPRocess;
seanhalle@261 216 // SlaveVP *slotTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS];
seanhalle@261 217 // int32 numLiveFreeTaskSlvs;
seanhalle@261 218 // int32 numLiveThreadSlvs;
seanhalle@261 219 // bool32 *coreIsDone;
seanhalle@261 220 // int32 numCoresDone;
seanhalle@261 221
seanhalle@261 222 // SlaveVP* idleSlv[NUM_CORES][NUM_ANIM_SLOTS];
seanhalle@261 223 // int shutdownInitiated;
seanhalle@261 224
seanhalle@260 225 //=========== MEASUREMENT STUFF =============
seanhalle@260 226 IntervalProbe **intervalProbes;
seanhalle@261 227 PrivDynArrayInfo *dynIntervalProbesInfo;
seanhalle@260 228 HashTable *probeNameHashTbl;
seanhalle@260 229 int32 masterCreateProbeID;
seanhalle@260 230 float64 createPtInSecs; //real-clock time PR initialized
seanhalle@260 231 Histogram **measHists;
seanhalle@261 232 PrivDynArrayInfo *measHistsInfo;
seanhalle@260 233 MEAS__Insert_Susp_Meas_Fields_into_MasterEnv;
seanhalle@260 234 MEAS__Insert_Master_Meas_Fields_into_MasterEnv;
seanhalle@260 235 MEAS__Insert_Master_Lock_Meas_Fields_into_MasterEnv;
seanhalle@260 236 MEAS__Insert_Malloc_Meas_Fields_into_MasterEnv;
seanhalle@260 237 MEAS__Insert_Plugin_Meas_Fields_into_MasterEnv;
seanhalle@260 238 MEAS__Insert_System_Meas_Fields_into_MasterEnv;
seanhalle@260 239 MEAS__Insert_Counter_Meas_Fields_into_MasterEnv;
seanhalle@260 240 //==========================================
seanhalle@260 241 }
seanhalle@260 242 MasterEnv;
seanhalle@260 243
seanhalle@260 244 //=====================
seanhalle@260 245 typedef struct
seanhalle@261 246 { int32 langMagicNumber; //indexes into hash array of semEnvs in PRProcess
seanhalle@261 247 PRSemEnv *chainedSemEnv; //chains to semEnvs with same hash
seanhalle@261 248 void *langSemEnv;
seanhalle@260 249
seanhalle@261 250 SlaveAssigner slaveAssigner;
seanhalle@261 251 RequestHandler requestHdlr;
seanhalle@261 252
seanhalle@261 253 RequestHandler createTaskHdlr;
seanhalle@261 254 RequestHandler endTaskHdlr;
seanhalle@261 255 RequestHandler createSlaveHdlr;
seanhalle@261 256 RequestHandler dissipateSlaveHdlr;
seanhalle@261 257 RequestHandler semDataCreator;
seanhalle@261 258 RequestHandler semDataInitializer;
seanhalle@261 259
seanhalle@261 260
seanhalle@261 261 //Track slaves created, separately for each langlet? (in each process)
seanhalle@261 262 // int32 numSlavesCreated; //gives ordering to processor creation
seanhalle@261 263 // int32 numSlavesAlive; //used to detect fail-safe shutdown
seanhalle@260 264
seanhalle@260 265 //when multi-lang, master polls sem env's to find one with work in it..
seanhalle@260 266 // in single-lang case, flag ignored, master always asks lang for work
seanhalle@261 267 int32 hasWork;
seanhalle@260 268 }
seanhalle@260 269 PRSemEnv;
seanhalle@260 270
seanhalle@261 271 //The semantic env of every langlet must start with these two fields, so that
seanhalle@261 272 // PR can cast the void * to this struct, in order to access these two fields
seanhalle@260 273 typedef struct
seanhalle@261 274 { int32 langMagicNumber;
seanhalle@261 275 PRSemEnv *protoSemEnv;
seanhalle@261 276 }
seanhalle@261 277 PRLangSemEnv;
seanhalle@261 278
seanhalle@261 279 //can cast any langlet's sem env to one of these, so PR can access values
seanhalle@261 280 typedef struct
seanhalle@261 281 { int32 langMagicNumber;
seanhalle@261 282 PRSemEnv *protoSemEnv;
seanhalle@261 283 }
seanhalle@261 284 PRServSemEnv;
seanhalle@261 285
seanhalle@261 286 enum PRTaskType
seanhalle@261 287 { GenericSlave = 1,
seanhalle@261 288 AtomicTask,
seanhalle@261 289 SuspendedTask
seanhalle@261 290 };
seanhalle@261 291
seanhalle@261 292 struct _PRMetaTask
seanhalle@260 293 {
seanhalle@261 294 PRTaskType taskType;
seanhalle@266 295 // RequestHandler reqHandler; //Lang-specific hdlr for create, end, etc
seanhalle@261 296 int32 *taskID; //is standard PR ID
seanhalle@261 297 SlaveVP *slaveAssignedTo; //no valid until task animated
seanhalle@261 298 TopLevelFn topLevelFn; //This is the Fn executes as the task
seanhalle@261 299 void *initData; //The data taken by the function
seanhalle@261 300 void *langMetaTask;
seanhalle@261 301
seanhalle@261 302 //NOTE: info needed for "wait" functionality is inside lang's metaTask
seanhalle@261 303 };
seanhalle@261 304 //PRMetaTask
seanhalle@261 305
seanhalle@261 306 /*The language's meta task is cast to this struct, inside PR, then the
seanhalle@261 307 * back pointer to protoMetaTask is set. Keeps existence of PRMetaTask hidden
seanhalle@261 308 * from plugin -- so can change later.
seanhalle@261 309 */
seanhalle@261 310 typedef struct
seanhalle@261 311 { int32 langMagicNumber;
seanhalle@261 312 PRMetaTask *protoMetaTask;
seanhalle@260 313 }
seanhalle@261 314 PRLangMetaTask;
seanhalle@261 315
seanhalle@261 316 typedef struct
seanhalle@261 317 {
seanhalle@261 318 void (*freeFn)(void *);
seanhalle@261 319 }
seanhalle@261 320 PRSemDataTemplate;
seanhalle@261 321
seanhalle@261 322 typedef struct
seanhalle@261 323 { PRSemDataTemplate **semDatas;
seanhalle@261 324 PRSemDataTemplate **semDatasIter;
seanhalle@261 325 int32 numSemDatas;
seanhalle@261 326 }
seanhalle@261 327 PRSemDataHolder;
seanhalle@261 328 //===================== Top Process level Data Strucs ======================
seanhalle@261 329
seanhalle@260 330 /*This structure holds all the information PR needs to manage a program. PR
seanhalle@260 331 * stores information about what percent of CPU time the program is getting,
seanhalle@260 332 *
seanhalle@260 333 */
seanhalle@260 334 typedef struct
seanhalle@261 335 {
seanhalle@261 336 PRSemEnv semEnvs[NUM_SEM_ENVS_IN_PROCESS]; //used as a hash table
seanhalle@261 337 PRSemEnv semEnvList[NUM_SEM_ENVS_IN_PROCESS]; //lines up the semEnvs, so can iterate through
seanhalle@261 338 int32 numSemEnvs; //must be less than num sem envs.. used to iterate through
seanhalle@261 339
seanhalle@266 340 int32 numLiveGenericSlvs;
seanhalle@266 341 int32 numLiveFreeTaskSlvs;
seanhalle@261 342 int32 numLiveTasks;
seanhalle@266 343 // bool32 coreIsDone[NUM_CORES][CACHE_LINE_SZ]; //Fixes false sharing
seanhalle@266 344
seanhalle@266 345 PrivQ *freeTaskSlvRecycleQ;
seanhalle@266 346 SlaveVP slotTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS];
seanhalle@261 347 void *resultToReturn;
seanhalle@260 348
seanhalle@260 349 SlaveVP *seedSlv;
seanhalle@260 350
seanhalle@261 351 //These are used to coord with OS thread waiting for process to end
seanhalle@260 352 bool32 executionIsComplete;
seanhalle@261 353 pthread_mutex_t doneLock;
seanhalle@260 354 pthread_cond_t doneCond;
seanhalle@260 355 }
seanhalle@260 356 PRProcess;
seanhalle@260 357
seanhalle@260 358
seanhalle@260 359 //========================= Extra Stuff Data Strucs =======================
seanhalle@260 360 typedef struct
seanhalle@260 361 {
seanhalle@260 362
seanhalle@260 363 }
seanhalle@260 364 PRExcp; //exception
seanhalle@260 365
seanhalle@260 366 //======================= OS Thread related ===============================
seanhalle@260 367
seanhalle@260 368 void * coreController( void *paramsIn ); //standard PThreads fn prototype
seanhalle@260 369 void * coreCtlr_Seq( void *paramsIn ); //standard PThreads fn prototype
seanhalle@260 370 void animationMaster( void *initData, SlaveVP *masterVP );
seanhalle@260 371
seanhalle@260 372
seanhalle@260 373 typedef struct
seanhalle@260 374 {
seanhalle@260 375 void *endThdPt;
seanhalle@260 376 unsigned int coreNum;
seanhalle@260 377 }
seanhalle@260 378 ThdParams;
seanhalle@260 379
seanhalle@260 380 //============================= Global Vars ================================
seanhalle@260 381
seanhalle@261 382 volatile MasterEnv *_PRTopEnv __align_to_cacheline__;
seanhalle@260 383
seanhalle@260 384 //these are global, but only used for startup and shutdown
seanhalle@260 385 pthread_t coreCtlrThdHandles[ NUM_CORES ]; //pthread's virt-procr state
seanhalle@260 386 ThdParams *coreCtlrThdParams [ NUM_CORES ];
seanhalle@260 387
seanhalle@260 388 pthread_mutex_t suspendLock;
seanhalle@260 389 pthread_cond_t suspendCond;
seanhalle@260 390
seanhalle@260 391 //========================= Function Prototypes ===========================
seanhalle@260 392 /* MEANING OF WL PI SS int PROS
seanhalle@260 393 * These indicate which places the function is safe to use. They stand for:
seanhalle@260 394 *
seanhalle@260 395 * WL Wrapper Library -- wrapper lib code should only use these
seanhalle@260 396 * PI Plugin -- plugin code should only use these
seanhalle@260 397 * SS Startup and Shutdown -- designates these relate to startup & shutdown
seanhalle@260 398 * int internal to PR -- should not be used in wrapper lib or plugin
seanhalle@260 399 * PROS means "OS functions for applications to use"
seanhalle@260 400 *
seanhalle@260 401 * PR_int__ functions touch internal PR data structs and are only safe
seanhalle@260 402 * to be used inside the master lock. However, occasionally, they appear
seanhalle@260 403 * in wrapper-lib or plugin code. In those cases, very careful analysis
seanhalle@260 404 * has been done to be sure no concurrency issues could arise.
seanhalle@260 405 *
seanhalle@260 406 * PR_WL__ functions are all safe for use outside the master lock.
seanhalle@260 407 *
seanhalle@260 408 * PROS are only safe for applications to use -- they're like a second
seanhalle@260 409 * language mixed in -- but they can't be used inside plugin code, and
seanhalle@260 410 * aren't meant for use in wrapper libraries, because they are themselves
seanhalle@260 411 * wrapper-library calls!
seanhalle@260 412 */
seanhalle@260 413 //========== Startup and shutdown ==========
seanhalle@260 414 void
seanhalle@260 415 PR__start();
seanhalle@260 416
seanhalle@260 417 SlaveVP*
seanhalle@260 418 PR_SS__create_shutdown_slave();
seanhalle@260 419
seanhalle@260 420 void
seanhalle@260 421 PR_SS__shutdown();
seanhalle@260 422
seanhalle@260 423 void
seanhalle@260 424 PR_SS__cleanup_at_end_of_shutdown();
seanhalle@260 425
seanhalle@260 426 void
seanhalle@261 427 PR_SS__register_langlets_semEnv( PRSemEnv *semEnv, SlaveVP *seedVP, int32 VSs_MAGIC_NUMBER );
seanhalle@260 428
seanhalle@260 429
seanhalle@260 430 //============== ===============
seanhalle@260 431
seanhalle@260 432 inline SlaveVP *
seanhalle@260 433 PR_int__create_slaveVP( TopLevelFnPtr fnPtr, void *dataParam );
seanhalle@260 434 #define PR_PI__create_slaveVP PR_int__create_slaveVP
seanhalle@260 435 #define PR_WL__create_slaveVP PR_int__create_slaveVP
seanhalle@260 436
seanhalle@261 437 inline
seanhalle@260 438 SlaveVP *
seanhalle@261 439 PR_int__create_slot_slave();
seanhalle@260 440
seanhalle@261 441 inline
seanhalle@261 442 SlaveVP *
seanhalle@260 443 PR_int__create_slaveVP_helper( SlaveVP *newSlv, TopLevelFnPtr fnPtr,
seanhalle@260 444 void *dataParam, void *stackLocs );
seanhalle@260 445
seanhalle@261 446 inline
seanhalle@261 447 PRMetaTask *
seanhalle@261 448 PR_int__create_generic_slave_meta_task( void *initData );
seanhalle@261 449
seanhalle@261 450 inline
seanhalle@261 451 void
seanhalle@260 452 PR_int__reset_slaveVP_to_TopLvlFn( SlaveVP *slaveVP, TopLevelFnPtr fnPtr,
seanhalle@260 453 void *dataParam);
seanhalle@260 454
seanhalle@261 455 inline
seanhalle@261 456 void
seanhalle@260 457 PR_int__point_slaveVP_to_OneParamFn( SlaveVP *slaveVP, void *fnPtr,
seanhalle@260 458 void *param);
seanhalle@260 459
seanhalle@261 460 inline
seanhalle@261 461 void
seanhalle@260 462 PR_int__point_slaveVP_to_TwoParamFn( SlaveVP *slaveVP, void *fnPtr,
seanhalle@260 463 void *param1, void *param2);
seanhalle@260 464
seanhalle@261 465 inline
seanhalle@260 466 void
seanhalle@260 467 PR_int__dissipate_slaveVP( SlaveVP *slaveToDissipate );
seanhalle@260 468 #define PR_PI__dissipate_slaveVP PR_int__dissipate_slaveVP
seanhalle@260 469 //WL: dissipate a SlaveVP by sending a request
seanhalle@260 470
seanhalle@261 471 inline
seanhalle@260 472 void
seanhalle@261 473 PR_int__dissipate_slaveVP_multilang( SlaveVP *slaveToDissipate );
seanhalle@260 474
seanhalle@261 475 inline
seanhalle@260 476 void
seanhalle@260 477 PR_int__throw_exception( char *msgStr, SlaveVP *reqstSlv, PRExcp *excpData );
seanhalle@260 478 #define PR_PI__throw_exception PR_int__throw_exception
seanhalle@260 479 void
seanhalle@260 480 PR_WL__throw_exception( char *msgStr, SlaveVP *reqstSlv, PRExcp *excpData );
seanhalle@260 481 #define PR_App__throw_exception PR_WL__throw_exception
seanhalle@260 482
seanhalle@261 483 inline
seanhalle@260 484 void *
seanhalle@261 485 PR_int__give_sem_env_for_slave( SlaveVP *slave, int32 magicNumber );
seanhalle@261 486 #define PR_PI__give_sem_env_for PR_int__give_sem_env_for_slave
seanhalle@261 487 #define PR_SS__give_sem_env_for_slave PR_int__give_sem_env_for_slave
seanhalle@261 488 //No WL version -- not safe! if use env in WL, be sure data rd & wr is stable
seanhalle@261 489 inline
seanhalle@261 490 PRSemEnv *
seanhalle@261 491 PR_int__give_proto_sem_env_for_slave( SlaveVP *slave, int32 magicNumber );
seanhalle@261 492 #define PR_PI__give_proto_sem_env_for PR_int__give_proto_sem_env_for_slave
seanhalle@261 493 #define PR_SS__give_proto_sem_env_for_slave PR_int__give_proto_sem_env_for_slave
seanhalle@261 494 //No WL version -- not safe! if use env in WL, be sure data rd & wr is stable
seanhalle@261 495 inline
seanhalle@261 496 void *
seanhalle@261 497 PR_int__give_sem_env_from_process( PRProcess *process, int32 magicNumer );
seanhalle@261 498 #define PR_PI__give_sem_env_from_process PR_int__give_sem_env_from_process
seanhalle@261 499 #define PR_SS__give_sem_env_from_process PR_int__give_sem_env_from_process
seanhalle@261 500 //#define PR_WL__give_sem_env_from_process PR_int__give_sem_env_from_process
seanhalle@261 501 //No WL version -- not safe! if use env in WL, be sure data rd & wr is stable
seanhalle@260 502
seanhalle@261 503 inline
seanhalle@261 504 void *
seanhalle@261 505 PR_int__give_sem_data( SlaveVP *slave, int32 magicNumer );
seanhalle@261 506 #define PR_PI__give_sem_data PR_int__give_sem_data
seanhalle@261 507 #define PR_SS__give_sem_data PR_int__give_sem_data
seanhalle@261 508 #define PR_WL__give_sem_data PR_int__give_sem_data
seanhalle@261 509
seanhalle@261 510
seanhalle@261 511 #define PR_int__give_lang_meta_task( slave, magicNumber )\
seanhalle@261 512 slave->metaTask->langMetaTask;
seanhalle@261 513 #define PR_PI__give_lang_meta_task PR_int__give_lang_meta_task
seanhalle@261 514 #define PR_SS__give_lang_meta_task PR_int__give_lang_meta_task
seanhalle@261 515 #define PR_WL__give_lang_meta_task PR_int__give_lang_meta_task
seanhalle@261 516
seanhalle@261 517 inline
seanhalle@261 518 SlaveVP *
seanhalle@261 519 PR_PI__give_slave_assigned_to( PRLangMetaTask *langMetaTask );
seanhalle@261 520
seanhalle@261 521 void
seanhalle@261 522 idle_fn(void* data, SlaveVP *animatingSlv);
seanhalle@260 523
seanhalle@260 524 inline void
seanhalle@260 525 PR_int__get_master_lock();
seanhalle@260 526
seanhalle@261 527 #define PR_int__release_master_lock() _PRTopEnv->masterLock = UNLOCKED
seanhalle@260 528
seanhalle@260 529 inline uint32_t
seanhalle@260 530 PR_int__randomNumber();
seanhalle@260 531
seanhalle@260 532 //============== Request Related ===============
seanhalle@260 533
seanhalle@260 534 void
seanhalle@261 535 PR_WL__suspend_slaveVP_and_send_req( SlaveVP *callingSlv );
seanhalle@260 536
seanhalle@260 537 inline void
seanhalle@260 538 PR_WL__add_sem_request_in_mallocd_PRReqst( void *semReqData, SlaveVP *callingSlv );
seanhalle@260 539
seanhalle@260 540 inline void
seanhalle@261 541 PR_WL__send_sem_request( void *semReq, SlaveVP *callingSlv, int32 magicNum );
seanhalle@260 542
seanhalle@260 543 void
seanhalle@260 544 PR_WL__send_create_slaveVP_req( void *semReqData, SlaveVP *reqstingSlv );
seanhalle@260 545
seanhalle@260 546 void inline
seanhalle@260 547 PR_WL__send_dissipate_req( SlaveVP *prToDissipate );
seanhalle@260 548
seanhalle@260 549 inline void
seanhalle@261 550 PR_WL__send_service_request( void *semReqData, SlaveVP *callingSlv );
seanhalle@260 551
seanhalle@260 552 PRReqst *
seanhalle@260 553 PR_PI__take_next_request_out_of( SlaveVP *slaveWithReq );
seanhalle@260 554 //#define PR_PI__take_next_request_out_of( slave ) slave->requests
seanhalle@260 555
seanhalle@260 556 //inline void *
seanhalle@260 557 //PR_PI__take_sem_reqst_from( PRReqst *req );
seanhalle@260 558 #define PR_PI__take_sem_reqst_from( req ) req->semReqData
seanhalle@260 559
seanhalle@260 560 void inline
seanhalle@261 561 PR_int__handle_PRServiceReq( PRReqst *req, SlaveVP *requestingSlv, void *semEnv,
seanhalle@260 562 ResumeSlvFnPtr resumeSlvFnPtr );
seanhalle@260 563
seanhalle@260 564 //======================== MEASUREMENT ======================
seanhalle@260 565 uint64
seanhalle@260 566 PR_WL__give_num_plugin_cycles();
seanhalle@260 567 uint32
seanhalle@260 568 PR_WL__give_num_plugin_animations();
seanhalle@260 569
seanhalle@260 570
seanhalle@260 571 //========================= Utilities =======================
seanhalle@260 572 inline char *
seanhalle@260 573 PR_int__strDup( char *str );
seanhalle@260 574
seanhalle@260 575
seanhalle@261 576 //========================= PR request handlers ========================
seanhalle@261 577 void inline
seanhalle@261 578 handleMakeProbe( PRServReq *semReq, void *semEnv, ResumeSlvFnPtr resumeFn );
seanhalle@261 579
seanhalle@261 580 void inline
seanhalle@261 581 handleThrowException( PRServReq *semReq, void *semEnv, ResumeSlvFnPtr resumeFn );
seanhalle@261 582 //=======================================================================
seanhalle@261 583
seanhalle@260 584 //========================= Probes =======================
seanhalle@260 585 #include "Services_Offered_by_PR/Measurement_and_Stats/probes.h"
seanhalle@260 586
seanhalle@260 587 //================================================
seanhalle@260 588 #endif /* _PR_H */
seanhalle@260 589