a519d9dc405a5c3a8137ea8357dde8762b035ffe
[charm.git] / src / libs / ck-libs / pose / pvtobj.C
1 /// pvtObjects: a list to hold records of posers registered with a PVT branch.
2 #include "pose.h"
3
4 /// Check validity of data fields
5 void pvtObjectNode::sanitize() 
6 {
7   if (present) {
8     CmiAssert(ovt >= -1);
9     CmiAssert(index >= 0);
10     CmiAssert((sync == OPTIMISTIC) || (sync == CONSERVATIVE));
11     CmiAssert((localObjPtr != NULL) && (localObjPtr->IsActive() < 2));
12   }
13 }
14
15 /// Basic Constructor: preallocates space for 100 objects
16 pvtObjects::pvtObjects() 
17
18   register int i;
19   numObjs = numSpaces = firstEmpty = 0; 
20   size = 100;
21   if (!(objs = (pvtObjectNode *)malloc(100 * sizeof(pvtObjectNode)))) {
22     CkPrintf("ERROR: pvtObjects::pvtObjects: OUT OF MEMORY!\n");
23     CkExit();
24   }
25   for (i=0; i<size; i++) objs[i].set(POSE_UnsetTS, POSE_UnsetTS, false, 0, NULL);
26 }
27
28 /// Insert poser in list
29 int pvtObjects::Insert(int index, POSE_TimeType ovt, int sync, sim *myPtr)
30 {
31   int idx;
32   register int i;
33   if (numObjs < size) { // insert in empty space
34     idx = firstEmpty;
35     if (firstEmpty == numSpaces) // all spaces occupied up to end of list
36       numSpaces++;  // use a previously unused space
37     objs[idx].set(ovt, index, true, sync, myPtr);
38     numObjs++;
39     for (i=firstEmpty+1; i<size; i++)  // reset firstEmpty
40       if (!objs[i].isPresent()) {
41         firstEmpty = i;
42         break;
43       }
44   }
45   else { // no free spaces; expand objs
46     firstEmpty = size;  // this is where firstEmpty will be after expansion
47     size += 50;  // expand by 50
48     if (!(objs = 
49           (pvtObjectNode *)realloc(objs, size * sizeof(pvtObjectNode)))) {
50       CkPrintf("ERROR: pvtObjects::Insert: OUT OF MEMORY!\n");
51       CkExit();
52     }
53     for (i=firstEmpty; i<size; i++)  // initialize new slots to empty
54       objs[i].set(POSE_UnsetTS, POSE_UnsetTS, false, 0, NULL);
55     idx = firstEmpty;  // insert new object at firstEmpty
56     objs[idx].set(ovt, index, true, sync, myPtr);
57     numObjs++;
58     numSpaces++;
59     firstEmpty++;
60   }   
61   return idx;
62 }
63
64 /// Wake up all posers in list
65 void pvtObjects::Wake() {
66   register int i;
67   for (i=0; i<numSpaces; i++)
68     if (objs[i].isPresent()) (objs[i].localObjPtr)->Status();
69 }
70 /// Call Commit on all posers
71 void pvtObjects::Commit() {
72   register int i;
73   for (i=0; i<numSpaces; i++)
74     if (objs[i].isPresent()) (objs[i].localObjPtr)->Commit();
75 }
76
77 /// Dump data fields
78 void pvtObjects::dump()
79 {
80   register int i;
81   CkPrintf("numObjs=%d numSpaces=%d firstEmpty=%d size=%d\n", 
82            numObjs, numSpaces, firstEmpty, size);
83   for (i=0; i<numSpaces; i++) {
84     CkPrintf("[%d] ", i);
85     objs[i].dump();
86     CkPrintf("\n");
87   }
88 }
89
90 /// Check validity of data fields
91 void pvtObjects::sanitize() 
92 {
93   register int i;
94   CmiAssert(numObjs >= 0);
95   CmiAssert(numSpaces >= 0);
96   CmiAssert(size >= 0);
97   CmiAssert(firstEmpty >= 0);
98   CmiAssert(numObjs <= numSpaces);
99   CmiAssert(numSpaces <= size);
100   CmiAssert(firstEmpty < numSpaces);
101   for (int i=0; i<numSpaces; i++) objs[i].sanitize();
102 }