annotate PR.h @ 267:608833ae2c5d

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