annotate Vthread.h @ 28:b3a881f25c5a

Nearly compiles with in-process common_ancestor vers of VMS
author Some Random Person <seanhalle@yahoo.com>
date Sun, 04 Mar 2012 14:29:42 -0800
parents e5d4d5871ac9
children b94dc57e4455
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