| rev |
line source |
|
seanhalle@208
|
1 /*
|
|
seanhalle@208
|
2 * Copyright 2009 OpenSourceStewardshipFoundation.org
|
|
seanhalle@208
|
3 * Licensed under GNU General Public License version 2
|
|
seanhalle@208
|
4 *
|
|
seanhalle@208
|
5 * Author: seanhalle@yahoo.com
|
|
seanhalle@208
|
6 *
|
|
seanhalle@208
|
7 */
|
|
seanhalle@208
|
8
|
|
seanhalle@208
|
9 #ifndef _VMS_H
|
|
seanhalle@208
|
10 #define _VMS_H
|
|
seanhalle@208
|
11 #define _GNU_SOURCE
|
|
seanhalle@208
|
12
|
|
seanhalle@208
|
13 #include "VMS_primitive_data_types.h"
|
|
seanhalle@215
|
14 #include "DynArray/DynArray.h"
|
|
seanhalle@215
|
15 #include "Hash_impl/PrivateHash.h"
|
|
seanhalle@215
|
16 #include "Histogram/Histogram.h"
|
|
seanhalle@215
|
17 #include "Queue_impl/PrivateQueue.h"
|
|
seanhalle@223
|
18 #include "Services_Offered_by_VMS/Memory_Handling/vmalloc.h"
|
|
seanhalle@208
|
19
|
|
seanhalle@208
|
20 #include <pthread.h>
|
|
seanhalle@208
|
21 #include <sys/time.h>
|
|
seanhalle@208
|
22
|
|
seanhalle@208
|
23 //================= Defines: included from separate files =================
|
|
seanhalle@208
|
24 //
|
|
seanhalle@208
|
25 // Note: ALL defines are in other files, none are in here
|
|
seanhalle@208
|
26 //
|
|
seanhalle@223
|
27 #include "Defines/VMS_defs.h"
|
|
seanhalle@208
|
28
|
|
seanhalle@208
|
29
|
|
seanhalle@208
|
30 //================================ Typedefs =================================
|
|
seanhalle@208
|
31 //
|
|
seanhalle@208
|
32 typedef unsigned long long TSCount;
|
|
seanhalle@208
|
33 typedef union
|
|
seanhalle@208
|
34 { uint32 lowHigh[2];
|
|
seanhalle@208
|
35 uint64 longVal;
|
|
seanhalle@208
|
36 }
|
|
seanhalle@208
|
37 TSCountLowHigh;
|
|
seanhalle@208
|
38
|
|
seanhalle@208
|
39 typedef struct _SchedSlot SchedSlot;
|
|
seanhalle@208
|
40 typedef struct _VMSReqst VMSReqst;
|
|
seanhalle@208
|
41 typedef struct _SlaveVP SlaveVP;
|
|
seanhalle@208
|
42 typedef struct _MasterVP MasterVP;
|
|
seanhalle@208
|
43 typedef struct _IntervalProbe IntervalProbe;
|
|
seanhalle@208
|
44 typedef struct _GateStruc GateStruc;
|
|
seanhalle@208
|
45
|
|
seanhalle@208
|
46
|
|
seanhalle@230
|
47 typedef SlaveVP *(*SlaveAssigner) ( void *, SchedSlot*); //semEnv, slot for HW info
|
|
seanhalle@223
|
48 typedef void (*RequestHandler) ( SlaveVP *, void * ); //prWReqst, semEnv
|
|
seanhalle@223
|
49 typedef void (*TopLevelFnPtr) ( void *, SlaveVP * ); //initData, animSlv
|
|
seanhalle@223
|
50 typedef void TopLevelFn ( void *, SlaveVP * ); //initData, animSlv
|
|
seanhalle@223
|
51 typedef void (*ResumeSlvFnPtr) ( SlaveVP *, void * );
|
|
seanhalle@209
|
52
|
|
seanhalle@209
|
53 //============================ HW Dependent Fns ================================
|
|
seanhalle@209
|
54
|
|
seanhalle@216
|
55 #include "Hardware_Dependent/VMS__HW_measurement.h"
|
|
seanhalle@216
|
56 #include "Hardware_Dependent/VMS__primitives.h"
|
|
seanhalle@208
|
57
|
|
seanhalle@208
|
58 //============================= Statistics ==================================
|
|
seanhalle@208
|
59
|
|
seanhalle@208
|
60 inline TSCount getTSCount();
|
|
seanhalle@208
|
61
|
|
seanhalle@208
|
62 //============= Request Related ===========
|
|
seanhalle@208
|
63 //
|
|
seanhalle@208
|
64
|
|
seanhalle@208
|
65 enum VMSReqstType //avoid starting enums at 0, for debug reasons
|
|
seanhalle@208
|
66 {
|
|
seanhalle@208
|
67 semantic = 1,
|
|
seanhalle@208
|
68 createReq,
|
|
seanhalle@208
|
69 dissipate,
|
|
seanhalle@208
|
70 VMSSemantic //goes with VMSSemReqst below
|
|
seanhalle@208
|
71 };
|
|
seanhalle@208
|
72
|
|
seanhalle@208
|
73 struct _VMSReqst
|
|
seanhalle@208
|
74 {
|
|
seanhalle@208
|
75 enum VMSReqstType reqType;//used for dissipate and in future for IO requests
|
|
seanhalle@208
|
76 void *semReqData;
|
|
seanhalle@208
|
77
|
|
seanhalle@208
|
78 VMSReqst *nextReqst;
|
|
seanhalle@208
|
79 };
|
|
seanhalle@208
|
80 //VMSReqst
|
|
seanhalle@208
|
81
|
|
seanhalle@208
|
82 enum VMSSemReqstType //These are equivalent to semantic requests, but for
|
|
seanhalle@208
|
83 { // VMS's services available directly to app, like OS
|
|
seanhalle@208
|
84 createProbe = 1, // and probe services -- like a VMS-wide built-in lang
|
|
seanhalle@208
|
85 openFile,
|
|
seanhalle@208
|
86 otherIO
|
|
seanhalle@208
|
87 };
|
|
seanhalle@208
|
88
|
|
seanhalle@208
|
89 typedef struct
|
|
seanhalle@208
|
90 { enum VMSSemReqstType reqType;
|
|
seanhalle@209
|
91 SlaveVP *requestingSlv;
|
|
seanhalle@208
|
92 char *nameStr; //for create probe
|
|
seanhalle@208
|
93 }
|
|
seanhalle@208
|
94 VMSSemReq;
|
|
seanhalle@208
|
95
|
|
seanhalle@208
|
96
|
|
seanhalle@208
|
97 //==================== Core data structures ===================
|
|
seanhalle@208
|
98
|
|
seanhalle@208
|
99 struct _SchedSlot
|
|
seanhalle@208
|
100 {
|
|
seanhalle@230
|
101 int workIsDone;
|
|
seanhalle@230
|
102 int needsSlaveAssigned;
|
|
seanhalle@230
|
103 SlaveVP *slaveAssignedToSlot;
|
|
seanhalle@230
|
104
|
|
seanhalle@230
|
105 int slotIdx; //needed by Holistic Model's data gathering
|
|
seanhalle@230
|
106 int coreOfSlot;
|
|
seanhalle@230
|
107 SlotPerfInfo *perfInfo; //used by assigner to pick best slave for core
|
|
seanhalle@208
|
108 };
|
|
seanhalle@208
|
109 //SchedSlot
|
|
seanhalle@208
|
110
|
|
seanhalle@209
|
111 /*WARNING: re-arranging this data structure could cause Slv switching
|
|
seanhalle@208
|
112 * assembly code to fail -- hard-codes offsets of fields
|
|
seanhalle@208
|
113 */
|
|
seanhalle@208
|
114 struct _SlaveVP
|
|
seanhalle@215
|
115 { int slaveID; //each slave given a unique ID
|
|
seanhalle@208
|
116 int coreAnimatedBy;
|
|
seanhalle@208
|
117 void *startOfStack;
|
|
seanhalle@208
|
118 void *stackPtr;
|
|
seanhalle@208
|
119 void *framePtr;
|
|
seanhalle@208
|
120 void *resumeInstrPtr;
|
|
seanhalle@208
|
121
|
|
seanhalle@216
|
122 void *coreCtlrStartPt; //allows proto-runtime to be linked later
|
|
seanhalle@216
|
123 void *coreCtlrFramePtr; //restore before jmp back to core controller
|
|
seanhalle@216
|
124 void *coreCtlrStackPtr; //restore before jmp back to core controller
|
|
seanhalle@208
|
125
|
|
seanhalle@208
|
126 SchedSlot *schedSlot;
|
|
seanhalle@208
|
127 VMSReqst *requests;
|
|
seanhalle@208
|
128
|
|
seanhalle@210
|
129 void *semanticData; //this is live for the life of Slv
|
|
seanhalle@210
|
130 void *dataRetFromReq;//Used to return vals from plugin to Wrapper Lib
|
|
seanhalle@208
|
131
|
|
seanhalle@208
|
132 //=========== MEASUREMENT STUFF ==========
|
|
seanhalle@209
|
133 MEAS__Insert_Meas_Fields_into_Slave;
|
|
seanhalle@208
|
134 //========================================
|
|
seanhalle@208
|
135
|
|
seanhalle@208
|
136 float64 createPtInSecs; //have space but don't use on some configs
|
|
seanhalle@208
|
137 };
|
|
seanhalle@208
|
138 //SlaveVP
|
|
seanhalle@208
|
139
|
|
seanhalle@230
|
140 /*The one and only global variable, holds many odds and ends
|
|
seanhalle@208
|
141 */
|
|
seanhalle@208
|
142 typedef struct
|
|
seanhalle@230
|
143 { //The offsets of these fields are hard-coded into assembly
|
|
seanhalle@226
|
144 void *coreCtlrReturnPt; //offset of field used in asm
|
|
seanhalle@226
|
145 int32 masterLock __align_to_cacheline__; //used in asm
|
|
seanhalle@226
|
146
|
|
seanhalle@230
|
147 //============ below this, no asm uses the field offsets =============
|
|
seanhalle@230
|
148
|
|
seanhalle@230
|
149 //Basic VMS infrastructure
|
|
seanhalle@230
|
150 SlaveVP **masterVPs;
|
|
seanhalle@230
|
151 SchedSlot ***allSchedSlots;
|
|
seanhalle@230
|
152
|
|
seanhalle@230
|
153 //plugin related
|
|
seanhalle@225
|
154 SlaveAssigner slaveAssigner;
|
|
seanhalle@208
|
155 RequestHandler requestHandler;
|
|
seanhalle@230
|
156 void *semanticEnv;
|
|
seanhalle@208
|
157
|
|
seanhalle@230
|
158 //Slave creation
|
|
seanhalle@230
|
159 int32 numSlavesCreated; //gives ordering to processor creation
|
|
seanhalle@230
|
160 int32 numSlavesAlive; //used to detect fail-safe shutdown
|
|
seanhalle@208
|
161
|
|
seanhalle@230
|
162 //Initialization related
|
|
seanhalle@230
|
163 int32 setupComplete; //use while starting up coreCtlr
|
|
seanhalle@230
|
164
|
|
seanhalle@230
|
165 //Memory management related
|
|
seanhalle@223
|
166 MallocArrays *freeLists;
|
|
seanhalle@230
|
167 int32 amtOfOutstandingMem;//total currently allocated
|
|
seanhalle@230
|
168
|
|
seanhalle@230
|
169 //Work-stealing related
|
|
seanhalle@208
|
170 GateStruc *workStealingGates[ NUM_CORES ]; //concurrent work-steal
|
|
seanhalle@208
|
171 int32 workStealingLock;
|
|
seanhalle@208
|
172
|
|
seanhalle@230
|
173
|
|
seanhalle@208
|
174 //=========== MEASUREMENT STUFF =============
|
|
seanhalle@208
|
175 IntervalProbe **intervalProbes;
|
|
seanhalle@208
|
176 PrivDynArrayInfo *dynIntervalProbesInfo;
|
|
seanhalle@208
|
177 HashTable *probeNameHashTbl;
|
|
seanhalle@208
|
178 int32 masterCreateProbeID;
|
|
seanhalle@230
|
179 float64 createPtInSecs; //real-clock time VMS initialized
|
|
seanhalle@208
|
180 Histogram **measHists;
|
|
seanhalle@208
|
181 PrivDynArrayInfo *measHistsInfo;
|
|
seanhalle@209
|
182 MEAS__Insert_Susp_Meas_Fields_into_MasterEnv;
|
|
seanhalle@209
|
183 MEAS__Insert_Master_Meas_Fields_into_MasterEnv;
|
|
seanhalle@209
|
184 MEAS__Insert_Master_Lock_Meas_Fields_into_MasterEnv;
|
|
seanhalle@209
|
185 MEAS__Insert_Malloc_Meas_Fields_into_MasterEnv;
|
|
seanhalle@209
|
186 MEAS__Insert_Plugin_Meas_Fields_into_MasterEnv;
|
|
seanhalle@209
|
187 MEAS__Insert_System_Meas_Fields_into_MasterEnv;
|
|
seanhalle@208
|
188 //==========================================
|
|
seanhalle@208
|
189 }
|
|
seanhalle@208
|
190 MasterEnv;
|
|
seanhalle@208
|
191
|
|
seanhalle@208
|
192 //========================= Extra Stuff Data Strucs =======================
|
|
seanhalle@208
|
193 typedef struct
|
|
seanhalle@208
|
194 {
|
|
seanhalle@208
|
195
|
|
seanhalle@208
|
196 }
|
|
seanhalle@208
|
197 VMSExcp;
|
|
seanhalle@208
|
198
|
|
seanhalle@208
|
199 struct _GateStruc
|
|
seanhalle@208
|
200 {
|
|
seanhalle@208
|
201 int32 gateClosed;
|
|
seanhalle@208
|
202 int32 preGateProgress;
|
|
seanhalle@208
|
203 int32 waitProgress;
|
|
seanhalle@208
|
204 int32 exitProgress;
|
|
seanhalle@208
|
205 };
|
|
seanhalle@208
|
206 //GateStruc
|
|
seanhalle@208
|
207
|
|
seanhalle@208
|
208 //======================= OS Thread related ===============================
|
|
seanhalle@208
|
209
|
|
seanhalle@216
|
210 void * coreController( void *paramsIn ); //standard PThreads fn prototype
|
|
seanhalle@216
|
211 void * coreCtlr_Seq( void *paramsIn ); //standard PThreads fn prototype
|
|
seanhalle@230
|
212 void animationMaster( void *initData, SlaveVP *masterVP );
|
|
seanhalle@208
|
213
|
|
seanhalle@208
|
214
|
|
seanhalle@208
|
215 typedef struct
|
|
seanhalle@208
|
216 {
|
|
seanhalle@208
|
217 void *endThdPt;
|
|
seanhalle@208
|
218 unsigned int coreNum;
|
|
seanhalle@208
|
219 }
|
|
seanhalle@208
|
220 ThdParams;
|
|
seanhalle@208
|
221
|
|
seanhalle@209
|
222 //============================= Global Vars ================================
|
|
seanhalle@209
|
223
|
|
seanhalle@215
|
224 volatile MasterEnv *_VMSMasterEnv __align_to_cacheline__;
|
|
seanhalle@215
|
225
|
|
seanhalle@222
|
226 pthread_t coreCtlrThdHandles[ NUM_CORES ]; //pthread's virt-procr state
|
|
seanhalle@216
|
227 ThdParams *coreCtlrThdParams [ NUM_CORES ];
|
|
seanhalle@222
|
228
|
|
seanhalle@222
|
229 pthread_mutex_t suspendLock;
|
|
seanhalle@222
|
230 pthread_cond_t suspendCond;
|
|
seanhalle@208
|
231
|
|
seanhalle@208
|
232 //========================= Function Prototypes ===========================
|
|
seanhalle@208
|
233
|
|
seanhalle@209
|
234 /* MEANING OF WL PI SS int
|
|
seanhalle@209
|
235 * These indicate which places the function is safe to use. They stand for:
|
|
seanhalle@209
|
236 * WL: Wrapper Library
|
|
seanhalle@209
|
237 * PI: Plugin
|
|
seanhalle@209
|
238 * SS: Startup and Shutdown
|
|
seanhalle@209
|
239 * int: internal to the VMS implementation
|
|
seanhalle@209
|
240 */
|
|
seanhalle@208
|
241
|
|
seanhalle@208
|
242 //========== Setup and shutdown ==========
|
|
seanhalle@208
|
243 void
|
|
seanhalle@209
|
244 VMS_SS__init();
|
|
seanhalle@208
|
245
|
|
seanhalle@208
|
246 void
|
|
seanhalle@209
|
247 VMS_SS__start_the_work_then_wait_until_done();
|
|
seanhalle@208
|
248
|
|
seanhalle@208
|
249 void
|
|
seanhalle@209
|
250 VMS_SS__shutdown();
|
|
seanhalle@208
|
251
|
|
seanhalle@208
|
252 void
|
|
seanhalle@209
|
253 VMS_SS__cleanup_at_end_of_shutdown();
|
|
seanhalle@208
|
254
|
|
seanhalle@208
|
255
|
|
seanhalle@208
|
256 //============== ===============
|
|
seanhalle@208
|
257
|
|
seanhalle@208
|
258 inline SlaveVP *
|
|
seanhalle@209
|
259 VMS_int__create_slaveVP( TopLevelFnPtr fnPtr, void *dataParam );
|
|
seanhalle@209
|
260 #define VMS_PI__create_slaveVP VMS_int__create_slaveVP
|
|
seanhalle@209
|
261 #define VMS_WL__create_slaveVP VMS_int__create_slaveVP
|
|
seanhalle@208
|
262
|
|
seanhalle@210
|
263 //Use this to create processor inside entry point & other places outside
|
|
seanhalle@210
|
264 // the VMS system boundary (IE, don't animate with a SlaveVP or MasterVP)
|
|
seanhalle@210
|
265 SlaveVP *
|
|
seanhalle@210
|
266 VMS_ext__create_slaveVP( TopLevelFnPtr fnPtr, void *dataParam );
|
|
seanhalle@210
|
267
|
|
seanhalle@210
|
268 inline SlaveVP *
|
|
seanhalle@210
|
269 VMS_int__create_slaveVP_helper( SlaveVP *newSlv, TopLevelFnPtr fnPtr,
|
|
seanhalle@210
|
270 void *dataParam, void *stackLocs );
|
|
seanhalle@210
|
271
|
|
seanhalle@208
|
272 inline void
|
|
seanhalle@209
|
273 VMS_int__point_slaveVP_to_Fn( SlaveVP *slaveVP, TopLevelFnPtr fnPtr,
|
|
seanhalle@219
|
274 void *dataParam);
|
|
seanhalle@208
|
275
|
|
seanhalle@208
|
276 void
|
|
seanhalle@210
|
277 VMS_int__dissipate_slaveVP( SlaveVP *slaveToDissipate );
|
|
seanhalle@210
|
278 #define VMS_PI__dissipate_slaveVP VMS_int__dissipate_slaveVP
|
|
seanhalle@210
|
279 //WL: dissipate a SlaveVP by sending a request
|
|
seanhalle@208
|
280
|
|
seanhalle@208
|
281 void
|
|
seanhalle@209
|
282 VMS_ext__dissipate_slaveVP( SlaveVP *slaveToDissipate );
|
|
seanhalle@208
|
283
|
|
seanhalle@208
|
284 void
|
|
seanhalle@209
|
285 VMS_int__throw_exception( char *msgStr, SlaveVP *reqstSlv, VMSExcp *excpData );
|
|
seanhalle@209
|
286 #define VMS_PI__throw_exception VMS_int__throw_exception
|
|
seanhalle@209
|
287 #define VMS_WL__throw_exception VMS_int__throw_exception
|
|
seanhalle@208
|
288
|
|
seanhalle@208
|
289 void *
|
|
seanhalle@209
|
290 VMS_int__give_sem_env_for( SlaveVP *animSlv );
|
|
seanhalle@209
|
291 #define VMS_PI__give_sem_env_for VMS_int__give_sem_env_for
|
|
seanhalle@209
|
292 #define VMS_SS__give_sem_env_for VMS_int__give_sem_env_for
|
|
seanhalle@209
|
293 //No WL version -- not safe! if use in WL, be sure data rd & wr is stable
|
|
seanhalle@208
|
294
|
|
seanhalle@208
|
295 //============== Request Related ===============
|
|
seanhalle@208
|
296
|
|
seanhalle@208
|
297 void
|
|
seanhalle@209
|
298 VMS_int__suspend_slaveVP_and_send_req( SlaveVP *callingSlv );
|
|
seanhalle@208
|
299
|
|
seanhalle@208
|
300 inline void
|
|
seanhalle@209
|
301 VMS_WL__add_sem_request_in_mallocd_VMSReqst( void *semReqData, SlaveVP *callingSlv );
|
|
seanhalle@208
|
302
|
|
seanhalle@208
|
303 inline void
|
|
seanhalle@209
|
304 VMS_WL__send_sem_request( void *semReqData, SlaveVP *callingSlv );
|
|
seanhalle@208
|
305
|
|
seanhalle@208
|
306 void
|
|
seanhalle@209
|
307 VMS_WL__send_create_slaveVP_req( void *semReqData, SlaveVP *reqstingSlv );
|
|
seanhalle@208
|
308
|
|
seanhalle@208
|
309 void inline
|
|
seanhalle@208
|
310 VMS_WL__send_dissipate_req( SlaveVP *prToDissipate );
|
|
seanhalle@208
|
311
|
|
seanhalle@208
|
312 inline void
|
|
seanhalle@209
|
313 VMS_WL__send_VMSSem_request( void *semReqData, SlaveVP *callingSlv );
|
|
seanhalle@208
|
314
|
|
seanhalle@208
|
315 VMSReqst *
|
|
seanhalle@209
|
316 VMS_PI__take_next_request_out_of( SlaveVP *slaveWithReq );
|
|
seanhalle@208
|
317
|
|
seanhalle@208
|
318 inline void *
|
|
seanhalle@208
|
319 VMS_PI__take_sem_reqst_from( VMSReqst *req );
|
|
seanhalle@208
|
320
|
|
seanhalle@208
|
321 void inline
|
|
seanhalle@209
|
322 VMS_PI__handle_VMSSemReq( VMSReqst *req, SlaveVP *requestingSlv, void *semEnv,
|
|
seanhalle@209
|
323 ResumeSlvFnPtr resumeSlvFnPtr );
|
|
seanhalle@208
|
324
|
|
seanhalle@208
|
325 //======================== MEASUREMENT ======================
|
|
seanhalle@208
|
326 uint64
|
|
seanhalle@208
|
327 VMS_WL__give_num_plugin_cycles();
|
|
seanhalle@208
|
328 uint32
|
|
seanhalle@208
|
329 VMS_WL__give_num_plugin_animations();
|
|
seanhalle@208
|
330
|
|
seanhalle@208
|
331
|
|
seanhalle@210
|
332 //========================= Utilities =======================
|
|
seanhalle@210
|
333 inline char *
|
|
seanhalle@210
|
334 VMS_int__strDup( char *str );
|
|
seanhalle@208
|
335
|
|
seanhalle@210
|
336
|
|
seanhalle@210
|
337 //========================= Probes =======================
|
|
seanhalle@223
|
338 #include "Services_Offered_by_VMS/Measurement_and_Stats/probes.h"
|
|
seanhalle@210
|
339
|
|
seanhalle@210
|
340 //================================================
|
|
seanhalle@208
|
341 #endif /* _VMS_H */
|
|
seanhalle@208
|
342
|