all load balancers inherit from BaseLB now.
[charm.git] / src / ck-ldb / LBDatabase.C
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 #include <converse.h>
9
10
11 /*
12  * This C++ file contains the Charm stub functions
13  */
14
15 #include "LBDatabase.h"
16 #include "LBDatabase.def.h"
17
18 #include "NullLB.h"
19
20 CkGroupID lbdb;
21
22 static LBDefaultCreateFn defaultCreate=NULL;
23 void LBSetDefaultCreate(LBDefaultCreateFn f)
24 {
25   if (defaultCreate) CmiAbort("Error: try to create multiple load balancer strategies!");
26   defaultCreate=f;
27 }
28
29 class LBDBResgistry {
30 private:
31   class LBDBEntry {
32   public:
33     const char *name;
34     LBDefaultCreateFn  fn;
35     const char *help;
36
37     LBDBEntry(): name(0), fn(0), help(0) {}
38     LBDBEntry(int) {}
39     LBDBEntry(const char *n, LBDefaultCreateFn f, const char *h):
40       name(n), fn(f), help(h) {};
41   };
42   CkVec<LBDBEntry> lbtables;
43 public:
44   void displayLBs()
45   {
46     CmiPrintf("\nAvailable load balancers:\n");
47     for (int i=0; i<lbtables.length(); i++) {
48       CmiPrintf("* %s:  %s\n", lbtables[i].name, lbtables[i].help);
49     }
50     CmiPrintf("\n");
51   }
52   void add(const char *name, LBDefaultCreateFn fn, const char *help) {
53     lbtables.push_back(LBDBEntry(name, fn, help));
54   }
55   LBDefaultCreateFn search(const char *name) {
56     for (int i=0; i<lbtables.length(); i++) 
57       if (0==strcmp(name, lbtables[i].name)) return lbtables[i].fn;
58     return NULL;
59   }
60 };
61
62 static LBDBResgistry  lbRegistry;
63
64 void LBRegisterBalancer(const char *name, LBDefaultCreateFn fn, const char *help)
65 {
66   lbRegistry.add(name, fn, help);
67 }
68
69 LBDBInit::LBDBInit(CkArgMsg *m)
70 {
71 #if CMK_LBDB_ON
72   lbdb = CProxy_LBDatabase::ckNew();
73
74   LBDefaultCreateFn lbFn = defaultCreate;
75
76   char *balancer = NULL;
77   if (CmiGetArgString(m->argv, "+balancer", &balancer)) {
78     LBDefaultCreateFn fn = lbRegistry.search(balancer);
79     if (!fn) { 
80       lbRegistry.displayLBs(); 
81       CmiAbort("Unknown load balancer!"); 
82     }
83     else  // overwrite defaultCreate.
84       lbFn = fn;
85   }
86
87   // NullLB is the default
88   if (!lbFn) lbFn = CreateNullLB;
89   (lbFn)();
90 #endif
91   delete m;
92 }