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