| 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
|