| 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@27
|
9 #ifndef _VPThread_H
|
|
seanhalle@27
|
10 #define _VPThread_H
|
|
seanhalle@27
|
11
|
|
seanhalle@27
|
12 #include "VMS_impl/VMS.h"
|
|
seanhalle@27
|
13 #include "C_Libraries/Queue_impl/PrivateQueue.h"
|
|
seanhalle@27
|
14 #include "C_Libraries/DynArray/DynArray.h"
|
|
seanhalle@27
|
15
|
|
seanhalle@27
|
16
|
|
seanhalle@27
|
17 /*This header defines everything specific to the VPThread semantic plug-in
|
|
seanhalle@27
|
18 */
|
|
seanhalle@27
|
19
|
|
seanhalle@27
|
20
|
|
seanhalle@27
|
21 //===========================================================================
|
|
seanhalle@27
|
22 //turn on the counter measurements of language overhead -- comment to turn off
|
|
seanhalle@27
|
23 #define MEAS__TURN_ON_LANG_MEAS
|
|
seanhalle@27
|
24
|
|
seanhalle@27
|
25 #define INIT_NUM_MUTEX 10000
|
|
seanhalle@27
|
26 #define INIT_NUM_COND 10000
|
|
seanhalle@27
|
27
|
|
seanhalle@27
|
28 #define NUM_STRUCS_IN_SEM_ENV 1000
|
|
seanhalle@27
|
29 //===========================================================================
|
|
seanhalle@27
|
30
|
|
seanhalle@27
|
31 //===========================================================================
|
|
seanhalle@27
|
32 typedef struct _VPThreadSemReq VPThdSemReq;
|
|
seanhalle@27
|
33 typedef void (*PtrToAtomicFn ) ( void * ); //executed atomically in master
|
|
seanhalle@27
|
34 //===========================================================================
|
|
seanhalle@27
|
35
|
|
seanhalle@27
|
36
|
|
seanhalle@27
|
37 /*WARNING: assembly hard-codes position of endInstrAddr as first field
|
|
seanhalle@27
|
38 */
|
|
seanhalle@27
|
39 typedef struct
|
|
seanhalle@27
|
40 {
|
|
seanhalle@27
|
41 void *endInstrAddr;
|
|
seanhalle@27
|
42 int32 hasBeenStarted;
|
|
seanhalle@27
|
43 int32 hasFinished;
|
|
seanhalle@27
|
44 PrivQueueStruc *waitQ;
|
|
seanhalle@27
|
45 }
|
|
seanhalle@27
|
46 VPThdSingleton;
|
|
seanhalle@27
|
47
|
|
seanhalle@27
|
48 /*Semantic layer-specific data sent inside a request from lib called in app
|
|
seanhalle@27
|
49 * to request handler called in MasterLoop
|
|
seanhalle@27
|
50 */
|
|
seanhalle@27
|
51 enum VPThreadReqType
|
|
seanhalle@27
|
52 {
|
|
seanhalle@27
|
53 make_mutex = 1,
|
|
seanhalle@27
|
54 mutex_lock,
|
|
seanhalle@27
|
55 mutex_unlock,
|
|
seanhalle@27
|
56 make_cond,
|
|
seanhalle@27
|
57 cond_wait,
|
|
seanhalle@27
|
58 cond_signal,
|
|
seanhalle@27
|
59 make_procr,
|
|
seanhalle@27
|
60 malloc_req,
|
|
seanhalle@27
|
61 free_req,
|
|
seanhalle@27
|
62 singleton_fn_start,
|
|
seanhalle@27
|
63 singleton_fn_end,
|
|
seanhalle@27
|
64 singleton_data_start,
|
|
seanhalle@27
|
65 singleton_data_end,
|
|
seanhalle@27
|
66 atomic,
|
|
seanhalle@27
|
67 trans_start,
|
|
seanhalle@27
|
68 trans_end
|
|
seanhalle@27
|
69 };
|
|
seanhalle@27
|
70
|
|
seanhalle@27
|
71 struct _VPThreadSemReq
|
|
seanhalle@27
|
72 { enum VPThreadReqType reqType;
|
|
seanhalle@27
|
73 SlaveVP *requestingVP;
|
|
seanhalle@27
|
74 int32 mutexIdx;
|
|
seanhalle@27
|
75 int32 condIdx;
|
|
seanhalle@27
|
76
|
|
seanhalle@27
|
77 void *initData;
|
|
seanhalle@27
|
78 TopLevelFnPtr fnPtr;
|
|
seanhalle@27
|
79 int32 coreToScheduleOnto;
|
|
seanhalle@27
|
80
|
|
seanhalle@27
|
81 size_t sizeToMalloc;
|
|
seanhalle@27
|
82 void *ptrToFree;
|
|
seanhalle@27
|
83
|
|
seanhalle@27
|
84 int32 singletonID;
|
|
seanhalle@27
|
85 VPThdSingleton **singletonPtrAddr;
|
|
seanhalle@27
|
86
|
|
seanhalle@27
|
87 PtrToAtomicFn fnToExecInMaster;
|
|
seanhalle@27
|
88 void *dataForFn;
|
|
seanhalle@27
|
89
|
|
seanhalle@27
|
90 int32 transID;
|
|
seanhalle@27
|
91 }
|
|
seanhalle@27
|
92 /* VPThreadSemReq */;
|
|
seanhalle@27
|
93
|
|
seanhalle@27
|
94
|
|
seanhalle@27
|
95 typedef struct
|
|
seanhalle@27
|
96 {
|
|
seanhalle@27
|
97 SlaveVP *VPCurrentlyExecuting;
|
|
seanhalle@27
|
98 PrivQueueStruc *waitingVPQ;
|
|
seanhalle@27
|
99 }
|
|
seanhalle@27
|
100 VPThdTrans;
|
|
seanhalle@27
|
101
|
|
seanhalle@27
|
102
|
|
seanhalle@27
|
103 typedef struct
|
|
seanhalle@27
|
104 {
|
|
seanhalle@27
|
105 int32 mutexIdx;
|
|
seanhalle@27
|
106 SlaveVP *holderOfLock;
|
|
seanhalle@27
|
107 PrivQueueStruc *waitingQueue;
|
|
seanhalle@27
|
108 }
|
|
seanhalle@27
|
109 VPThdMutex;
|
|
seanhalle@27
|
110
|
|
seanhalle@27
|
111
|
|
seanhalle@27
|
112 typedef struct
|
|
seanhalle@27
|
113 {
|
|
seanhalle@27
|
114 int32 condIdx;
|
|
seanhalle@27
|
115 PrivQueueStruc *waitingQueue;
|
|
seanhalle@27
|
116 VPThdMutex *partnerMutex;
|
|
seanhalle@27
|
117 }
|
|
seanhalle@27
|
118 VPThdCond;
|
|
seanhalle@27
|
119
|
|
seanhalle@27
|
120 typedef struct _TransListElem TransListElem;
|
|
seanhalle@27
|
121 struct _TransListElem
|
|
seanhalle@27
|
122 {
|
|
seanhalle@27
|
123 int32 transID;
|
|
seanhalle@27
|
124 TransListElem *nextTrans;
|
|
seanhalle@27
|
125 };
|
|
seanhalle@27
|
126 //TransListElem
|
|
seanhalle@27
|
127
|
|
seanhalle@27
|
128 typedef struct
|
|
seanhalle@27
|
129 {
|
|
seanhalle@27
|
130 int32 highestTransEntered;
|
|
seanhalle@27
|
131 TransListElem *lastTransEntered;
|
|
seanhalle@27
|
132 }
|
|
seanhalle@27
|
133 VPThdSemData;
|
|
seanhalle@27
|
134
|
|
seanhalle@27
|
135
|
|
seanhalle@27
|
136 typedef struct
|
|
seanhalle@27
|
137 {
|
|
seanhalle@27
|
138 //Standard stuff will be in most every semantic env
|
|
seanhalle@27
|
139 PrivQueueStruc **readyVPQs;
|
|
seanhalle@27
|
140 int32 numVirtVP;
|
|
seanhalle@27
|
141 int32 nextCoreToGetNewVP;
|
|
seanhalle@27
|
142 int32 primitiveStartTime;
|
|
seanhalle@27
|
143
|
|
seanhalle@27
|
144 //Specific to this semantic layer
|
|
seanhalle@27
|
145 VPThdMutex **mutexDynArray;
|
|
seanhalle@27
|
146 PrivDynArrayInfo *mutexDynArrayInfo;
|
|
seanhalle@27
|
147
|
|
seanhalle@27
|
148 VPThdCond **condDynArray;
|
|
seanhalle@27
|
149 PrivDynArrayInfo *condDynArrayInfo;
|
|
seanhalle@27
|
150
|
|
seanhalle@27
|
151 void *applicationGlobals;
|
|
seanhalle@27
|
152
|
|
seanhalle@27
|
153 //fix limit on num with dynArray
|
|
seanhalle@27
|
154 VPThdSingleton fnSingletons[NUM_STRUCS_IN_SEM_ENV];
|
|
seanhalle@27
|
155
|
|
seanhalle@27
|
156 VPThdTrans transactionStrucs[NUM_STRUCS_IN_SEM_ENV];
|
|
seanhalle@27
|
157 }
|
|
seanhalle@27
|
158 VPThdSemEnv;
|
|
seanhalle@27
|
159
|
|
seanhalle@27
|
160
|
|
seanhalle@27
|
161 //===========================================================================
|
|
seanhalle@27
|
162
|
|
seanhalle@27
|
163 inline void
|
|
seanhalle@27
|
164 VPThread__create_seed_procr_and_do_work( TopLevelFnPtr fn, void *initData );
|
|
seanhalle@27
|
165
|
|
seanhalle@27
|
166 //=======================
|
|
seanhalle@27
|
167
|
|
seanhalle@27
|
168 inline SlaveVP *
|
|
seanhalle@27
|
169 VPThread__create_thread( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@27
|
170 SlaveVP *creatingVP );
|
|
seanhalle@27
|
171
|
|
seanhalle@27
|
172 inline SlaveVP *
|
|
seanhalle@27
|
173 VPThread__create_thread_with_affinity( TopLevelFnPtr fnPtr, void *initData,
|
|
seanhalle@27
|
174 SlaveVP *creatingVP, int32 coreToScheduleOnto );
|
|
seanhalle@27
|
175
|
|
seanhalle@27
|
176 inline void
|
|
seanhalle@27
|
177 VPThread__dissipate_thread( SlaveVP *procrToDissipate );
|
|
seanhalle@27
|
178
|
|
seanhalle@27
|
179 //=======================
|
|
seanhalle@27
|
180 inline void
|
|
seanhalle@27
|
181 VPThread__set_globals_to( void *globals );
|
|
seanhalle@27
|
182
|
|
seanhalle@27
|
183 inline void *
|
|
seanhalle@27
|
184 VPThread__give_globals();
|
|
seanhalle@27
|
185
|
|
seanhalle@27
|
186 //=======================
|
|
seanhalle@27
|
187 inline int32
|
|
seanhalle@27
|
188 VPThread__make_mutex( SlaveVP *animVP );
|
|
seanhalle@27
|
189
|
|
seanhalle@27
|
190 inline void
|
|
seanhalle@27
|
191 VPThread__mutex_lock( int32 mutexIdx, SlaveVP *acquiringVP );
|
|
seanhalle@27
|
192
|
|
seanhalle@27
|
193 inline void
|
|
seanhalle@27
|
194 VPThread__mutex_unlock( int32 mutexIdx, SlaveVP *releasingVP );
|
|
seanhalle@27
|
195
|
|
seanhalle@27
|
196
|
|
seanhalle@27
|
197 //=======================
|
|
seanhalle@27
|
198 inline int32
|
|
seanhalle@27
|
199 VPThread__make_cond( int32 ownedMutexIdx, SlaveVP *animPr);
|
|
seanhalle@27
|
200
|
|
seanhalle@27
|
201 inline void
|
|
seanhalle@27
|
202 VPThread__cond_wait( int32 condIdx, SlaveVP *waitingPr);
|
|
seanhalle@27
|
203
|
|
seanhalle@27
|
204 inline void *
|
|
seanhalle@27
|
205 VPThread__cond_signal( int32 condIdx, SlaveVP *signallingVP );
|
|
seanhalle@27
|
206
|
|
seanhalle@27
|
207
|
|
seanhalle@27
|
208 //=======================
|
|
seanhalle@27
|
209 void
|
|
seanhalle@27
|
210 VPThread__start_fn_singleton( int32 singletonID, SlaveVP *animVP );
|
|
seanhalle@27
|
211
|
|
seanhalle@27
|
212 void
|
|
seanhalle@27
|
213 VPThread__end_fn_singleton( int32 singletonID, SlaveVP *animVP );
|
|
seanhalle@27
|
214
|
|
seanhalle@27
|
215 void
|
|
seanhalle@27
|
216 VPThread__start_data_singleton( VPThdSingleton **singeltonAddr, SlaveVP *animVP );
|
|
seanhalle@27
|
217
|
|
seanhalle@27
|
218 void
|
|
seanhalle@27
|
219 VPThread__end_data_singleton( VPThdSingleton **singletonAddr, SlaveVP *animVP );
|
|
seanhalle@27
|
220
|
|
seanhalle@27
|
221 void
|
|
seanhalle@27
|
222 VPThread__animate_short_fn_in_isolation( PtrToAtomicFn ptrToFnToExecInMaster,
|
|
seanhalle@27
|
223 void *data, SlaveVP *animVP );
|
|
seanhalle@27
|
224
|
|
seanhalle@27
|
225 void
|
|
seanhalle@27
|
226 VPThread__start_transaction( int32 transactionID, SlaveVP *animVP );
|
|
seanhalle@27
|
227
|
|
seanhalle@27
|
228 void
|
|
seanhalle@27
|
229 VPThread__end_transaction( int32 transactionID, SlaveVP *animVP );
|
|
seanhalle@27
|
230
|
|
seanhalle@27
|
231
|
|
seanhalle@27
|
232
|
|
seanhalle@27
|
233 //========================= Internal use only =============================
|
|
seanhalle@27
|
234 inline void
|
|
seanhalle@27
|
235 VPThread__Request_Handler( SlaveVP *requestingVP, void *_semEnv );
|
|
seanhalle@27
|
236
|
|
seanhalle@27
|
237 inline SlaveVP *
|
|
seanhalle@27
|
238 VPThread__schedule_virt_procr( void *_semEnv, int coreNum );
|
|
seanhalle@27
|
239
|
|
seanhalle@27
|
240 //=======================
|
|
seanhalle@27
|
241 inline void
|
|
seanhalle@27
|
242 VPThread__free_semantic_request( VPThdSemReq *semReq );
|
|
seanhalle@27
|
243
|
|
seanhalle@27
|
244 //=======================
|
|
seanhalle@27
|
245
|
|
seanhalle@27
|
246 void *
|
|
seanhalle@27
|
247 VPThread__malloc( size_t sizeToMalloc, SlaveVP *animVP );
|
|
seanhalle@27
|
248
|
|
seanhalle@27
|
249 void
|
|
seanhalle@27
|
250 VPThread__init();
|
|
seanhalle@27
|
251
|
|
seanhalle@27
|
252 void
|
|
seanhalle@27
|
253 VPThread__cleanup_after_shutdown();
|
|
seanhalle@27
|
254
|
|
seanhalle@27
|
255 void inline
|
|
seanhalle@27
|
256 resume_procr( SlaveVP *procr, VPThdSemEnv *semEnv );
|
|
seanhalle@27
|
257
|
|
seanhalle@27
|
258 #endif /* _VPThread_H */
|
|
seanhalle@27
|
259
|