added basic support for load balancing in pose (using the general LB framework).
[charm.git] / src / libs / ck-libs / pose / pvtobj.h
1 /// pvtObjects: a list to hold records of posers registered with a PVT branch.
2 /** Implements a simple list of object records stored one per PVT branch.
3     Provides a means to perform common operations (gather safe times, fossil
4     colleciton, etc) on all registered objectssy on a processor. */
5 #ifndef PVTOBJ_H
6 #define PVTOBJ_H
7
8 /// A pvtObjects entry for storing poser data
9 /** This class is used in pvtObjects to store poser data local to a
10     processor. */
11 class pvtObjectNode {
12   /// Last reported safe time of poser
13   POSE_TimeType ovt, ovt2;
14   /// Index of poser in POSE_Objects array
15   int index;  
16   /// Flag to indicate if object data is stored at this index
17   /** present==true indicates that this node contains a valid object, present==false
18       indicates the node can be recycled */
19   bool present;
20   /// The synchronization strategy of the poser (OPTIMISTIC or CONSERVATIVE)
21   short int sync; 
22   /// Time spent executing events on this object within a DOP_QUANTA
23   double qdo;
24  public:
25   /// A pointer to the actual poser
26   sim *localObjPtr;
27   /// Basic Constructor
28   pvtObjectNode() : ovt(POSE_UnsetTS), ovt2(POSE_UnsetTS), index(-1), present(false), sync(0), qdo(0.0) {  }
29   /// Sets all data fields
30   void set(POSE_TimeType ts, int idx, bool on, short int s, sim *p) {
31     ovt = ts; index = idx; present = on; sync = s; localObjPtr = p; qdo = 0.0;
32     ovt2 = POSE_UnsetTS;
33   }
34   /// Sets ovt to -1 to indicate idle
35   void setIdle() { ovt = ovt2 = POSE_UnsetTS; }
36   /// Test present flag
37   bool isPresent() { return present; }
38   /// Test if synchronization strategy is optimistic
39   int isOptimistic() { return (sync == OPTIMISTIC); }
40   /// Test if synchronization strategy is conservative
41   int isConservative() { return (sync == CONSERVATIVE); }
42   /// Return ovt
43   POSE_TimeType getOVT() { return ovt; }
44   /// Return ovt2
45   POSE_TimeType getOVT2() { return ovt2; }
46   /// Set ovt to st
47   void setOVT(POSE_TimeType st) { ovt = st; }
48   /// Set ovt2 to st
49   void setOVT2(POSE_TimeType st) { ovt2 = st; }
50   /// Add time to qdo
51   void addQdoTime(double t) { qdo += t; }
52   /// Return qdo
53   double getQdo() { return qdo; }
54   /// Reset qdo at start of quanta
55   void resetQdo() { qdo = 0.0; }
56   /// Dump data fields
57   void dump() {
58     if (localObjPtr == NULL)
59       CkPrintf("ovt=%d index=%d present=%s sync=%s ptr=NULL",
60                ovt, index, present?"true":"false", (sync==0)?"OPT":"CON");
61     else 
62       CkPrintf("ovt=%d index=%d present=%s sync=%s ptr!=NULL",
63                ovt, index, present?"true":"false", (sync==0)?"OPT":"CON");
64   }
65   /// Check validity of data fields
66   void sanitize();
67 };
68
69 /// List to hold records of posers registered with a PVT branch.
70 class pvtObjects {
71   /// Number of posers present in the list
72   int numObjs;
73   /// number of consecutive spaces in list that are or have been occupied
74   int numSpaces;
75   /// number of spaces allocated in objs
76   int size;
77   /// lowest index of an empty slot in objs
78   int firstEmpty; 
79  public:
80   /// the list of posers
81   pvtObjectNode *objs;
82   /// Basic Constructor: preallocates space for 100 objects
83   pvtObjects();    
84   /// Get number of objects in the list
85   int getNumObjs() { return numObjs; }
86   /// Get number of spaces in use in list
87   int getNumSpaces() { return numSpaces; }
88   /// Set posers to idle (ovt==-1)
89   void SetIdle() { 
90     register int i; 
91     for (i=0; i<numSpaces; i++) objs[i].setIdle();
92   }                           
93   /// Wake up all posers in list
94   void Wake();
95   void callAtSync();
96   /// Call Commit on all posers
97   void Commit();
98   /// Insert poser in list
99   /** Inserts an object in the list in the firstEmpty slot, expanding the list
100       size if necessary */
101   int Insert(int index, POSE_TimeType ovt, int sync, sim *myPtr); 
102   /// Delete a poser from the list
103   void Delete(int idx) {
104     objs[idx].set(POSE_UnsetTS, POSE_UnsetTS, false, 0, NULL);
105     numObjs--;
106     if (idx < firstEmpty) firstEmpty = idx; // recalculate firstEmpty
107   }                       
108   /// Dump data fields
109   void dump();
110   /// Check validity of data fields
111   void sanitize();
112 };
113   
114 #endif