| rev |
line source |
|
seanhalle@0
|
1 /*
|
|
seanhalle@27
|
2 * Copyright 2009 OpenSourceResearchInstitute.org
|
|
seanhalle@0
|
3 * Licensed under GNU General Public License version 2
|
|
seanhalle@0
|
4 *
|
|
seanhalle@0
|
5 * Author: seanhalle@yahoo.com
|
|
seanhalle@0
|
6 *
|
|
seanhalle@0
|
7 */
|
|
seanhalle@0
|
8
|
|
seanhalle@2
|
9 #ifndef _VSs_H
|
|
seanhalle@2
|
10 #define _VSs_H
|
|
seanhalle@0
|
11
|
|
seanhalle@0
|
12 #include "Queue_impl/PrivateQueue.h"
|
|
seanhalle@0
|
13 #include "Hash_impl/PrivateHash.h"
|
|
seanhalle@26
|
14 #include "PR_impl/PR.h"
|
|
seanhalle@3
|
15 #include "Measurement/dependency.h"
|
|
seanhalle@0
|
16
|
|
seanhalle@0
|
17
|
|
seanhalle@0
|
18 //===========================================================================
|
|
seanhalle@26
|
19 //uniquely identifies VSs -- should be a jenkins char-hash of "VSs" to int32
|
|
seanhalle@26
|
20 #define VSs_MAGIC_NUMBER 0000000001
|
|
seanhalle@26
|
21
|
|
seanhalle@27
|
22 #define NUM_STRUCS_IN_LANG_ENV 1000
|
|
seanhalle@0
|
23
|
|
seanhalle@0
|
24 //This is hardware dependent -- it's the number of cycles of scheduling
|
|
seanhalle@0
|
25 // overhead -- if a work unit is fewer than this, it is better being
|
|
seanhalle@0
|
26 // combined sequentially with other work
|
|
seanhalle@26
|
27 //This value depends on both PR overhead and VSs's plugin. At some point
|
|
seanhalle@2
|
28 // it will be derived by perf-counter measurements during init of VSs
|
|
seanhalle@0
|
29 #define MIN_WORK_UNIT_CYCLES 20000
|
|
seanhalle@0
|
30
|
|
seanhalle@0
|
31 //===========================================================================
|
|
seanhalle@2
|
32 /*This header defines everything specific to the VSs semantic plug-in
|
|
seanhalle@0
|
33 */
|
|
seanhalle@27
|
34 typedef struct _VSsLangReq VSsLangReq;
|
|
seanhalle@26
|
35 typedef struct _VSsTaskStub VSsTaskStub;
|
|
seanhalle@3
|
36 typedef void (*VSsTaskFnPtr ) ( void *, SlaveVP *);
|
|
seanhalle@2
|
37 typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master
|
|
seanhalle@0
|
38 //===========================================================================
|
|
seanhalle@0
|
39
|
|
seanhalle@4
|
40 #define NONCTLD 0
|
|
seanhalle@4
|
41 #define IN 1 /*Trick -- READER same as IN*/
|
|
seanhalle@4
|
42 #define OUT 2 /*Trick -- WRITER same as OUT and INOUT*/
|
|
seanhalle@4
|
43 #define INOUT 2 /*Trick -- WRITER same as OUT and INOUT*/
|
|
seanhalle@2
|
44
|
|
seanhalle@4
|
45 #define READER 1 /*Trick -- READER same as IN*/
|
|
seanhalle@4
|
46 #define WRITER 2 /*Trick -- WRITER same as OUT and INOUT*/
|
|
seanhalle@1
|
47
|
|
seanhalle@8
|
48 #define IS_A_THREAD NULL
|
|
seanhalle@8
|
49 #define IS_ENDED NULL
|
|
seanhalle@8
|
50 #define SEED_SLV NULL
|
|
seanhalle@8
|
51
|
|
seanhalle@26
|
52 #define NO_ID NULL
|
|
seanhalle@26
|
53 #define ANY_CORE -1
|
|
seanhalle@26
|
54
|
|
seanhalle@26
|
55 //===========================================================================
|
|
seanhalle@1
|
56 typedef struct
|
|
seanhalle@1
|
57 {
|
|
seanhalle@1
|
58 VSsTaskFnPtr fn;
|
|
seanhalle@2
|
59 int32 numTotalArgs;//the number of inputs to function
|
|
seanhalle@2
|
60 int32 numCtldArgs;//how many of args have dependencies
|
|
seanhalle@2
|
61 int32 *argTypes; //says reader, writer, or non-ctld
|
|
seanhalle@2
|
62 int32 *argSizes; //for detecting overlap
|
|
seanhalle@2
|
63 int32 sizeOfArgs; //for memcpy of args struct
|
|
seanhalle@1
|
64 }
|
|
seanhalle@1
|
65 VSsTaskType;
|
|
seanhalle@1
|
66
|
|
seanhalle@1
|
67
|
|
seanhalle@2
|
68 typedef struct
|
|
seanhalle@2
|
69 {
|
|
seanhalle@3
|
70 bool32 hasEnabledNonFinishedWriter;
|
|
seanhalle@3
|
71 int32 numEnabledNonDoneReaders;
|
|
seanhalle@3
|
72 PrivQueueStruc *waitersQ;
|
|
seanhalle@3
|
73 }
|
|
seanhalle@3
|
74 VSsPointerEntry;
|
|
seanhalle@3
|
75
|
|
seanhalle@27
|
76 /*This is placed into langData, used for dependencies and wait construct*/
|
|
seanhalle@26
|
77 struct _VSsTaskStub
|
|
seanhalle@3
|
78 {
|
|
seanhalle@27
|
79 //====== The first fields must match PRLangMetaTask fields ======
|
|
seanhalle@26
|
80 int32 langMagicNumber; //magic num must be 1st field of langMetaTask
|
|
seanhalle@26
|
81 PRMetaTask *protoMetaTask; //back-link must always be 2nd field
|
|
seanhalle@27
|
82 //====== end PRLangMetaTask fields =========
|
|
seanhalle@26
|
83 void **args; //ctld args must be the first ones (as ptrs)
|
|
seanhalle@26
|
84 VSsPointerEntry **ptrEntries;
|
|
seanhalle@26
|
85 int32 numBlockingProp;
|
|
seanhalle@26
|
86
|
|
seanhalle@26
|
87 VSsTaskType *taskType; //has VSs lang related info
|
|
seanhalle@26
|
88
|
|
seanhalle@26
|
89 VSsTaskStub *parentTaskStub; //for liveness, for the wait construct
|
|
seanhalle@8
|
90 int32 numLiveChildTasks;
|
|
seanhalle@8
|
91 int32 numLiveChildThreads;
|
|
seanhalle@8
|
92 bool32 isWaitingForChildTasksToEnd;
|
|
seanhalle@8
|
93 bool32 isWaitingForChildThreadsToEnd;
|
|
seanhalle@8
|
94 bool32 isEnded;
|
|
seanhalle@26
|
95 };
|
|
nengel@5
|
96
|
|
seanhalle@2
|
97
|
|
seanhalle@2
|
98 typedef struct
|
|
seanhalle@2
|
99 {
|
|
seanhalle@2
|
100 VSsTaskStub *taskStub;
|
|
seanhalle@2
|
101 int32 argNum;
|
|
seanhalle@2
|
102 int32 isReader;
|
|
seanhalle@2
|
103 }
|
|
seanhalle@2
|
104 VSsTaskStubCarrier;
|
|
seanhalle@2
|
105
|
|
seanhalle@2
|
106
|
|
seanhalle@0
|
107 /*Semantic layer-specific data sent inside a request from lib called in app
|
|
seanhalle@0
|
108 * to request handler called in AnimationMaster
|
|
seanhalle@0
|
109 */
|
|
seanhalle@0
|
110
|
|
seanhalle@0
|
111 typedef struct
|
|
seanhalle@0
|
112 {
|
|
seanhalle@0
|
113 SlaveVP *VPCurrentlyExecuting;
|
|
seanhalle@0
|
114 PrivQueueStruc *waitingVPQ;
|
|
seanhalle@0
|
115 }
|
|
seanhalle@2
|
116 VSsTrans;
|
|
seanhalle@0
|
117
|
|
seanhalle@0
|
118 /*WARNING: assembly hard-codes position of endInstrAddr as first field
|
|
seanhalle@0
|
119 */
|
|
seanhalle@0
|
120 typedef struct
|
|
seanhalle@0
|
121 {
|
|
seanhalle@0
|
122 void *endInstrAddr;
|
|
seanhalle@0
|
123 int32 hasBeenStarted;
|
|
seanhalle@0
|
124 int32 hasFinished;
|
|
seanhalle@0
|
125 PrivQueueStruc *waitQ;
|
|
seanhalle@0
|
126 }
|
|
seanhalle@2
|
127 VSsSingleton;
|
|
seanhalle@0
|
128
|
|
seanhalle@2
|
129 enum VSsReqType
|
|
seanhalle@0
|
130 {
|
|
seanhalle@2
|
131 submit_task = 1,
|
|
seanhalle@2
|
132 end_task,
|
|
seanhalle@2
|
133 create_slave,
|
|
seanhalle@2
|
134 create_slave_w_aff,
|
|
seanhalle@2
|
135 dissipate_slave,
|
|
seanhalle@2
|
136 //===============================
|
|
seanhalle@4
|
137 send_type_to,
|
|
seanhalle@4
|
138 receive_type_to,
|
|
seanhalle@4
|
139 send_from_to,
|
|
seanhalle@4
|
140 receive_from_to,
|
|
seanhalle@4
|
141 //===============================
|
|
nengel@5
|
142 taskwait,
|
|
seanhalle@0
|
143 malloc_req,
|
|
seanhalle@0
|
144 free_req,
|
|
seanhalle@0
|
145 singleton_fn_start,
|
|
seanhalle@0
|
146 singleton_fn_end,
|
|
seanhalle@0
|
147 singleton_data_start,
|
|
seanhalle@0
|
148 singleton_data_end,
|
|
seanhalle@0
|
149 atomic,
|
|
seanhalle@0
|
150 trans_start,
|
|
seanhalle@0
|
151 trans_end
|
|
seanhalle@0
|
152 };
|
|
seanhalle@0
|
153
|
|
seanhalle@27
|
154 struct _VSsLangReq
|
|
seanhalle@2
|
155 { enum VSsReqType reqType;
|
|
seanhalle@2
|
156 SlaveVP *callingSlv;
|
|
seanhalle@2
|
157 VSsTaskType *taskType;
|
|
seanhalle@2
|
158 void *args;
|
|
seanhalle@26
|
159 // VSsTaskStub *taskStub; //not needed -- get via PR accessor from slv
|
|
seanhalle@2
|
160
|
|
seanhalle@4
|
161 SlaveVP *senderSlv;
|
|
seanhalle@4
|
162 SlaveVP *receiverSlv;
|
|
seanhalle@4
|
163 int32 *senderID;
|
|
seanhalle@4
|
164 int32 *receiverID;
|
|
seanhalle@4
|
165 int32 msgType;
|
|
seanhalle@4
|
166 void *msg;
|
|
seanhalle@27
|
167 VSsLangReq *nextReqInHashEntry;
|
|
seanhalle@26
|
168 //In PRReq: int32 *taskID;
|
|
seanhalle@4
|
169
|
|
seanhalle@2
|
170 TopLevelFnPtr fnPtr;
|
|
seanhalle@0
|
171 void *initData;
|
|
seanhalle@0
|
172 int32 coreToAssignOnto;
|
|
seanhalle@0
|
173
|
|
seanhalle@26
|
174 //These, below, should move to util language..
|
|
seanhalle@0
|
175 int32 sizeToMalloc;
|
|
seanhalle@0
|
176 void *ptrToFree;
|
|
seanhalle@0
|
177
|
|
seanhalle@0
|
178 int32 singletonID;
|
|
seanhalle@2
|
179 VSsSingleton **singletonPtrAddr;
|
|
seanhalle@0
|
180
|
|
seanhalle@0
|
181 PtrToAtomicFn fnToExecInMaster;
|
|
seanhalle@0
|
182 void *dataForFn;
|
|
seanhalle@0
|
183
|
|
seanhalle@0
|
184 int32 transID;
|
|
seanhalle@0
|
185 }
|
|
seanhalle@27
|
186 /* VSsLangReq */;
|
|
seanhalle@0
|
187
|
|
seanhalle@0
|
188
|
|
seanhalle@0
|
189 typedef struct
|
|
seanhalle@27
|
190 {
|
|
seanhalle@9
|
191 PrivQueueStruc *slavesReadyToResumeQ; //Shared (slaves not pinned)
|
|
seanhalle@9
|
192 PrivQueueStruc *taskReadyQ; //Shared (tasks not pinned)
|
|
seanhalle@27
|
193
|
|
seanhalle@2
|
194 HashTable *argPtrHashTbl;
|
|
seanhalle@4
|
195 HashTable *commHashTbl;
|
|
seanhalle@3
|
196 int32 nextCoreToGetNewSlv;
|
|
seanhalle@0
|
197 int32 primitiveStartTime;
|
|
seanhalle@0
|
198
|
|
seanhalle@0
|
199 //fix limit on num with dynArray
|
|
seanhalle@27
|
200 VSsSingleton fnSingletons[NUM_STRUCS_IN_LANG_ENV];
|
|
seanhalle@27
|
201 VSsTrans transactionStrucs[NUM_STRUCS_IN_LANG_ENV];
|
|
seanhalle@0
|
202
|
|
seanhalle@0
|
203 #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC
|
|
seanhalle@0
|
204 ListOfArrays* unitList;
|
|
seanhalle@0
|
205 ListOfArrays* ctlDependenciesList;
|
|
seanhalle@0
|
206 ListOfArrays* commDependenciesList;
|
|
seanhalle@0
|
207 NtoN** ntonGroups;
|
|
seanhalle@0
|
208 PrivDynArrayInfo* ntonGroupsInfo;
|
|
seanhalle@0
|
209 ListOfArrays* dynDependenciesList;
|
|
seanhalle@0
|
210 Unit last_in_slot[NUM_CORES * NUM_ANIM_SLOTS];
|
|
seanhalle@0
|
211 ListOfArrays* hwArcs;
|
|
seanhalle@0
|
212 #endif
|
|
seanhalle@0
|
213
|
|
seanhalle@0
|
214 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
|
|
seanhalle@0
|
215 ListOfArrays* counterList[NUM_CORES];
|
|
seanhalle@0
|
216 #endif
|
|
seanhalle@0
|
217 }
|
|
seanhalle@27
|
218 VSsLangEnv;
|
|
seanhalle@0
|
219
|
|
seanhalle@0
|
220
|
|
seanhalle@0
|
221 typedef struct _TransListElem TransListElem;
|
|
seanhalle@0
|
222 struct _TransListElem
|
|
seanhalle@0
|
223 {
|
|
seanhalle@0
|
224 int32 transID;
|
|
seanhalle@0
|
225 TransListElem *nextTrans;
|
|
seanhalle@0
|
226 };
|
|
seanhalle@0
|
227 //TransListElem
|
|
seanhalle@0
|
228
|
|
seanhalle@26
|
229 /* PR now handles what this used to be used for
|
|
seanhalle@8
|
230 enum VSsSlvType
|
|
seanhalle@26
|
231 { FreeTaskSlv = 1,
|
|
seanhalle@10
|
232 SlotTaskSlv,
|
|
seanhalle@10
|
233 ThreadSlv
|
|
seanhalle@8
|
234 };
|
|
seanhalle@26
|
235 */
|
|
nengel@5
|
236
|
|
seanhalle@0
|
237 typedef struct
|
|
seanhalle@0
|
238 {
|
|
seanhalle@26
|
239 int32 highestTransEntered;
|
|
seanhalle@26
|
240 TransListElem *lastTransEntered;
|
|
seanhalle@26
|
241 int32 primitiveStartTime;
|
|
seanhalle@26
|
242 // VSsTaskStub *taskStub; //get from slave via PR accessor
|
|
seanhalle@0
|
243 }
|
|
seanhalle@27
|
244 VSsLangData;
|
|
seanhalle@0
|
245
|
|
seanhalle@0
|
246 //===========================================================================
|
|
seanhalle@0
|
247
|
|
seanhalle@0
|
248 void
|
|
seanhalle@2
|
249 VSs__create_seed_slave_and_do_work( TopLevelFnPtr fn, void *initData );
|
|
seanhalle@0
|
250
|
|
seanhalle@0
|
251 int32
|
|
seanhalle@2
|
252 VSs__giveMinWorkUnitCycles( float32 percentOverhead );
|
|
seanhalle@0
|
253
|
|
seanhalle@0
|
254 void
|
|
seanhalle@26
|
255 VSs__begin_primitive();
|
|
seanhalle@0
|
256
|
|
seanhalle@0
|
257 int32
|
|
seanhalle@2
|
258 VSs__end_primitive_and_give_cycles();
|
|
seanhalle@0
|
259
|
|
seanhalle@0
|
260 int32
|
|
seanhalle@2
|
261 VSs__giveIdealNumWorkUnits();
|
|
seanhalle@0
|
262
|
|
seanhalle@0
|
263 int32
|
|
seanhalle@2
|
264 VSs__give_number_of_cores_to_schedule_onto();
|
|
seanhalle@0
|
265
|
|
seanhalle@0
|
266 //=======================
|
|
seanhalle@0
|
267
|
|
seanhalle@0
|
268 void
|
|
seanhalle@26
|
269 VSs__start( SlaveVP *seedSlv );
|
|
seanhalle@0
|
270
|
|
seanhalle@0
|
271 void
|
|
seanhalle@2
|
272 VSs__cleanup_after_shutdown();
|
|
seanhalle@0
|
273
|
|
seanhalle@0
|
274 //=======================
|
|
seanhalle@0
|
275
|
|
seanhalle@4
|
276 SlaveVP *
|
|
seanhalle@7
|
277 VSs__create_thread( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@7
|
278 SlaveVP *creatingThd );
|
|
seanhalle@0
|
279
|
|
seanhalle@0
|
280 void
|
|
seanhalle@7
|
281 VSs__end_thread( SlaveVP *thdToEnd );
|
|
seanhalle@0
|
282
|
|
seanhalle@0
|
283 //=======================
|
|
seanhalle@2
|
284
|
|
seanhalle@26
|
285 #define VSs__malloc( numBytes, callingSlave ) PR_App__malloc( numBytes, callingSlave)
|
|
seanhalle@2
|
286
|
|
seanhalle@26
|
287 #define VSs__free(ptrToFree, callingSlave ) PR_App__free( ptrToFree, callingSlave )
|
|
seanhalle@2
|
288
|
|
seanhalle@2
|
289
|
|
seanhalle@2
|
290 //=======================
|
|
seanhalle@4
|
291 void
|
|
seanhalle@3
|
292 VSs__submit_task( VSsTaskType *taskType, void *args, SlaveVP *animSlv);
|
|
seanhalle@2
|
293
|
|
seanhalle@4
|
294 inline int32 *
|
|
seanhalle@4
|
295 VSs__create_taskID_of_size( int32 numInts, SlaveVP *animSlv );
|
|
seanhalle@4
|
296
|
|
seanhalle@4
|
297 void
|
|
seanhalle@4
|
298 VSs__submit_task_with_ID( VSsTaskType *taskType, void *args, int32 *taskID,
|
|
seanhalle@4
|
299 SlaveVP *animSlv);
|
|
seanhalle@0
|
300
|
|
seanhalle@0
|
301 void
|
|
seanhalle@2
|
302 VSs__end_task( SlaveVP *animSlv );
|
|
seanhalle@0
|
303
|
|
seanhalle@4
|
304 //=========================
|
|
nengel@5
|
305 void
|
|
nengel@5
|
306 VSs__taskwait(SlaveVP *animSlv);
|
|
nengel@5
|
307
|
|
seanhalle@4
|
308
|
|
seanhalle@4
|
309 inline int32 *
|
|
seanhalle@4
|
310 VSs__give_self_taskID( SlaveVP *animSlv );
|
|
seanhalle@4
|
311
|
|
seanhalle@4
|
312 void
|
|
seanhalle@4
|
313 VSs__send_of_type_to( void *msg, const int32 type, int32 *receiverID,
|
|
seanhalle@4
|
314 SlaveVP *senderSlv );
|
|
seanhalle@4
|
315
|
|
seanhalle@4
|
316 void
|
|
seanhalle@4
|
317 VSs__send_from_to( void *msg, int32 *senderID, int32 *receiverID, SlaveVP *senderSlv );
|
|
seanhalle@4
|
318
|
|
seanhalle@4
|
319 void *
|
|
seanhalle@4
|
320 VSs__receive_type_to( const int32 type, int32* receiverID, SlaveVP *receiverSlv );
|
|
seanhalle@4
|
321
|
|
seanhalle@4
|
322 void *
|
|
seanhalle@4
|
323 VSs__receive_from_to( int32 *senderID, int32 *receiverID, SlaveVP *receiverSlv );
|
|
seanhalle@0
|
324
|
|
seanhalle@0
|
325 //======================= Concurrency Stuff ======================
|
|
seanhalle@0
|
326 void
|
|
seanhalle@2
|
327 VSs__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
|
seanhalle@0
|
328
|
|
seanhalle@0
|
329 void
|
|
seanhalle@2
|
330 VSs__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
|
seanhalle@0
|
331
|
|
seanhalle@0
|
332 void
|
|
seanhalle@2
|
333 VSs__start_data_singleton( VSsSingleton **singeltonAddr, SlaveVP *animSlv );
|
|
seanhalle@0
|
334
|
|
seanhalle@0
|
335 void
|
|
seanhalle@2
|
336 VSs__end_data_singleton( VSsSingleton **singletonAddr, SlaveVP *animSlv );
|
|
seanhalle@0
|
337
|
|
seanhalle@0
|
338 void
|
|
seanhalle@2
|
339 VSs__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
|
|
seanhalle@0
|
340 void *data, SlaveVP *animSlv );
|
|
seanhalle@0
|
341
|
|
seanhalle@0
|
342 void
|
|
seanhalle@2
|
343 VSs__start_transaction( int32 transactionID, SlaveVP *animSlv );
|
|
seanhalle@0
|
344
|
|
seanhalle@0
|
345 void
|
|
seanhalle@2
|
346 VSs__end_transaction( int32 transactionID, SlaveVP *animSlv );
|
|
seanhalle@0
|
347
|
|
seanhalle@0
|
348
|
|
seanhalle@0
|
349 //========================= Internal use only =============================
|
|
seanhalle@0
|
350 void
|
|
seanhalle@27
|
351 VSs__Request_Handler( SlaveVP *requestingSlv, void *_langEnv );
|
|
seanhalle@0
|
352
|
|
seanhalle@0
|
353 SlaveVP *
|
|
seanhalle@27
|
354 VSs__assign_work_to_slot( void *_langEnv, AnimSlot *slot );
|
|
seanhalle@0
|
355
|
|
seanhalle@0
|
356 SlaveVP*
|
|
seanhalle@2
|
357 VSs__create_slave_helper( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@27
|
358 VSsLangEnv *langEnv, int32 coreToAssignOnto );
|
|
seanhalle@7
|
359
|
|
seanhalle@7
|
360 SlaveVP *
|
|
seanhalle@7
|
361 VSs__create_slave_with( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@7
|
362 SlaveVP *creatingSlv );
|
|
seanhalle@7
|
363
|
|
seanhalle@7
|
364 SlaveVP *
|
|
seanhalle@7
|
365 VSs__create_slave_with_affinity( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@7
|
366 SlaveVP *creatingSlv, int32 coreToAssignOnto);
|
|
seanhalle@7
|
367
|
|
seanhalle@27
|
368 //===================== =====================
|
|
seanhalle@27
|
369 inline
|
|
seanhalle@27
|
370 void *
|
|
seanhalle@27
|
371 handleSubmitTask( VSsLangReq *langReq, VSsLangEnv *langEnv );
|
|
seanhalle@27
|
372 inline
|
|
seanhalle@27
|
373 void
|
|
seanhalle@27
|
374 handleEndTask( VSsLangReq *langReq, SlaveVP *requestingSlv, VSsLangEnv *langEnv );
|
|
seanhalle@27
|
375
|
|
seanhalle@27
|
376
|
|
seanhalle@0
|
377 //===================== Measurement of Lang Overheads =====================
|
|
seanhalle@3
|
378 #include "Measurement/VSs_Measurement.h"
|
|
seanhalle@0
|
379
|
|
seanhalle@0
|
380 //===========================================================================
|
|
seanhalle@2
|
381 #endif /* _VSs_H */
|
|
seanhalle@0
|
382
|