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