annotate VMS.h @ 284:039ac4b71fe5

fix sequential so currVP global var gets updated
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Wed, 05 Jun 2013 14:41:48 +0200
parents 67b684afa736
children
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
nengel@263 11
nengel@263 12 #ifndef _GNU_SOURCE
seanhalle@208 13 #define _GNU_SOURCE
nengel@263 14 #endif
seanhalle@208 15
seanhalle@215 16 #include "DynArray/DynArray.h"
seanhalle@215 17 #include "Hash_impl/PrivateHash.h"
seanhalle@215 18 #include "Histogram/Histogram.h"
seanhalle@215 19 #include "Queue_impl/PrivateQueue.h"
seanhalle@243 20
seanhalle@243 21 #include "VMS_primitive_data_types.h"
seanhalle@223 22 #include "Services_Offered_by_VMS/Memory_Handling/vmalloc.h"
seanhalle@208 23
seanhalle@208 24 #include <pthread.h>
seanhalle@208 25 #include <sys/time.h>
seanhalle@208 26
seanhalle@208 27 //================= Defines: included from separate files =================
seanhalle@208 28 //
seanhalle@208 29 // Note: ALL defines are in other files, none are in here
seanhalle@208 30 //
seanhalle@223 31 #include "Defines/VMS_defs.h"
seanhalle@208 32
seanhalle@208 33
seanhalle@208 34 //================================ Typedefs =================================
seanhalle@208 35 //
seanhalle@233 36 typedef unsigned long long TSCount;
seanhalle@208 37
seanhalle@235 38 typedef struct _AnimSlot AnimSlot;
seanhalle@208 39 typedef struct _VMSReqst VMSReqst;
seanhalle@208 40 typedef struct _SlaveVP SlaveVP;
seanhalle@208 41 typedef struct _MasterVP MasterVP;
seanhalle@208 42 typedef struct _IntervalProbe IntervalProbe;
seanhalle@208 43
seanhalle@208 44
seanhalle@235 45 typedef SlaveVP *(*SlaveAssigner) ( void *, AnimSlot*); //semEnv, slot for HW info
seanhalle@223 46 typedef void (*RequestHandler) ( SlaveVP *, void * ); //prWReqst, semEnv
nengel@280 47 typedef void (*TopLevelFnPtr) ( void * ); //initData, animSlv
nengel@281 48 typedef void (*TopLevelFnWrapper)( TopLevelFnPtr, void*); //(*fn)(arg)
nengel@280 49 typedef void TopLevelFn ( void * ); //initData, animSlv
seanhalle@223 50 typedef void (*ResumeSlvFnPtr) ( SlaveVP *, void * );
nengel@228 51 //=========== MEASUREMENT STUFF ==========
nengel@228 52 MEAS__Insert_Counter_Handler
nengel@228 53 //========================================
seanhalle@209 54
seanhalle@209 55 //============================ HW Dependent Fns ================================
seanhalle@209 56
seanhalle@243 57 #include "HW_Dependent_Primitives/VMS__HW_measurement.h"
seanhalle@243 58 #include "HW_Dependent_Primitives/VMS__primitives.h"
seanhalle@208 59
seanhalle@208 60
seanhalle@208 61 //============= Request Related ===========
seanhalle@208 62 //
seanhalle@208 63
seanhalle@208 64 enum VMSReqstType //avoid starting enums at 0, for debug reasons
seanhalle@208 65 {
seanhalle@208 66 semantic = 1,
seanhalle@208 67 createReq,
seanhalle@208 68 dissipate,
seanhalle@208 69 VMSSemantic //goes with VMSSemReqst below
seanhalle@208 70 };
seanhalle@208 71
seanhalle@208 72 struct _VMSReqst
seanhalle@208 73 {
seanhalle@208 74 enum VMSReqstType reqType;//used for dissipate and in future for IO requests
seanhalle@208 75 void *semReqData;
seanhalle@208 76
seanhalle@208 77 VMSReqst *nextReqst;
seanhalle@208 78 };
seanhalle@208 79 //VMSReqst
seanhalle@208 80
seanhalle@208 81 enum VMSSemReqstType //These are equivalent to semantic requests, but for
seanhalle@208 82 { // VMS's services available directly to app, like OS
seanhalle@245 83 make_probe = 1, // and probe services -- like a VMS-wide built-in lang
seanhalle@245 84 throw_excp,
seanhalle@208 85 openFile,
seanhalle@208 86 otherIO
seanhalle@208 87 };
seanhalle@208 88
seanhalle@208 89 typedef struct
seanhalle@208 90 { enum VMSSemReqstType reqType;
seanhalle@245 91 SlaveVP *requestingSlv;
seanhalle@208 92 char *nameStr; //for create probe
seanhalle@245 93 char *msgStr; //for exception
seanhalle@245 94 void *exceptionData;
seanhalle@208 95 }
seanhalle@208 96 VMSSemReq;
seanhalle@208 97
seanhalle@208 98
seanhalle@208 99 //==================== Core data structures ===================
seanhalle@208 100
seanhalle@231 101 typedef struct
seanhalle@231 102 {
seanhalle@231 103 //for future expansion
seanhalle@231 104 }
seanhalle@231 105 SlotPerfInfo;
seanhalle@231 106
seanhalle@235 107 struct _AnimSlot
seanhalle@208 108 {
seanhalle@230 109 int workIsDone;
seanhalle@230 110 int needsSlaveAssigned;
seanhalle@230 111 SlaveVP *slaveAssignedToSlot;
seanhalle@230 112
seanhalle@230 113 int slotIdx; //needed by Holistic Model's data gathering
seanhalle@237 114 int coreSlotIsOn;
seanhalle@230 115 SlotPerfInfo *perfInfo; //used by assigner to pick best slave for core
seanhalle@208 116 };
seanhalle@235 117 //AnimSlot
seanhalle@208 118
nengel@228 119 enum VPtype {
nengel@228 120 Slave = 1, //default
nengel@228 121 Master,
nengel@239 122 Shutdown,
nengel@239 123 Idle
nengel@228 124 };
nengel@228 125
seanhalle@233 126 /*This structure embodies the state of a slaveVP. It is reused for masterVP
seanhalle@233 127 * and shutdownVPs.
seanhalle@208 128 */
seanhalle@208 129 struct _SlaveVP
seanhalle@233 130 { //The offsets of these fields are hard-coded into assembly
seanhalle@233 131 void *stackPtr; //save the core's stack ptr when suspend
seanhalle@233 132 void *framePtr; //save core's frame ptr when suspend
seanhalle@233 133 void *resumeInstrPtr; //save core's program-counter when suspend
seanhalle@216 134 void *coreCtlrFramePtr; //restore before jmp back to core controller
seanhalle@216 135 void *coreCtlrStackPtr; //restore before jmp back to core controller
seanhalle@233 136
seanhalle@233 137 //============ below this, no fields are used in asm =============
seanhalle@235 138
seanhalle@235 139 int slaveID; //each slave given a globally unique ID
seanhalle@235 140 int coreAnimatedBy;
seanhalle@233 141 void *startOfStack; //used to free, and to point slave to Fn
seanhalle@235 142 enum VPtype typeOfVP; //Slave vs Master vs Shutdown..
seanhalle@235 143 int assignCount; //Each assign is for one work-unit, so IDs it
seanhalle@235 144 //note, a scheduling decision is uniquely identified by the triple:
seanhalle@235 145 // <slaveID, coreAnimatedBy, assignCount> -- used in record & replay
seanhalle@233 146
seanhalle@233 147 //for comm -- between master and coreCtlr & btwn wrapper lib and plugin
seanhalle@235 148 AnimSlot *animSlotAssignedTo;
seanhalle@233 149 VMSReqst *requests; //wrapper lib puts in requests, plugin takes out
seanhalle@233 150 void *dataRetFromReq;//Return vals from plugin to Wrapper Lib
seanhalle@208 151
seanhalle@235 152 //For using Slave as carrier for data
seanhalle@233 153 void *semanticData; //Lang saves lang-specific things in slave here
seanhalle@208 154
seanhalle@235 155 //=========== MEASUREMENT STUFF ==========
seanhalle@235 156 MEAS__Insert_Meas_Fields_into_Slave;
seanhalle@235 157 float64 createPtInSecs; //time VP created, in seconds
seanhalle@235 158 //========================================
seanhalle@208 159 };
seanhalle@208 160 //SlaveVP
seanhalle@208 161
seanhalle@233 162
seanhalle@233 163 /* The one and only global variable, holds many odds and ends
seanhalle@208 164 */
seanhalle@208 165 typedef struct
seanhalle@230 166 { //The offsets of these fields are hard-coded into assembly
seanhalle@243 167 void *coreCtlrReturnPt; //offset to this field used in asm
seanhalle@235 168 int8 falseSharePad1[256 - sizeof(void*)];
seanhalle@243 169 int32 masterLock; //offset to this field used in asm
seanhalle@235 170 int8 falseSharePad2[256 - sizeof(int32)];
seanhalle@233 171 //============ below this, no fields are used in asm =============
seanhalle@230 172
seanhalle@230 173 //Basic VMS infrastructure
seanhalle@230 174 SlaveVP **masterVPs;
seanhalle@235 175 AnimSlot ***allAnimSlots;
seanhalle@230 176
seanhalle@230 177 //plugin related
seanhalle@225 178 SlaveAssigner slaveAssigner;
seanhalle@208 179 RequestHandler requestHandler;
seanhalle@230 180 void *semanticEnv;
seanhalle@208 181
seanhalle@230 182 //Slave creation
seanhalle@230 183 int32 numSlavesCreated; //gives ordering to processor creation
seanhalle@230 184 int32 numSlavesAlive; //used to detect fail-safe shutdown
nengel@271 185 int32 numAnimatedSlaves;
seanhalle@208 186
seanhalle@230 187 //Initialization related
seanhalle@230 188 int32 setupComplete; //use while starting up coreCtlr
nengel@277 189 int32 shutdownInitiated;
seanhalle@230 190
seanhalle@230 191 //Memory management related
seanhalle@223 192 MallocArrays *freeLists;
seanhalle@230 193 int32 amtOfOutstandingMem;//total currently allocated
seanhalle@245 194
seanhalle@245 195 //Random number seeds -- random nums used in various places
seanhalle@245 196 uint32_t seed1;
seanhalle@245 197 uint32_t seed2;
seanhalle@245 198
seanhalle@208 199 //=========== MEASUREMENT STUFF =============
seanhalle@208 200 IntervalProbe **intervalProbes;
seanhalle@208 201 PrivDynArrayInfo *dynIntervalProbesInfo;
seanhalle@208 202 HashTable *probeNameHashTbl;
seanhalle@208 203 int32 masterCreateProbeID;
seanhalle@230 204 float64 createPtInSecs; //real-clock time VMS initialized
seanhalle@208 205 Histogram **measHists;
seanhalle@208 206 PrivDynArrayInfo *measHistsInfo;
seanhalle@209 207 MEAS__Insert_Susp_Meas_Fields_into_MasterEnv;
seanhalle@209 208 MEAS__Insert_Master_Meas_Fields_into_MasterEnv;
seanhalle@209 209 MEAS__Insert_Master_Lock_Meas_Fields_into_MasterEnv;
seanhalle@209 210 MEAS__Insert_Malloc_Meas_Fields_into_MasterEnv;
seanhalle@209 211 MEAS__Insert_Plugin_Meas_Fields_into_MasterEnv;
seanhalle@209 212 MEAS__Insert_System_Meas_Fields_into_MasterEnv;
nengel@228 213 MEAS__Insert_Counter_Meas_Fields_into_MasterEnv;
seanhalle@208 214 //==========================================
seanhalle@208 215 }
seanhalle@208 216 MasterEnv;
seanhalle@208 217
seanhalle@208 218 //========================= Extra Stuff Data Strucs =======================
seanhalle@208 219 typedef struct
seanhalle@208 220 {
seanhalle@208 221
seanhalle@208 222 }
seanhalle@208 223 VMSExcp;
seanhalle@208 224
seanhalle@208 225 //======================= OS Thread related ===============================
seanhalle@208 226
seanhalle@216 227 void * coreController( void *paramsIn ); //standard PThreads fn prototype
seanhalle@216 228 void * coreCtlr_Seq( void *paramsIn ); //standard PThreads fn prototype
seanhalle@230 229 void animationMaster( void *initData, SlaveVP *masterVP );
seanhalle@208 230
seanhalle@208 231
seanhalle@208 232 typedef struct
seanhalle@208 233 {
seanhalle@208 234 void *endThdPt;
seanhalle@208 235 unsigned int coreNum;
seanhalle@208 236 }
seanhalle@208 237 ThdParams;
seanhalle@208 238
seanhalle@209 239 //============================= Global Vars ================================
seanhalle@209 240
seanhalle@215 241 volatile MasterEnv *_VMSMasterEnv __align_to_cacheline__;
nengel@280 242 extern __thread SlaveVP* currVP;
seanhalle@215 243
seanhalle@233 244 //these are global, but only used for startup and shutdown
seanhalle@222 245 pthread_t coreCtlrThdHandles[ NUM_CORES ]; //pthread's virt-procr state
seanhalle@216 246 ThdParams *coreCtlrThdParams [ NUM_CORES ];
seanhalle@222 247
seanhalle@222 248 pthread_mutex_t suspendLock;
seanhalle@222 249 pthread_cond_t suspendCond;
seanhalle@208 250
seanhalle@208 251 //========================= Function Prototypes ===========================
seanhalle@233 252 /* MEANING OF WL PI SS int VMSOS
seanhalle@209 253 * These indicate which places the function is safe to use. They stand for:
seanhalle@233 254 *
seanhalle@233 255 * WL Wrapper Library -- wrapper lib code should only use these
seanhalle@233 256 * PI Plugin -- plugin code should only use these
seanhalle@233 257 * SS Startup and Shutdown -- designates these relate to startup & shutdown
seanhalle@233 258 * int internal to VMS -- should not be used in wrapper lib or plugin
seanhalle@233 259 * VMSOS means "OS functions for applications to use"
seanhalle@233 260 *
seanhalle@233 261 * VMS_int__ functions touch internal VMS data structs and are only safe
seanhalle@233 262 * to be used inside the master lock. However, occasionally, they appear
seanhalle@233 263 * in wrapper-lib or plugin code. In those cases, very careful analysis
seanhalle@233 264 * has been done to be sure no concurrency issues could arise.
seanhalle@233 265 *
seanhalle@233 266 * VMS_WL__ functions are all safe for use outside the master lock.
seanhalle@233 267 *
seanhalle@233 268 * VMSOS are only safe for applications to use -- they're like a second
seanhalle@233 269 * language mixed in -- but they can't be used inside plugin code, and
seanhalle@233 270 * aren't meant for use in wrapper libraries, because they are themselves
seanhalle@233 271 * wrapper-library calls!
seanhalle@209 272 */
seanhalle@233 273 //========== Startup and shutdown ==========
seanhalle@208 274 void
seanhalle@209 275 VMS_SS__init();
seanhalle@208 276
seanhalle@208 277 void
seanhalle@209 278 VMS_SS__start_the_work_then_wait_until_done();
seanhalle@208 279
nengel@228 280 SlaveVP*
nengel@228 281 VMS_SS__create_shutdown_slave();
nengel@228 282
seanhalle@208 283 void
seanhalle@209 284 VMS_SS__shutdown();
seanhalle@208 285
seanhalle@208 286 void
seanhalle@209 287 VMS_SS__cleanup_at_end_of_shutdown();
seanhalle@208 288
seanhalle@208 289
seanhalle@208 290 //============== ===============
seanhalle@208 291
nengel@257 292 SlaveVP *
seanhalle@209 293 VMS_int__create_slaveVP( TopLevelFnPtr fnPtr, void *dataParam );
seanhalle@209 294 #define VMS_PI__create_slaveVP VMS_int__create_slaveVP
seanhalle@209 295 #define VMS_WL__create_slaveVP VMS_int__create_slaveVP
seanhalle@208 296
nengel@281 297 SlaveVP *
nengel@281 298 VMS_int__create_slaveVP_with_wrapper( TopLevelFnWrapper fnWrapper, TopLevelFnPtr fnPtr, void *dataParam );
nengel@281 299
seanhalle@210 300 //Use this to create processor inside entry point & other places outside
seanhalle@210 301 // the VMS system boundary (IE, don't animate with a SlaveVP or MasterVP)
seanhalle@210 302 SlaveVP *
seanhalle@210 303 VMS_ext__create_slaveVP( TopLevelFnPtr fnPtr, void *dataParam );
seanhalle@210 304
nengel@257 305 SlaveVP *
seanhalle@210 306 VMS_int__create_slaveVP_helper( SlaveVP *newSlv, TopLevelFnPtr fnPtr,
seanhalle@210 307 void *dataParam, void *stackLocs );
seanhalle@210 308
nengel@281 309 SlaveVP *
nengel@281 310 VMS_int__create_slaveVP_helper_with_wrapper( SlaveVP *newSlv, TopLevelFnWrapper fnWrapper, TopLevelFnPtr fnPtr,
nengel@281 311 void *dataParam, void *stackLocs );
nengel@281 312
nengel@257 313 void
seanhalle@243 314 VMS_int__reset_slaveVP_to_TopLvlFn( SlaveVP *slaveVP, TopLevelFnPtr fnPtr,
seanhalle@219 315 void *dataParam);
seanhalle@208 316
nengel@257 317 void
seanhalle@243 318 VMS_int__point_slaveVP_to_OneParamFn( SlaveVP *slaveVP, void *fnPtr,
seanhalle@243 319 void *param);
seanhalle@243 320
nengel@257 321 void
seanhalle@243 322 VMS_int__point_slaveVP_to_TwoParamFn( SlaveVP *slaveVP, void *fnPtr,
seanhalle@243 323 void *param1, void *param2);
seanhalle@243 324
seanhalle@208 325 void
nengel@281 326 VMS_int__reset_slaveVP_to_TopLvlFnWrapper( SlaveVP *slaveVP, TopLevelFnWrapper fnWrapper, TopLevelFnPtr fnPtr,
nengel@281 327 void *dataParam);
nengel@281 328
nengel@281 329 void
seanhalle@210 330 VMS_int__dissipate_slaveVP( SlaveVP *slaveToDissipate );
seanhalle@210 331 #define VMS_PI__dissipate_slaveVP VMS_int__dissipate_slaveVP
seanhalle@210 332 //WL: dissipate a SlaveVP by sending a request
seanhalle@208 333
seanhalle@208 334 void
seanhalle@209 335 VMS_ext__dissipate_slaveVP( SlaveVP *slaveToDissipate );
seanhalle@208 336
seanhalle@208 337 void
seanhalle@209 338 VMS_int__throw_exception( char *msgStr, SlaveVP *reqstSlv, VMSExcp *excpData );
seanhalle@245 339 #define VMS_PI__throw_exception VMS_int__throw_exception
seanhalle@245 340 void
seanhalle@245 341 VMS_WL__throw_exception( char *msgStr, SlaveVP *reqstSlv, VMSExcp *excpData );
seanhalle@245 342 #define VMS_App__throw_exception VMS_WL__throw_exception
seanhalle@208 343
seanhalle@208 344 void *
seanhalle@209 345 VMS_int__give_sem_env_for( SlaveVP *animSlv );
seanhalle@209 346 #define VMS_PI__give_sem_env_for VMS_int__give_sem_env_for
seanhalle@209 347 #define VMS_SS__give_sem_env_for VMS_int__give_sem_env_for
seanhalle@209 348 //No WL version -- not safe! if use in WL, be sure data rd & wr is stable
seanhalle@208 349
seanhalle@245 350
nengel@257 351 void
seanhalle@245 352 VMS_int__get_master_lock();
seanhalle@245 353
seanhalle@245 354 #define VMS_int__release_master_lock() _VMSMasterEnv->masterLock = UNLOCKED
seanhalle@245 355
nengel@257 356 uint32_t
seanhalle@245 357 VMS_int__randomNumber();
seanhalle@245 358
seanhalle@208 359 //============== Request Related ===============
seanhalle@208 360
seanhalle@208 361 void
seanhalle@209 362 VMS_int__suspend_slaveVP_and_send_req( SlaveVP *callingSlv );
seanhalle@208 363
nengel@257 364 void
seanhalle@209 365 VMS_WL__add_sem_request_in_mallocd_VMSReqst( void *semReqData, SlaveVP *callingSlv );
seanhalle@208 366
nengel@257 367 void
seanhalle@209 368 VMS_WL__send_sem_request( void *semReqData, SlaveVP *callingSlv );
seanhalle@208 369
seanhalle@208 370 void
seanhalle@209 371 VMS_WL__send_create_slaveVP_req( void *semReqData, SlaveVP *reqstingSlv );
seanhalle@208 372
nengel@257 373 void
seanhalle@208 374 VMS_WL__send_dissipate_req( SlaveVP *prToDissipate );
seanhalle@208 375
nengel@257 376 void
seanhalle@209 377 VMS_WL__send_VMSSem_request( void *semReqData, SlaveVP *callingSlv );
seanhalle@208 378
seanhalle@208 379 VMSReqst *
seanhalle@209 380 VMS_PI__take_next_request_out_of( SlaveVP *slaveWithReq );
seanhalle@246 381 //#define VMS_PI__take_next_request_out_of( slave ) slave->requests
seanhalle@208 382
nengel@257 383 //void *
seanhalle@246 384 //VMS_PI__take_sem_reqst_from( VMSReqst *req );
seanhalle@246 385 #define VMS_PI__take_sem_reqst_from( req ) req->semReqData
seanhalle@208 386
nengel@257 387 void
seanhalle@209 388 VMS_PI__handle_VMSSemReq( VMSReqst *req, SlaveVP *requestingSlv, void *semEnv,
seanhalle@209 389 ResumeSlvFnPtr resumeSlvFnPtr );
seanhalle@208 390
seanhalle@208 391 //======================== MEASUREMENT ======================
seanhalle@208 392 uint64
seanhalle@208 393 VMS_WL__give_num_plugin_cycles();
seanhalle@208 394 uint32
seanhalle@208 395 VMS_WL__give_num_plugin_animations();
seanhalle@208 396
seanhalle@208 397
seanhalle@210 398 //========================= Utilities =======================
nengel@257 399 char *
seanhalle@210 400 VMS_int__strDup( char *str );
seanhalle@208 401
seanhalle@210 402
seanhalle@210 403 //========================= Probes =======================
seanhalle@223 404 #include "Services_Offered_by_VMS/Measurement_and_Stats/probes.h"
seanhalle@210 405
seanhalle@210 406 //================================================
seanhalle@208 407 #endif /* _VMS_H */
seanhalle@208 408