annotate VMS.h @ 229:5bb234f93cf6

fix master unlock
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Fri, 16 Mar 2012 17:33:44 +0100
parents 5c475c4b7b49
children 0ee1a3c8972d
rev   line source
seanhalle@208 1 /*
seanhalle@208 2 * Copyright 2009 OpenSourceStewardshipFoundation.org
seanhalle@208 3 * Licensed under GNU General Public License version 2
seanhalle@208 4 *
seanhalle@208 5 * Author: seanhalle@yahoo.com
seanhalle@208 6 *
seanhalle@208 7 */
seanhalle@208 8
seanhalle@208 9 #ifndef _VMS_H
seanhalle@208 10 #define _VMS_H
seanhalle@208 11 #define _GNU_SOURCE
seanhalle@208 12
seanhalle@208 13 #include "VMS_primitive_data_types.h"
seanhalle@215 14 #include "DynArray/DynArray.h"
seanhalle@215 15 #include "Hash_impl/PrivateHash.h"
seanhalle@215 16 #include "Histogram/Histogram.h"
seanhalle@215 17 #include "Queue_impl/PrivateQueue.h"
seanhalle@223 18 #include "Services_Offered_by_VMS/Memory_Handling/vmalloc.h"
seanhalle@208 19
seanhalle@208 20 #include <pthread.h>
seanhalle@208 21 #include <sys/time.h>
seanhalle@208 22
seanhalle@208 23 //================= Defines: included from separate files =================
seanhalle@208 24 //
seanhalle@208 25 // Note: ALL defines are in other files, none are in here
seanhalle@208 26 //
seanhalle@223 27 #include "Defines/VMS_defs.h"
seanhalle@208 28
seanhalle@208 29
seanhalle@208 30 //================================ Typedefs =================================
seanhalle@208 31 //
seanhalle@208 32 typedef unsigned long long TSCount;
seanhalle@208 33 typedef union
seanhalle@208 34 { uint32 lowHigh[2];
seanhalle@208 35 uint64 longVal;
seanhalle@208 36 }
seanhalle@208 37 TSCountLowHigh;
seanhalle@208 38
seanhalle@208 39 typedef struct _SchedSlot SchedSlot;
seanhalle@208 40 typedef struct _VMSReqst VMSReqst;
seanhalle@208 41 typedef struct _SlaveVP SlaveVP;
seanhalle@208 42 typedef struct _MasterVP MasterVP;
seanhalle@208 43 typedef struct _IntervalProbe IntervalProbe;
seanhalle@208 44 typedef struct _GateStruc GateStruc;
seanhalle@208 45
seanhalle@208 46
seanhalle@223 47 typedef SlaveVP *(*SlaveAssigner) ( void *, int, SchedSlot *); //semEnv, coreIdx, slot for HW info
seanhalle@223 48 typedef void (*RequestHandler) ( SlaveVP *, void * ); //prWReqst, semEnv
seanhalle@223 49 typedef void (*TopLevelFnPtr) ( void *, SlaveVP * ); //initData, animSlv
seanhalle@223 50 typedef void TopLevelFn ( void *, SlaveVP * ); //initData, animSlv
seanhalle@223 51 typedef void (*ResumeSlvFnPtr) ( SlaveVP *, void * );
nengel@228 52 //=========== MEASUREMENT STUFF ==========
nengel@228 53 MEAS__Insert_Counter_Handler
nengel@228 54 //========================================
seanhalle@209 55
seanhalle@209 56 //============================ HW Dependent Fns ================================
seanhalle@209 57
seanhalle@216 58 #include "Hardware_Dependent/VMS__HW_measurement.h"
seanhalle@216 59 #include "Hardware_Dependent/VMS__primitives.h"
seanhalle@208 60
seanhalle@208 61 //============================= Statistics ==================================
seanhalle@208 62
seanhalle@208 63 inline TSCount getTSCount();
seanhalle@208 64
seanhalle@208 65 //============= Request Related ===========
seanhalle@208 66 //
seanhalle@208 67
seanhalle@208 68 enum VMSReqstType //avoid starting enums at 0, for debug reasons
seanhalle@208 69 {
seanhalle@208 70 semantic = 1,
seanhalle@208 71 createReq,
seanhalle@208 72 dissipate,
seanhalle@208 73 VMSSemantic //goes with VMSSemReqst below
seanhalle@208 74 };
seanhalle@208 75
seanhalle@208 76 struct _VMSReqst
seanhalle@208 77 {
seanhalle@208 78 enum VMSReqstType reqType;//used for dissipate and in future for IO requests
seanhalle@208 79 void *semReqData;
seanhalle@208 80
seanhalle@208 81 VMSReqst *nextReqst;
seanhalle@208 82 };
seanhalle@208 83 //VMSReqst
seanhalle@208 84
seanhalle@208 85 enum VMSSemReqstType //These are equivalent to semantic requests, but for
seanhalle@208 86 { // VMS's services available directly to app, like OS
seanhalle@208 87 createProbe = 1, // and probe services -- like a VMS-wide built-in lang
seanhalle@208 88 openFile,
seanhalle@208 89 otherIO
seanhalle@208 90 };
seanhalle@208 91
seanhalle@208 92 typedef struct
seanhalle@208 93 { enum VMSSemReqstType reqType;
seanhalle@209 94 SlaveVP *requestingSlv;
seanhalle@208 95 char *nameStr; //for create probe
seanhalle@208 96 }
seanhalle@208 97 VMSSemReq;
seanhalle@208 98
seanhalle@208 99
seanhalle@208 100 //==================== Core data structures ===================
seanhalle@208 101
seanhalle@208 102 struct _SchedSlot
seanhalle@208 103 {
seanhalle@223 104 int slotIdx; //needed by Holistic Model's data gathering
seanhalle@208 105 int workIsDone;
seanhalle@209 106 int needsSlaveAssigned;
seanhalle@223 107 SlaveVP *slaveAssignedToSlot;
seanhalle@208 108 };
seanhalle@208 109 //SchedSlot
seanhalle@208 110
nengel@228 111 enum VPtype {
nengel@228 112 Slave = 1, //default
nengel@228 113 Master,
nengel@228 114 Shutdown
nengel@228 115 };
nengel@228 116
seanhalle@209 117 /*WARNING: re-arranging this data structure could cause Slv switching
seanhalle@208 118 * assembly code to fail -- hard-codes offsets of fields
seanhalle@208 119 */
seanhalle@208 120 struct _SlaveVP
seanhalle@215 121 { int slaveID; //each slave given a unique ID
seanhalle@208 122 int coreAnimatedBy;
seanhalle@208 123 void *startOfStack;
seanhalle@208 124 void *stackPtr;
seanhalle@208 125 void *framePtr;
seanhalle@208 126 void *resumeInstrPtr;
seanhalle@208 127
seanhalle@216 128 void *coreCtlrStartPt; //allows proto-runtime to be linked later
seanhalle@216 129 void *coreCtlrFramePtr; //restore before jmp back to core controller
seanhalle@216 130 void *coreCtlrStackPtr; //restore before jmp back to core controller
seanhalle@208 131
seanhalle@208 132 SchedSlot *schedSlot;
seanhalle@208 133 VMSReqst *requests;
seanhalle@208 134
seanhalle@210 135 void *semanticData; //this is live for the life of Slv
seanhalle@210 136 void *dataRetFromReq;//Used to return vals from plugin to Wrapper Lib
seanhalle@208 137
seanhalle@208 138 //=========== MEASUREMENT STUFF ==========
seanhalle@209 139 MEAS__Insert_Meas_Fields_into_Slave;
seanhalle@208 140 //========================================
seanhalle@208 141
nengel@228 142 enum VPtype type;
nengel@228 143 int numTimesAssigned;
nengel@228 144
nengel@228 145 float64 createPtInSecs; //have space but don't use on some configs
seanhalle@208 146 };
seanhalle@208 147 //SlaveVP
seanhalle@208 148
seanhalle@208 149
seanhalle@209 150 /*WARNING: re-arranging this data structure could cause Slv-switching
seanhalle@208 151 * assembly code to fail -- hard-codes offsets of fields
seanhalle@208 152 * (because -O3 messes with things otherwise)
seanhalle@208 153 */
seanhalle@208 154 typedef struct
seanhalle@226 155 { //The offset of these fields is hard-coded into assembly
seanhalle@226 156 void *coreCtlrReturnPt; //offset of field used in asm
seanhalle@226 157 int32 masterLock __align_to_cacheline__; //used in asm
seanhalle@226 158
seanhalle@226 159 //below this, no asm uses the field offsets
seanhalle@225 160 SlaveAssigner slaveAssigner;
seanhalle@208 161 RequestHandler requestHandler;
seanhalle@208 162
seanhalle@208 163 SchedSlot ***allSchedSlots;
seanhalle@210 164 SlaveVP **masterVPs;
seanhalle@208 165
seanhalle@208 166 void *semanticEnv;
seanhalle@208 167 void *OSEventStruc; //for future, when add I/O to BLIS
seanhalle@223 168 MallocArrays *freeLists;
seanhalle@208 169 int32 amtOfOutstandingMem; //total currently allocated
seanhalle@208 170
seanhalle@227 171 int32 setupComplete; //use while starting up coreCtlr
seanhalle@208 172 GateStruc *workStealingGates[ NUM_CORES ]; //concurrent work-steal
seanhalle@208 173 int32 workStealingLock;
seanhalle@208 174
seanhalle@209 175 int32 numSlavesCreated; //gives ordering to processor creation
seanhalle@209 176 int32 numSlavesAlive; //used to detect when to shutdown
seanhalle@208 177
seanhalle@208 178 //=========== MEASUREMENT STUFF =============
seanhalle@208 179 IntervalProbe **intervalProbes;
seanhalle@208 180 PrivDynArrayInfo *dynIntervalProbesInfo;
seanhalle@208 181 HashTable *probeNameHashTbl;
seanhalle@208 182 int32 masterCreateProbeID;
seanhalle@208 183 float64 createPtInSecs;
seanhalle@208 184 Histogram **measHists;
seanhalle@208 185 PrivDynArrayInfo *measHistsInfo;
seanhalle@209 186 MEAS__Insert_Susp_Meas_Fields_into_MasterEnv;
seanhalle@209 187 MEAS__Insert_Master_Meas_Fields_into_MasterEnv;
seanhalle@209 188 MEAS__Insert_Master_Lock_Meas_Fields_into_MasterEnv;
seanhalle@209 189 MEAS__Insert_Malloc_Meas_Fields_into_MasterEnv;
seanhalle@209 190 MEAS__Insert_Plugin_Meas_Fields_into_MasterEnv;
seanhalle@209 191 MEAS__Insert_System_Meas_Fields_into_MasterEnv;
nengel@228 192 MEAS__Insert_Counter_Meas_Fields_into_MasterEnv;
seanhalle@208 193 //==========================================
seanhalle@208 194 }
seanhalle@208 195 MasterEnv;
seanhalle@208 196
seanhalle@208 197 //========================= Extra Stuff Data Strucs =======================
seanhalle@208 198 typedef struct
seanhalle@208 199 {
seanhalle@208 200
seanhalle@208 201 }
seanhalle@208 202 VMSExcp;
seanhalle@208 203
seanhalle@208 204 struct _GateStruc
seanhalle@208 205 {
seanhalle@208 206 int32 gateClosed;
seanhalle@208 207 int32 preGateProgress;
seanhalle@208 208 int32 waitProgress;
seanhalle@208 209 int32 exitProgress;
seanhalle@208 210 };
seanhalle@208 211 //GateStruc
seanhalle@208 212
seanhalle@208 213 //======================= OS Thread related ===============================
seanhalle@208 214
seanhalle@216 215 void * coreController( void *paramsIn ); //standard PThreads fn prototype
seanhalle@216 216 void * coreCtlr_Seq( void *paramsIn ); //standard PThreads fn prototype
seanhalle@222 217 void schedulingMaster( void *initData, SlaveVP *masterVP );
seanhalle@208 218
seanhalle@208 219
seanhalle@208 220 typedef struct
seanhalle@208 221 {
seanhalle@208 222 void *endThdPt;
seanhalle@208 223 unsigned int coreNum;
seanhalle@208 224 }
seanhalle@208 225 ThdParams;
seanhalle@208 226
seanhalle@209 227 //============================= Global Vars ================================
seanhalle@209 228
seanhalle@215 229 volatile MasterEnv *_VMSMasterEnv __align_to_cacheline__;
seanhalle@215 230
seanhalle@222 231 pthread_t coreCtlrThdHandles[ NUM_CORES ]; //pthread's virt-procr state
seanhalle@216 232 ThdParams *coreCtlrThdParams [ NUM_CORES ];
seanhalle@222 233
seanhalle@222 234 pthread_mutex_t suspendLock;
seanhalle@222 235 pthread_cond_t suspendCond;
seanhalle@208 236
seanhalle@208 237 //========================= Function Prototypes ===========================
seanhalle@208 238
seanhalle@209 239 /* MEANING OF WL PI SS int
seanhalle@209 240 * These indicate which places the function is safe to use. They stand for:
seanhalle@209 241 * WL: Wrapper Library
seanhalle@209 242 * PI: Plugin
seanhalle@209 243 * SS: Startup and Shutdown
seanhalle@209 244 * int: internal to the VMS implementation
seanhalle@209 245 */
seanhalle@208 246
seanhalle@208 247 //========== Setup and shutdown ==========
seanhalle@208 248 void
seanhalle@209 249 VMS_SS__init();
seanhalle@208 250
seanhalle@208 251 void
seanhalle@209 252 VMS_SS__start_the_work_then_wait_until_done();
seanhalle@208 253
nengel@228 254 SlaveVP*
nengel@228 255 VMS_SS__create_shutdown_slave();
nengel@228 256
seanhalle@208 257 void
seanhalle@209 258 VMS_SS__shutdown();
seanhalle@208 259
seanhalle@208 260 void
seanhalle@209 261 VMS_SS__cleanup_at_end_of_shutdown();
seanhalle@208 262
seanhalle@208 263
seanhalle@208 264 //============== ===============
seanhalle@208 265
seanhalle@208 266 inline SlaveVP *
seanhalle@209 267 VMS_int__create_slaveVP( TopLevelFnPtr fnPtr, void *dataParam );
seanhalle@209 268 #define VMS_PI__create_slaveVP VMS_int__create_slaveVP
seanhalle@209 269 #define VMS_WL__create_slaveVP VMS_int__create_slaveVP
seanhalle@208 270
seanhalle@210 271 //Use this to create processor inside entry point & other places outside
seanhalle@210 272 // the VMS system boundary (IE, don't animate with a SlaveVP or MasterVP)
seanhalle@210 273 SlaveVP *
seanhalle@210 274 VMS_ext__create_slaveVP( TopLevelFnPtr fnPtr, void *dataParam );
seanhalle@210 275
seanhalle@210 276 inline SlaveVP *
seanhalle@210 277 VMS_int__create_slaveVP_helper( SlaveVP *newSlv, TopLevelFnPtr fnPtr,
seanhalle@210 278 void *dataParam, void *stackLocs );
seanhalle@210 279
seanhalle@208 280 inline void
seanhalle@209 281 VMS_int__point_slaveVP_to_Fn( SlaveVP *slaveVP, TopLevelFnPtr fnPtr,
seanhalle@219 282 void *dataParam);
seanhalle@208 283
seanhalle@208 284 void
seanhalle@210 285 VMS_int__dissipate_slaveVP( SlaveVP *slaveToDissipate );
seanhalle@210 286 #define VMS_PI__dissipate_slaveVP VMS_int__dissipate_slaveVP
seanhalle@210 287 //WL: dissipate a SlaveVP by sending a request
seanhalle@208 288
seanhalle@208 289 void
seanhalle@209 290 VMS_ext__dissipate_slaveVP( SlaveVP *slaveToDissipate );
seanhalle@208 291
seanhalle@208 292 void
seanhalle@209 293 VMS_int__throw_exception( char *msgStr, SlaveVP *reqstSlv, VMSExcp *excpData );
seanhalle@209 294 #define VMS_PI__throw_exception VMS_int__throw_exception
seanhalle@209 295 #define VMS_WL__throw_exception VMS_int__throw_exception
seanhalle@208 296
seanhalle@208 297 void *
seanhalle@209 298 VMS_int__give_sem_env_for( SlaveVP *animSlv );
seanhalle@209 299 #define VMS_PI__give_sem_env_for VMS_int__give_sem_env_for
seanhalle@209 300 #define VMS_SS__give_sem_env_for VMS_int__give_sem_env_for
seanhalle@209 301 //No WL version -- not safe! if use in WL, be sure data rd & wr is stable
seanhalle@208 302
seanhalle@208 303 //============== Request Related ===============
seanhalle@208 304
seanhalle@208 305 void
seanhalle@209 306 VMS_int__suspend_slaveVP_and_send_req( SlaveVP *callingSlv );
seanhalle@208 307
seanhalle@208 308 inline void
seanhalle@209 309 VMS_WL__add_sem_request_in_mallocd_VMSReqst( void *semReqData, SlaveVP *callingSlv );
seanhalle@208 310
seanhalle@208 311 inline void
seanhalle@209 312 VMS_WL__send_sem_request( void *semReqData, SlaveVP *callingSlv );
seanhalle@208 313
seanhalle@208 314 void
seanhalle@209 315 VMS_WL__send_create_slaveVP_req( void *semReqData, SlaveVP *reqstingSlv );
seanhalle@208 316
seanhalle@208 317 void inline
seanhalle@208 318 VMS_WL__send_dissipate_req( SlaveVP *prToDissipate );
seanhalle@208 319
seanhalle@208 320 inline void
seanhalle@209 321 VMS_WL__send_VMSSem_request( void *semReqData, SlaveVP *callingSlv );
seanhalle@208 322
seanhalle@208 323 VMSReqst *
seanhalle@209 324 VMS_PI__take_next_request_out_of( SlaveVP *slaveWithReq );
seanhalle@208 325
seanhalle@208 326 inline void *
seanhalle@208 327 VMS_PI__take_sem_reqst_from( VMSReqst *req );
seanhalle@208 328
seanhalle@208 329 void inline
seanhalle@209 330 VMS_PI__handle_VMSSemReq( VMSReqst *req, SlaveVP *requestingSlv, void *semEnv,
seanhalle@209 331 ResumeSlvFnPtr resumeSlvFnPtr );
seanhalle@208 332
seanhalle@208 333 //======================== MEASUREMENT ======================
seanhalle@208 334 uint64
seanhalle@208 335 VMS_WL__give_num_plugin_cycles();
seanhalle@208 336 uint32
seanhalle@208 337 VMS_WL__give_num_plugin_animations();
seanhalle@208 338
seanhalle@208 339
seanhalle@210 340 //========================= Utilities =======================
seanhalle@210 341 inline char *
seanhalle@210 342 VMS_int__strDup( char *str );
seanhalle@208 343
seanhalle@210 344
seanhalle@210 345 //========================= Probes =======================
seanhalle@223 346 #include "Services_Offered_by_VMS/Measurement_and_Stats/probes.h"
seanhalle@210 347
seanhalle@210 348 //================================================
seanhalle@208 349 #endif /* _VMS_H */
seanhalle@208 350