| rev |
line source |
|
seanhalle@27
|
1 /*
|
|
seanhalle@27
|
2 * Copyright 2009 OpenSourceStewardshipFoundation.org
|
|
seanhalle@27
|
3 * Licensed under GNU General Public License version 2
|
|
seanhalle@27
|
4 *
|
|
seanhalle@27
|
5 * Author: seanhalle@yahoo.com
|
|
seanhalle@27
|
6 *
|
|
seanhalle@27
|
7 */
|
|
seanhalle@27
|
8
|
|
seanhalle@28
|
9 #ifndef _Vthread_H
|
|
seanhalle@28
|
10 #define _Vthread_H
|
|
seanhalle@28
|
11
|
|
seanhalle@28
|
12 #define _LANG_NAME_ "Vthread"
|
|
seanhalle@27
|
13
|
|
seanhalle@27
|
14 #include "VMS_impl/VMS.h"
|
|
seanhalle@27
|
15 #include "C_Libraries/Queue_impl/PrivateQueue.h"
|
|
seanhalle@27
|
16 #include "C_Libraries/DynArray/DynArray.h"
|
|
seanhalle@27
|
17
|
|
seanhalle@27
|
18
|
|
seanhalle@28
|
19 /*This header defines everything specific to the Vthread semantic plug-in
|
|
seanhalle@27
|
20 */
|
|
seanhalle@27
|
21
|
|
seanhalle@27
|
22
|
|
seanhalle@27
|
23 //===========================================================================
|
|
seanhalle@27
|
24 //turn on the counter measurements of language overhead -- comment to turn off
|
|
seanhalle@27
|
25 #define MEAS__TURN_ON_LANG_MEAS
|
|
seanhalle@29
|
26 #include "Vthread__Measurement.h"
|
|
seanhalle@27
|
27
|
|
seanhalle@27
|
28 #define INIT_NUM_MUTEX 10000
|
|
seanhalle@27
|
29 #define INIT_NUM_COND 10000
|
|
seanhalle@27
|
30
|
|
seanhalle@27
|
31 #define NUM_STRUCS_IN_SEM_ENV 1000
|
|
seanhalle@27
|
32 //===========================================================================
|
|
seanhalle@27
|
33
|
|
seanhalle@27
|
34 //===========================================================================
|
|
seanhalle@28
|
35 typedef struct _VthreadSemReq VthdSemReq;
|
|
seanhalle@27
|
36 typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master
|
|
seanhalle@27
|
37 //===========================================================================
|
|
seanhalle@27
|
38
|
|
seanhalle@27
|
39
|
|
seanhalle@27
|
40 /*WARNING: assembly hard-codes position of endInstrAddr as first field
|
|
seanhalle@27
|
41 */
|
|
seanhalle@27
|
42 typedef struct
|
|
seanhalle@27
|
43 {
|
|
seanhalle@28
|
44 void *savedRetAddr;
|
|
seanhalle@27
|
45 int32 hasBeenStarted;
|
|
seanhalle@27
|
46 int32 hasFinished;
|
|
seanhalle@27
|
47 PrivQueueStruc *waitQ;
|
|
seanhalle@27
|
48 }
|
|
seanhalle@28
|
49 VthdSingleton;
|
|
seanhalle@27
|
50
|
|
seanhalle@27
|
51 /*Semantic layer-specific data sent inside a request from lib called in app
|
|
seanhalle@27
|
52 * to request handler called in MasterLoop
|
|
seanhalle@27
|
53 */
|
|
seanhalle@28
|
54 enum VthreadReqType
|
|
seanhalle@27
|
55 {
|
|
seanhalle@27
|
56 make_mutex = 1,
|
|
seanhalle@27
|
57 mutex_lock,
|
|
seanhalle@27
|
58 mutex_unlock,
|
|
seanhalle@27
|
59 make_cond,
|
|
seanhalle@27
|
60 cond_wait,
|
|
seanhalle@27
|
61 cond_signal,
|
|
seanhalle@28
|
62 make_slaveVP,
|
|
seanhalle@27
|
63 malloc_req,
|
|
seanhalle@27
|
64 free_req,
|
|
seanhalle@27
|
65 singleton_fn_start,
|
|
seanhalle@27
|
66 singleton_fn_end,
|
|
seanhalle@27
|
67 singleton_data_start,
|
|
seanhalle@27
|
68 singleton_data_end,
|
|
seanhalle@27
|
69 atomic,
|
|
seanhalle@27
|
70 trans_start,
|
|
seanhalle@27
|
71 trans_end
|
|
seanhalle@27
|
72 };
|
|
seanhalle@27
|
73
|
|
seanhalle@28
|
74 struct _VthreadSemReq
|
|
seanhalle@28
|
75 { enum VthreadReqType reqType;
|
|
seanhalle@28
|
76 SlaveVP *requestingSlv;
|
|
seanhalle@27
|
77 int32 mutexIdx;
|
|
seanhalle@27
|
78 int32 condIdx;
|
|
seanhalle@27
|
79
|
|
seanhalle@27
|
80 void *initData;
|
|
seanhalle@27
|
81 TopLevelFnPtr fnPtr;
|
|
seanhalle@27
|
82 int32 coreToScheduleOnto;
|
|
seanhalle@27
|
83
|
|
seanhalle@27
|
84 size_t sizeToMalloc;
|
|
seanhalle@27
|
85 void *ptrToFree;
|
|
seanhalle@27
|
86
|
|
seanhalle@27
|
87 int32 singletonID;
|
|
seanhalle@28
|
88 VthdSingleton *singleton;
|
|
seanhalle@27
|
89
|
|
seanhalle@27
|
90 PtrToAtomicFn fnToExecInMaster;
|
|
seanhalle@27
|
91 void *dataForFn;
|
|
seanhalle@27
|
92
|
|
seanhalle@27
|
93 int32 transID;
|
|
seanhalle@27
|
94 }
|
|
seanhalle@28
|
95 /* VthreadSemReq */;
|
|
seanhalle@27
|
96
|
|
seanhalle@27
|
97
|
|
seanhalle@27
|
98 typedef struct
|
|
seanhalle@27
|
99 {
|
|
seanhalle@28
|
100 SlaveVP *SlvCurrentlyExecuting;
|
|
seanhalle@28
|
101 PrivQueueStruc *waitingSlvQ;
|
|
seanhalle@27
|
102 }
|
|
seanhalle@28
|
103 VthdTrans;
|
|
seanhalle@27
|
104
|
|
seanhalle@27
|
105
|
|
seanhalle@27
|
106 typedef struct
|
|
seanhalle@27
|
107 {
|
|
seanhalle@27
|
108 int32 mutexIdx;
|
|
seanhalle@27
|
109 SlaveVP *holderOfLock;
|
|
seanhalle@27
|
110 PrivQueueStruc *waitingQueue;
|
|
seanhalle@27
|
111 }
|
|
seanhalle@28
|
112 VthdMutex;
|
|
seanhalle@27
|
113
|
|
seanhalle@27
|
114
|
|
seanhalle@27
|
115 typedef struct
|
|
seanhalle@27
|
116 {
|
|
seanhalle@27
|
117 int32 condIdx;
|
|
seanhalle@27
|
118 PrivQueueStruc *waitingQueue;
|
|
seanhalle@28
|
119 VthdMutex *partnerMutex;
|
|
seanhalle@27
|
120 }
|
|
seanhalle@28
|
121 VthdCond;
|
|
seanhalle@27
|
122
|
|
seanhalle@27
|
123 typedef struct _TransListElem TransListElem;
|
|
seanhalle@27
|
124 struct _TransListElem
|
|
seanhalle@27
|
125 {
|
|
seanhalle@27
|
126 int32 transID;
|
|
seanhalle@27
|
127 TransListElem *nextTrans;
|
|
seanhalle@27
|
128 };
|
|
seanhalle@27
|
129 //TransListElem
|
|
seanhalle@27
|
130
|
|
seanhalle@27
|
131 typedef struct
|
|
seanhalle@27
|
132 {
|
|
seanhalle@27
|
133 int32 highestTransEntered;
|
|
seanhalle@27
|
134 TransListElem *lastTransEntered;
|
|
seanhalle@27
|
135 }
|
|
seanhalle@28
|
136 VthdSemData;
|
|
seanhalle@27
|
137
|
|
seanhalle@27
|
138
|
|
seanhalle@27
|
139 typedef struct
|
|
seanhalle@27
|
140 {
|
|
seanhalle@27
|
141 //Standard stuff will be in most every semantic env
|
|
seanhalle@28
|
142 PrivQueueStruc **readySlvQs;
|
|
seanhalle@28
|
143 int32 nextCoreToGetNewSlv;
|
|
seanhalle@27
|
144 int32 primitiveStartTime;
|
|
seanhalle@27
|
145
|
|
seanhalle@27
|
146 //Specific to this semantic layer
|
|
seanhalle@28
|
147 VthdMutex **mutexDynArray;
|
|
seanhalle@27
|
148 PrivDynArrayInfo *mutexDynArrayInfo;
|
|
seanhalle@27
|
149
|
|
seanhalle@28
|
150 VthdCond **condDynArray;
|
|
seanhalle@27
|
151 PrivDynArrayInfo *condDynArrayInfo;
|
|
seanhalle@27
|
152
|
|
seanhalle@27
|
153 void *applicationGlobals;
|
|
seanhalle@27
|
154
|
|
seanhalle@27
|
155 //fix limit on num with dynArray
|
|
seanhalle@28
|
156 VthdSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV];
|
|
seanhalle@27
|
157
|
|
seanhalle@28
|
158 VthdTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
|
|
seanhalle@27
|
159 }
|
|
seanhalle@28
|
160 VthdSemEnv;
|
|
seanhalle@27
|
161
|
|
seanhalle@29
|
162 //==========================================================================
|
|
seanhalle@29
|
163
|
|
seanhalle@29
|
164 void
|
|
seanhalle@29
|
165 Vthread__init();
|
|
seanhalle@29
|
166
|
|
seanhalle@29
|
167 void
|
|
seanhalle@29
|
168 Vthread__init_Seq();
|
|
seanhalle@29
|
169
|
|
seanhalle@29
|
170 void
|
|
seanhalle@29
|
171 Vthread__init_Helper();
|
|
seanhalle@29
|
172
|
|
seanhalle@27
|
173
|
|
seanhalle@27
|
174 //===========================================================================
|
|
seanhalle@27
|
175
|
|
seanhalle@27
|
176 inline void
|
|
seanhalle@28
|
177 Vthread__create_seed_slaveVP_and_do_work( TopLevelFnPtr fn, void *initData );
|
|
seanhalle@27
|
178
|
|
seanhalle@29
|
179 inline SlaveVP *
|
|
seanhalle@29
|
180 Vthread__create_slaveVP_helper( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@29
|
181 VthdSemEnv *semEnv, int32 coreToScheduleOnto );
|
|
seanhalle@29
|
182
|
|
seanhalle@27
|
183 //=======================
|
|
seanhalle@27
|
184
|
|
seanhalle@27
|
185 inline SlaveVP *
|
|
seanhalle@28
|
186 Vthread__create_thread( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@28
|
187 SlaveVP *creatingSlv );
|
|
seanhalle@27
|
188
|
|
seanhalle@27
|
189 inline SlaveVP *
|
|
seanhalle@28
|
190 Vthread__create_thread_with_affinity( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@28
|
191 SlaveVP *creatingSlv, int32 coreToScheduleOnto );
|
|
seanhalle@27
|
192
|
|
seanhalle@27
|
193 inline void
|
|
seanhalle@28
|
194 Vthread__dissipate_thread( SlaveVP *procrToDissipate );
|
|
seanhalle@27
|
195
|
|
seanhalle@27
|
196 //=======================
|
|
seanhalle@27
|
197 inline void
|
|
seanhalle@28
|
198 Vthread__set_globals_to( void *globals );
|
|
seanhalle@27
|
199
|
|
seanhalle@27
|
200 inline void *
|
|
seanhalle@28
|
201 Vthread__give_globals();
|
|
seanhalle@27
|
202
|
|
seanhalle@27
|
203 //=======================
|
|
seanhalle@27
|
204 inline int32
|
|
seanhalle@28
|
205 Vthread__make_mutex( SlaveVP *animSlv );
|
|
seanhalle@27
|
206
|
|
seanhalle@27
|
207 inline void
|
|
seanhalle@28
|
208 Vthread__mutex_lock( int32 mutexIdx, SlaveVP *acquiringSlv );
|
|
seanhalle@27
|
209
|
|
seanhalle@27
|
210 inline void
|
|
seanhalle@28
|
211 Vthread__mutex_unlock( int32 mutexIdx, SlaveVP *releasingSlv );
|
|
seanhalle@27
|
212
|
|
seanhalle@27
|
213
|
|
seanhalle@27
|
214 //=======================
|
|
seanhalle@27
|
215 inline int32
|
|
seanhalle@28
|
216 Vthread__make_cond( int32 ownedMutexIdx, SlaveVP *animSlv);
|
|
seanhalle@27
|
217
|
|
seanhalle@27
|
218 inline void
|
|
seanhalle@28
|
219 Vthread__cond_wait( int32 condIdx, SlaveVP *waitingSlv);
|
|
seanhalle@27
|
220
|
|
seanhalle@27
|
221 inline void *
|
|
seanhalle@28
|
222 Vthread__cond_signal( int32 condIdx, SlaveVP *signallingSlv );
|
|
seanhalle@27
|
223
|
|
seanhalle@27
|
224
|
|
seanhalle@27
|
225 //=======================
|
|
seanhalle@27
|
226 void
|
|
seanhalle@28
|
227 Vthread__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
|
seanhalle@27
|
228
|
|
seanhalle@27
|
229 void
|
|
seanhalle@28
|
230 Vthread__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
|
seanhalle@27
|
231
|
|
seanhalle@27
|
232 void
|
|
seanhalle@28
|
233 Vthread__start_data_singleton( VthdSingleton *singelton, SlaveVP *animSlv );
|
|
seanhalle@27
|
234
|
|
seanhalle@27
|
235 void
|
|
seanhalle@28
|
236 Vthread__end_data_singleton( VthdSingleton *singleton, SlaveVP *animSlv );
|
|
seanhalle@27
|
237
|
|
seanhalle@27
|
238 void
|
|
seanhalle@28
|
239 Vthread__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
|
|
seanhalle@28
|
240 void *data, SlaveVP *animSlv );
|
|
seanhalle@27
|
241
|
|
seanhalle@27
|
242 void
|
|
seanhalle@28
|
243 Vthread__start_transaction( int32 transactionID, SlaveVP *animSlv );
|
|
seanhalle@27
|
244
|
|
seanhalle@27
|
245 void
|
|
seanhalle@28
|
246 Vthread__end_transaction( int32 transactionID, SlaveVP *animSlv );
|
|
seanhalle@27
|
247
|
|
seanhalle@27
|
248
|
|
seanhalle@27
|
249
|
|
seanhalle@27
|
250 //========================= Internal use only =============================
|
|
seanhalle@27
|
251 inline void
|
|
seanhalle@28
|
252 Vthread__Request_Handler( SlaveVP *requestingSlv, void *_semEnv );
|
|
seanhalle@27
|
253
|
|
seanhalle@27
|
254 inline SlaveVP *
|
|
seanhalle@28
|
255 Vthread__schedule_slaveVP( void *_semEnv, int coreNum );
|
|
seanhalle@27
|
256
|
|
seanhalle@27
|
257 //=======================
|
|
seanhalle@27
|
258 inline void
|
|
seanhalle@28
|
259 Vthread__free_semantic_request( VthdSemReq *semReq );
|
|
seanhalle@27
|
260
|
|
seanhalle@27
|
261 //=======================
|
|
seanhalle@27
|
262
|
|
seanhalle@27
|
263 void *
|
|
seanhalle@28
|
264 Vthread__malloc( size_t sizeToMalloc, SlaveVP *animSlv );
|
|
seanhalle@27
|
265
|
|
seanhalle@27
|
266 void
|
|
seanhalle@28
|
267 Vthread__init();
|
|
seanhalle@27
|
268
|
|
seanhalle@27
|
269 void
|
|
seanhalle@28
|
270 Vthread__cleanup_after_shutdown();
|
|
seanhalle@27
|
271
|
|
seanhalle@27
|
272 void inline
|
|
seanhalle@28
|
273 resume_slaveVP( SlaveVP *procr, VthdSemEnv *semEnv );
|
|
seanhalle@27
|
274
|
|
seanhalle@28
|
275 #endif /* _Vthread_H */
|
|
seanhalle@27
|
276
|