annotate VMS.h @ 234:0ee1a3c8972d

Merged Nina's fix of assembly with Sean's comments and cleanup
author Some Random Person <seanhalle@yahoo.com>
date Fri, 16 Mar 2012 10:43:15 -0700
parents a0ac58d8201c 125f0f90a0d3
children ecbf6992dab4
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@233 32 typedef unsigned long long TSCount;
seanhalle@208 33
seanhalle@208 34 typedef struct _SchedSlot SchedSlot;
seanhalle@208 35 typedef struct _VMSReqst VMSReqst;
seanhalle@208 36 typedef struct _SlaveVP SlaveVP;
seanhalle@208 37 typedef struct _MasterVP MasterVP;
seanhalle@208 38 typedef struct _IntervalProbe IntervalProbe;
seanhalle@208 39
seanhalle@208 40
seanhalle@230 41 typedef SlaveVP *(*SlaveAssigner) ( void *, SchedSlot*); //semEnv, slot for HW info
seanhalle@223 42 typedef void (*RequestHandler) ( SlaveVP *, void * ); //prWReqst, semEnv
seanhalle@223 43 typedef void (*TopLevelFnPtr) ( void *, SlaveVP * ); //initData, animSlv
seanhalle@223 44 typedef void TopLevelFn ( void *, SlaveVP * ); //initData, animSlv
seanhalle@223 45 typedef void (*ResumeSlvFnPtr) ( SlaveVP *, void * );
nengel@228 46 //=========== MEASUREMENT STUFF ==========
nengel@228 47 MEAS__Insert_Counter_Handler
nengel@228 48 //========================================
seanhalle@209 49
seanhalle@209 50 //============================ HW Dependent Fns ================================
seanhalle@209 51
seanhalle@216 52 #include "Hardware_Dependent/VMS__HW_measurement.h"
seanhalle@216 53 #include "Hardware_Dependent/VMS__primitives.h"
seanhalle@208 54
seanhalle@208 55
seanhalle@208 56 //============= Request Related ===========
seanhalle@208 57 //
seanhalle@208 58
seanhalle@208 59 enum VMSReqstType //avoid starting enums at 0, for debug reasons
seanhalle@208 60 {
seanhalle@208 61 semantic = 1,
seanhalle@208 62 createReq,
seanhalle@208 63 dissipate,
seanhalle@208 64 VMSSemantic //goes with VMSSemReqst below
seanhalle@208 65 };
seanhalle@208 66
seanhalle@208 67 struct _VMSReqst
seanhalle@208 68 {
seanhalle@208 69 enum VMSReqstType reqType;//used for dissipate and in future for IO requests
seanhalle@208 70 void *semReqData;
seanhalle@208 71
seanhalle@208 72 VMSReqst *nextReqst;
seanhalle@208 73 };
seanhalle@208 74 //VMSReqst
seanhalle@208 75
seanhalle@208 76 enum VMSSemReqstType //These are equivalent to semantic requests, but for
seanhalle@208 77 { // VMS's services available directly to app, like OS
seanhalle@208 78 createProbe = 1, // and probe services -- like a VMS-wide built-in lang
seanhalle@208 79 openFile,
seanhalle@208 80 otherIO
seanhalle@208 81 };
seanhalle@208 82
seanhalle@208 83 typedef struct
seanhalle@208 84 { enum VMSSemReqstType reqType;
seanhalle@209 85 SlaveVP *requestingSlv;
seanhalle@208 86 char *nameStr; //for create probe
seanhalle@208 87 }
seanhalle@208 88 VMSSemReq;
seanhalle@208 89
seanhalle@208 90
seanhalle@208 91 //==================== Core data structures ===================
seanhalle@208 92
seanhalle@231 93 typedef struct
seanhalle@231 94 {
seanhalle@231 95 //for future expansion
seanhalle@231 96 }
seanhalle@231 97 SlotPerfInfo;
seanhalle@231 98
seanhalle@208 99 struct _SchedSlot
seanhalle@208 100 {
seanhalle@230 101 int workIsDone;
seanhalle@230 102 int needsSlaveAssigned;
seanhalle@230 103 SlaveVP *slaveAssignedToSlot;
seanhalle@230 104
seanhalle@230 105 int slotIdx; //needed by Holistic Model's data gathering
seanhalle@230 106 int coreOfSlot;
seanhalle@230 107 SlotPerfInfo *perfInfo; //used by assigner to pick best slave for core
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@233 117 /*This structure embodies the state of a slaveVP. It is reused for masterVP
seanhalle@233 118 * and shutdownVPs.
seanhalle@208 119 */
seanhalle@208 120 struct _SlaveVP
seanhalle@233 121 { //The offsets of these fields are hard-coded into assembly
seanhalle@233 122 void *stackPtr; //save the core's stack ptr when suspend
seanhalle@233 123 void *framePtr; //save core's frame ptr when suspend
seanhalle@233 124 void *resumeInstrPtr; //save core's program-counter when suspend
seanhalle@216 125 void *coreCtlrFramePtr; //restore before jmp back to core controller
seanhalle@216 126 void *coreCtlrStackPtr; //restore before jmp back to core controller
seanhalle@233 127
seanhalle@233 128 //============ below this, no fields are used in asm =============
seanhalle@233 129 int slaveID; //each slave given a globally unique ID
seanhalle@233 130 int coreAnimatedBy;
seanhalle@233 131 void *startOfStack; //used to free, and to point slave to Fn
seanhalle@233 132
seanhalle@233 133 //for comm -- between master and coreCtlr & btwn wrapper lib and plugin
seanhalle@233 134 SchedSlot *schedSlotAssignedTo;
seanhalle@233 135 VMSReqst *requests; //wrapper lib puts in requests, plugin takes out
seanhalle@233 136 void *dataRetFromReq;//Return vals from plugin to Wrapper Lib
seanhalle@208 137
seanhalle@233 138 //Slave used as carrier for data
seanhalle@233 139 void *semanticData; //Lang saves lang-specific things in slave here
seanhalle@208 140
seanhalle@208 141 //=========== MEASUREMENT STUFF ==========
seanhalle@209 142 MEAS__Insert_Meas_Fields_into_Slave;
seanhalle@208 143 //========================================
seanhalle@208 144
nengel@228 145 enum VPtype type;
nengel@228 146 int numTimesAssigned;
nengel@228 147
nengel@228 148 float64 createPtInSecs; //have space but don't use on some configs
seanhalle@208 149 };
seanhalle@208 150 //SlaveVP
seanhalle@208 151
seanhalle@233 152
seanhalle@233 153 /* The one and only global variable, holds many odds and ends
seanhalle@208 154 */
seanhalle@208 155 typedef struct
seanhalle@230 156 { //The offsets of these fields are hard-coded into assembly
seanhalle@226 157 void *coreCtlrReturnPt; //offset of field used in asm
seanhalle@226 158 int32 masterLock __align_to_cacheline__; //used in asm
seanhalle@226 159
seanhalle@233 160 //============ below this, no fields are used in asm =============
seanhalle@230 161
seanhalle@230 162 //Basic VMS infrastructure
seanhalle@230 163 SlaveVP **masterVPs;
seanhalle@230 164 SchedSlot ***allSchedSlots;
seanhalle@230 165
seanhalle@230 166 //plugin related
seanhalle@225 167 SlaveAssigner slaveAssigner;
seanhalle@208 168 RequestHandler requestHandler;
seanhalle@230 169 void *semanticEnv;
seanhalle@208 170
seanhalle@230 171 //Slave creation
seanhalle@230 172 int32 numSlavesCreated; //gives ordering to processor creation
seanhalle@230 173 int32 numSlavesAlive; //used to detect fail-safe shutdown
seanhalle@208 174
seanhalle@230 175 //Initialization related
seanhalle@230 176 int32 setupComplete; //use while starting up coreCtlr
seanhalle@230 177
seanhalle@230 178 //Memory management related
seanhalle@223 179 MallocArrays *freeLists;
seanhalle@230 180 int32 amtOfOutstandingMem;//total currently allocated
seanhalle@232 181
seanhalle@208 182 //=========== MEASUREMENT STUFF =============
seanhalle@208 183 IntervalProbe **intervalProbes;
seanhalle@208 184 PrivDynArrayInfo *dynIntervalProbesInfo;
seanhalle@208 185 HashTable *probeNameHashTbl;
seanhalle@208 186 int32 masterCreateProbeID;
seanhalle@230 187 float64 createPtInSecs; //real-clock time VMS initialized
seanhalle@208 188 Histogram **measHists;
seanhalle@208 189 PrivDynArrayInfo *measHistsInfo;
seanhalle@209 190 MEAS__Insert_Susp_Meas_Fields_into_MasterEnv;
seanhalle@209 191 MEAS__Insert_Master_Meas_Fields_into_MasterEnv;
seanhalle@209 192 MEAS__Insert_Master_Lock_Meas_Fields_into_MasterEnv;
seanhalle@209 193 MEAS__Insert_Malloc_Meas_Fields_into_MasterEnv;
seanhalle@209 194 MEAS__Insert_Plugin_Meas_Fields_into_MasterEnv;
seanhalle@209 195 MEAS__Insert_System_Meas_Fields_into_MasterEnv;
nengel@228 196 MEAS__Insert_Counter_Meas_Fields_into_MasterEnv;
seanhalle@208 197 //==========================================
seanhalle@208 198 }
seanhalle@208 199 MasterEnv;
seanhalle@208 200
seanhalle@208 201 //========================= Extra Stuff Data Strucs =======================
seanhalle@208 202 typedef struct
seanhalle@208 203 {
seanhalle@208 204
seanhalle@208 205 }
seanhalle@208 206 VMSExcp;
seanhalle@208 207
seanhalle@208 208 //======================= OS Thread related ===============================
seanhalle@208 209
seanhalle@216 210 void * coreController( void *paramsIn ); //standard PThreads fn prototype
seanhalle@216 211 void * coreCtlr_Seq( void *paramsIn ); //standard PThreads fn prototype
seanhalle@230 212 void animationMaster( void *initData, SlaveVP *masterVP );
seanhalle@208 213
seanhalle@208 214
seanhalle@208 215 typedef struct
seanhalle@208 216 {
seanhalle@208 217 void *endThdPt;
seanhalle@208 218 unsigned int coreNum;
seanhalle@208 219 }
seanhalle@208 220 ThdParams;
seanhalle@208 221
seanhalle@209 222 //============================= Global Vars ================================
seanhalle@209 223
seanhalle@215 224 volatile MasterEnv *_VMSMasterEnv __align_to_cacheline__;
seanhalle@215 225
seanhalle@233 226 //these are global, but only used for startup and shutdown
seanhalle@222 227 pthread_t coreCtlrThdHandles[ NUM_CORES ]; //pthread's virt-procr state
seanhalle@216 228 ThdParams *coreCtlrThdParams [ NUM_CORES ];
seanhalle@222 229
seanhalle@222 230 pthread_mutex_t suspendLock;
seanhalle@222 231 pthread_cond_t suspendCond;
seanhalle@208 232
seanhalle@208 233 //========================= Function Prototypes ===========================
seanhalle@233 234 /* MEANING OF WL PI SS int VMSOS
seanhalle@209 235 * These indicate which places the function is safe to use. They stand for:
seanhalle@233 236 *
seanhalle@233 237 * WL Wrapper Library -- wrapper lib code should only use these
seanhalle@233 238 * PI Plugin -- plugin code should only use these
seanhalle@233 239 * SS Startup and Shutdown -- designates these relate to startup & shutdown
seanhalle@233 240 * int internal to VMS -- should not be used in wrapper lib or plugin
seanhalle@233 241 * VMSOS means "OS functions for applications to use"
seanhalle@233 242 *
seanhalle@233 243 * VMS_int__ functions touch internal VMS data structs and are only safe
seanhalle@233 244 * to be used inside the master lock. However, occasionally, they appear
seanhalle@233 245 * in wrapper-lib or plugin code. In those cases, very careful analysis
seanhalle@233 246 * has been done to be sure no concurrency issues could arise.
seanhalle@233 247 *
seanhalle@233 248 * VMS_WL__ functions are all safe for use outside the master lock.
seanhalle@233 249 *
seanhalle@233 250 * VMSOS are only safe for applications to use -- they're like a second
seanhalle@233 251 * language mixed in -- but they can't be used inside plugin code, and
seanhalle@233 252 * aren't meant for use in wrapper libraries, because they are themselves
seanhalle@233 253 * wrapper-library calls!
seanhalle@209 254 */
seanhalle@233 255 //========== Startup and shutdown ==========
seanhalle@208 256 void
seanhalle@209 257 VMS_SS__init();
seanhalle@208 258
seanhalle@208 259 void
seanhalle@209 260 VMS_SS__start_the_work_then_wait_until_done();
seanhalle@208 261
nengel@228 262 SlaveVP*
nengel@228 263 VMS_SS__create_shutdown_slave();
nengel@228 264
seanhalle@208 265 void
seanhalle@209 266 VMS_SS__shutdown();
seanhalle@208 267
seanhalle@208 268 void
seanhalle@209 269 VMS_SS__cleanup_at_end_of_shutdown();
seanhalle@208 270
seanhalle@208 271
seanhalle@208 272 //============== ===============
seanhalle@208 273
seanhalle@208 274 inline SlaveVP *
seanhalle@209 275 VMS_int__create_slaveVP( TopLevelFnPtr fnPtr, void *dataParam );
seanhalle@209 276 #define VMS_PI__create_slaveVP VMS_int__create_slaveVP
seanhalle@209 277 #define VMS_WL__create_slaveVP VMS_int__create_slaveVP
seanhalle@208 278
seanhalle@210 279 //Use this to create processor inside entry point & other places outside
seanhalle@210 280 // the VMS system boundary (IE, don't animate with a SlaveVP or MasterVP)
seanhalle@210 281 SlaveVP *
seanhalle@210 282 VMS_ext__create_slaveVP( TopLevelFnPtr fnPtr, void *dataParam );
seanhalle@210 283
seanhalle@210 284 inline SlaveVP *
seanhalle@210 285 VMS_int__create_slaveVP_helper( SlaveVP *newSlv, TopLevelFnPtr fnPtr,
seanhalle@210 286 void *dataParam, void *stackLocs );
seanhalle@210 287
seanhalle@208 288 inline void
seanhalle@209 289 VMS_int__point_slaveVP_to_Fn( SlaveVP *slaveVP, TopLevelFnPtr fnPtr,
seanhalle@219 290 void *dataParam);
seanhalle@208 291
seanhalle@208 292 void
seanhalle@210 293 VMS_int__dissipate_slaveVP( SlaveVP *slaveToDissipate );
seanhalle@210 294 #define VMS_PI__dissipate_slaveVP VMS_int__dissipate_slaveVP
seanhalle@210 295 //WL: dissipate a SlaveVP by sending a request
seanhalle@208 296
seanhalle@208 297 void
seanhalle@209 298 VMS_ext__dissipate_slaveVP( SlaveVP *slaveToDissipate );
seanhalle@208 299
seanhalle@208 300 void
seanhalle@209 301 VMS_int__throw_exception( char *msgStr, SlaveVP *reqstSlv, VMSExcp *excpData );
seanhalle@209 302 #define VMS_PI__throw_exception VMS_int__throw_exception
seanhalle@209 303 #define VMS_WL__throw_exception VMS_int__throw_exception
seanhalle@208 304
seanhalle@208 305 void *
seanhalle@209 306 VMS_int__give_sem_env_for( SlaveVP *animSlv );
seanhalle@209 307 #define VMS_PI__give_sem_env_for VMS_int__give_sem_env_for
seanhalle@209 308 #define VMS_SS__give_sem_env_for VMS_int__give_sem_env_for
seanhalle@209 309 //No WL version -- not safe! if use in WL, be sure data rd & wr is stable
seanhalle@208 310
seanhalle@208 311 //============== Request Related ===============
seanhalle@208 312
seanhalle@208 313 void
seanhalle@209 314 VMS_int__suspend_slaveVP_and_send_req( SlaveVP *callingSlv );
seanhalle@208 315
seanhalle@208 316 inline void
seanhalle@209 317 VMS_WL__add_sem_request_in_mallocd_VMSReqst( void *semReqData, SlaveVP *callingSlv );
seanhalle@208 318
seanhalle@208 319 inline void
seanhalle@209 320 VMS_WL__send_sem_request( void *semReqData, SlaveVP *callingSlv );
seanhalle@208 321
seanhalle@208 322 void
seanhalle@209 323 VMS_WL__send_create_slaveVP_req( void *semReqData, SlaveVP *reqstingSlv );
seanhalle@208 324
seanhalle@208 325 void inline
seanhalle@208 326 VMS_WL__send_dissipate_req( SlaveVP *prToDissipate );
seanhalle@208 327
seanhalle@208 328 inline void
seanhalle@209 329 VMS_WL__send_VMSSem_request( void *semReqData, SlaveVP *callingSlv );
seanhalle@208 330
seanhalle@208 331 VMSReqst *
seanhalle@209 332 VMS_PI__take_next_request_out_of( SlaveVP *slaveWithReq );
seanhalle@208 333
seanhalle@208 334 inline void *
seanhalle@208 335 VMS_PI__take_sem_reqst_from( VMSReqst *req );
seanhalle@208 336
seanhalle@208 337 void inline
seanhalle@209 338 VMS_PI__handle_VMSSemReq( VMSReqst *req, SlaveVP *requestingSlv, void *semEnv,
seanhalle@209 339 ResumeSlvFnPtr resumeSlvFnPtr );
seanhalle@208 340
seanhalle@208 341 //======================== MEASUREMENT ======================
seanhalle@208 342 uint64
seanhalle@208 343 VMS_WL__give_num_plugin_cycles();
seanhalle@208 344 uint32
seanhalle@208 345 VMS_WL__give_num_plugin_animations();
seanhalle@208 346
seanhalle@208 347
seanhalle@210 348 //========================= Utilities =======================
seanhalle@210 349 inline char *
seanhalle@210 350 VMS_int__strDup( char *str );
seanhalle@208 351
seanhalle@210 352
seanhalle@210 353 //========================= Probes =======================
seanhalle@223 354 #include "Services_Offered_by_VMS/Measurement_and_Stats/probes.h"
seanhalle@210 355
seanhalle@210 356 //================================================
seanhalle@208 357 #endif /* _VMS_H */
seanhalle@208 358