annotate Vthread.h @ 27:e5d4d5871ac9

half-done update to common_ancesor VMS version.. in middle
author Some Random Person <seanhalle@yahoo.com>
date Thu, 01 Mar 2012 13:20:51 -0800
parents
children b3a881f25c5a
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