| 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@28
|
26 #include "Vthread_Overhead_Meas.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@27
|
162
|
|
seanhalle@27
|
163 //===========================================================================
|
|
seanhalle@27
|
164
|
|
seanhalle@27
|
165 inline void
|
|
seanhalle@28
|
166 Vthread__create_seed_slaveVP_and_do_work( TopLevelFnPtr fn, void *initData );
|
|
seanhalle@27
|
167
|
|
seanhalle@27
|
168 //=======================
|
|
seanhalle@27
|
169
|
|
seanhalle@27
|
170 inline SlaveVP *
|
|
seanhalle@28
|
171 Vthread__create_thread( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@28
|
172 SlaveVP *creatingSlv );
|
|
seanhalle@27
|
173
|
|
seanhalle@27
|
174 inline SlaveVP *
|
|
seanhalle@28
|
175 Vthread__create_thread_with_affinity( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@28
|
176 SlaveVP *creatingSlv, int32 coreToScheduleOnto );
|
|
seanhalle@27
|
177
|
|
seanhalle@27
|
178 inline void
|
|
seanhalle@28
|
179 Vthread__dissipate_thread( SlaveVP *procrToDissipate );
|
|
seanhalle@27
|
180
|
|
seanhalle@27
|
181 //=======================
|
|
seanhalle@27
|
182 inline void
|
|
seanhalle@28
|
183 Vthread__set_globals_to( void *globals );
|
|
seanhalle@27
|
184
|
|
seanhalle@27
|
185 inline void *
|
|
seanhalle@28
|
186 Vthread__give_globals();
|
|
seanhalle@27
|
187
|
|
seanhalle@27
|
188 //=======================
|
|
seanhalle@27
|
189 inline int32
|
|
seanhalle@28
|
190 Vthread__make_mutex( SlaveVP *animSlv );
|
|
seanhalle@27
|
191
|
|
seanhalle@27
|
192 inline void
|
|
seanhalle@28
|
193 Vthread__mutex_lock( int32 mutexIdx, SlaveVP *acquiringSlv );
|
|
seanhalle@27
|
194
|
|
seanhalle@27
|
195 inline void
|
|
seanhalle@28
|
196 Vthread__mutex_unlock( int32 mutexIdx, SlaveVP *releasingSlv );
|
|
seanhalle@27
|
197
|
|
seanhalle@27
|
198
|
|
seanhalle@27
|
199 //=======================
|
|
seanhalle@27
|
200 inline int32
|
|
seanhalle@28
|
201 Vthread__make_cond( int32 ownedMutexIdx, SlaveVP *animSlv);
|
|
seanhalle@27
|
202
|
|
seanhalle@27
|
203 inline void
|
|
seanhalle@28
|
204 Vthread__cond_wait( int32 condIdx, SlaveVP *waitingSlv);
|
|
seanhalle@27
|
205
|
|
seanhalle@27
|
206 inline void *
|
|
seanhalle@28
|
207 Vthread__cond_signal( int32 condIdx, SlaveVP *signallingSlv );
|
|
seanhalle@27
|
208
|
|
seanhalle@27
|
209
|
|
seanhalle@27
|
210 //=======================
|
|
seanhalle@27
|
211 void
|
|
seanhalle@28
|
212 Vthread__start_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
|
seanhalle@27
|
213
|
|
seanhalle@27
|
214 void
|
|
seanhalle@28
|
215 Vthread__end_fn_singleton( int32 singletonID, SlaveVP *animSlv );
|
|
seanhalle@27
|
216
|
|
seanhalle@27
|
217 void
|
|
seanhalle@28
|
218 Vthread__start_data_singleton( VthdSingleton *singelton, SlaveVP *animSlv );
|
|
seanhalle@27
|
219
|
|
seanhalle@27
|
220 void
|
|
seanhalle@28
|
221 Vthread__end_data_singleton( VthdSingleton *singleton, SlaveVP *animSlv );
|
|
seanhalle@27
|
222
|
|
seanhalle@27
|
223 void
|
|
seanhalle@28
|
224 Vthread__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
|
|
seanhalle@28
|
225 void *data, SlaveVP *animSlv );
|
|
seanhalle@27
|
226
|
|
seanhalle@27
|
227 void
|
|
seanhalle@28
|
228 Vthread__start_transaction( int32 transactionID, SlaveVP *animSlv );
|
|
seanhalle@27
|
229
|
|
seanhalle@27
|
230 void
|
|
seanhalle@28
|
231 Vthread__end_transaction( int32 transactionID, SlaveVP *animSlv );
|
|
seanhalle@27
|
232
|
|
seanhalle@27
|
233
|
|
seanhalle@27
|
234
|
|
seanhalle@27
|
235 //========================= Internal use only =============================
|
|
seanhalle@27
|
236 inline void
|
|
seanhalle@28
|
237 Vthread__Request_Handler( SlaveVP *requestingSlv, void *_semEnv );
|
|
seanhalle@27
|
238
|
|
seanhalle@27
|
239 inline SlaveVP *
|
|
seanhalle@28
|
240 Vthread__schedule_slaveVP( void *_semEnv, int coreNum );
|
|
seanhalle@27
|
241
|
|
seanhalle@27
|
242 //=======================
|
|
seanhalle@27
|
243 inline void
|
|
seanhalle@28
|
244 Vthread__free_semantic_request( VthdSemReq *semReq );
|
|
seanhalle@27
|
245
|
|
seanhalle@27
|
246 //=======================
|
|
seanhalle@27
|
247
|
|
seanhalle@27
|
248 void *
|
|
seanhalle@28
|
249 Vthread__malloc( size_t sizeToMalloc, SlaveVP *animSlv );
|
|
seanhalle@27
|
250
|
|
seanhalle@27
|
251 void
|
|
seanhalle@28
|
252 Vthread__init();
|
|
seanhalle@27
|
253
|
|
seanhalle@27
|
254 void
|
|
seanhalle@28
|
255 Vthread__cleanup_after_shutdown();
|
|
seanhalle@27
|
256
|
|
seanhalle@27
|
257 void inline
|
|
seanhalle@28
|
258 resume_slaveVP( SlaveVP *procr, VthdSemEnv *semEnv );
|
|
seanhalle@27
|
259
|
|
seanhalle@28
|
260 #endif /* _Vthread_H */
|
|
seanhalle@27
|
261
|