db8aa064854a8e8f387d1a7db0e22f11429fce7c
[charm.git] / src / ck-ldb / LBDBManager.h
1 #ifndef LBDB_H
2 #define LBDB_H
3
4 #if CMK_STL_USE_DOT_H
5 #include <vector.h>
6 #else  // CMK_STL_NO_DOT_H
7 #include <vector>
8 #endif
9
10 #include "converse.h"
11 #include "lbdb.h"
12
13 #include "LBObj.h"
14 #include "LBOM.h"
15 #include "LBComm.h"
16 #include "LBMachineUtil.h"
17
18 class LocalBarrier {
19 friend class LBDB;
20 public:
21   LocalBarrier() { cur_refcount = 1; client_count = 0; max_client = 0;
22                    max_receiver= 0; at_count = 0; on = CmiFalse; };
23   ~LocalBarrier() { };
24
25   LDBarrierClient AddClient(LDResumeFn fn, void* data);
26   void RemoveClient(LDBarrierClient h);
27   LDBarrierReceiver AddReceiver(LDBarrierFn fn, void* data);
28   void RemoveReceiver(LDBarrierReceiver h);
29   void AtBarrier(LDBarrierClient h);
30   void TurnOn() { on = CmiTrue; CheckBarrier(); };
31   void TurnOff() { on = CmiFalse; };
32
33 private:
34   void CallReceivers(void);
35   void CheckBarrier();
36   void ResumeClients(void);
37
38   struct client {
39     void* data;
40     LDResumeFn fn;
41     int refcount;
42   };
43    struct receiver {
44     void* data;
45     LDBarrierFn fn;
46   };
47
48 #if CMK_STL_USE_DOT_H
49   vector<client*> clients;
50   vector<receiver*> receivers;
51 #else
52   std::vector<client*> clients;
53   std::vector<receiver*> receivers;
54 #endif
55
56   int cur_refcount;
57   int max_client;
58   int client_count;
59   int max_receiver;
60   int at_count;
61   CmiBool on;
62 };
63
64 class LBDB {
65 public:
66   LBDB() {
67     statsAreOn = CmiFalse;
68     omCount = objCount = oms_registering = 0;
69     obj_running = CmiFalse;
70     commTable = new LBCommTable;
71     obj_walltime = obj_cputime = 0;
72   }
73
74   ~LBDB() { }
75
76   void insert(LBOM *om);
77
78   LDOMHandle AddOM(LDOMid _userID, void* _userData, 
79                    LDCallbacks _callbacks);
80   LDObjHandle AddObj(LDOMHandle _h, LDObjid _id, void *_userData,
81                      CmiBool _migratable);
82   void UnregisterObj(LDObjHandle _h);
83
84   void RegisteringObjects(LDOMHandle _h);
85   void DoneRegisteringObjects(LDOMHandle _h);
86
87   LBOM *LbOM(LDOMHandle h) { return oms[h.handle]; };
88   LBObj *LbObj(LDObjHandle h) { return objs[h.handle]; };
89   void DumpDatabase(void);
90   void TurnStatsOn(void) { statsAreOn = CmiTrue; machineUtil.StatsOn(); };
91   void TurnStatsOff(void) { statsAreOn = CmiFalse; machineUtil.StatsOff(); };
92   CmiBool StatsOn(void) { return statsAreOn; };
93   void Send(LDOMHandle destOM, LDObjid destid, unsigned int bytes);
94   int ObjDataCount();
95   void GetObjData(LDObjData *data);
96   int CommDataCount() { 
97     if (commTable)
98       return commTable->CommCount();
99     else return 0;
100   }
101   void GetCommData(LDCommData *data) { 
102     if (commTable) commTable->GetCommData(data);
103   };
104
105   void Migrate(LDObjHandle h, int dest);
106   void Migrated(LDObjHandle h);
107   void NotifyMigrated(LDMigratedFn fn, void* data);
108   void IdleTime(double* walltime) { 
109     machineUtil.IdleTime(walltime); 
110   };
111   void TotalTime(double* walltime, double* cputime) {
112     machineUtil.TotalTime(walltime,cputime);
113   };
114   void BackgroundLoad(double* walltime, double* cputime);
115   void ClearLoads(void);
116   void SetRunningObj(LDObjHandle _h) {
117     runningObj = _h; obj_running = CmiTrue;
118   };
119   void NoRunningObj() { obj_running = CmiFalse; };
120   CmiBool ObjIsRunning() { return obj_running; };
121   LDObjHandle RunningObj() { return runningObj; };
122   
123   LDBarrierClient AddLocalBarrierClient(LDResumeFn fn, void* data) { 
124     return localBarrier.AddClient(fn,data);
125   };
126   void RemoveLocalBarrierClient(LDBarrierClient h) {
127     localBarrier.RemoveClient(h);
128   };
129   LDBarrierReceiver AddLocalBarrierReceiver(LDBarrierFn fn, void* data) {
130     return localBarrier.AddReceiver(fn,data);
131   };
132   void RemoveLocalBarrierReceiver(LDBarrierReceiver h) {
133     localBarrier.RemoveReceiver(h);
134   };
135   void AtLocalBarrier(LDBarrierClient h) {
136     localBarrier.AtBarrier(h);
137   };
138   void ResumeClients() {
139     localBarrier.ResumeClients();
140   };
141   void MeasuredObjTime(double wtime, double ctime) {
142     if (statsAreOn) {
143       obj_walltime += wtime;
144       obj_cputime += ctime;
145     }
146   };
147
148 private:
149   struct MigrateCB {
150     LDMigratedFn fn;
151     void* data;
152   };
153
154 #if CMK_STL_USE_DOT_H
155   typedef vector<LBOM*> OMList;
156   typedef vector<LBObj*> ObjList;
157   typedef vector<MigrateCB*> MigrateCBList;
158 #else
159   typedef std::vector<LBOM*> OMList;
160   typedef std::vector<LBObj*> ObjList;
161   typedef std::vector<MigrateCB*> MigrateCBList;
162 #endif
163   LBCommTable* commTable;
164   OMList oms;
165   int omCount;
166   int oms_registering;
167   ObjList objs;
168   int objCount;
169   CmiBool statsAreOn;
170   MigrateCBList migrateCBList;
171   CmiBool obj_running;
172   LDObjHandle runningObj;
173
174   LocalBarrier localBarrier;
175   LBMachineUtil machineUtil;
176   double obj_walltime;
177   double obj_cputime;
178 };
179
180 #endif
181