annotate Vthread.h @ 29:b94dc57e4455

refactored many files -- chgd names, moved code around -- doesn't compile
author Some Random Person <seanhalle@yahoo.com>
date Wed, 09 May 2012 13:24:19 -0700
parents b3a881f25c5a
children
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