doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-ldb / NullLB.C
1 /**
2  * \addtogroup CkLdb
3
4 NullLB is a place holder load balancer, it does nothing but resume from 
5 atSync so that application won't hang in the case where there is no other
6 load balancer around.
7 */
8 /*@{*/
9
10 #include "NullLB.h"
11 #include "ck.h"
12
13 #define NULLLB_CONVERSE                     1
14
15 void CreateNullLB(void) {
16   // special seqno -1
17   // not putting into LBDatabase's loadbalancer list
18   CProxy_NullLB::ckNew(-1);
19 }
20
21 static CkGroupID  _theNullLB;
22
23 #if NULLLB_CONVERSE
24 static int _migDoneHandle;              // converse handler
25 // converse handler 
26 // send converse message to avoid QD detection
27 static void migrationDone(envelope *env, CkCoreState *ck)
28 {
29   // Since migrationsDone will deal with Charm++ messages,
30   // the LB must obey to the CkMessageWatcher orders.
31   if (ck->watcher!=NULL) {
32     if (!ck->watcher->processMessage(&env,ck)) return;
33   }
34   
35   NullLB *lb = (NullLB*)CkLocalBranch(_theNullLB);
36   lb->migrationsDone();
37   CkFreeSysMsg(EnvToUsr(env));
38 }
39 #endif
40
41 static void lbinit(void) {
42   LBRegisterBalancer("NullLB", CreateNullLB, NULL, "should not be shown", 0);
43 }
44
45 static void lbprocinit(void) {
46 #if NULLLB_CONVERSE
47   _migDoneHandle = CkRegisterHandler((CmiHandler)migrationDone);
48   CkNumberHandlerEx(_migDoneHandle, (CmiHandlerEx)migrationDone, CkpvAccess(_coreState));
49   // FIXME: Really a function "CkRegisterHandlerEx" should exist...
50 #endif
51 }
52
53 #if CMK_LBDB_ON
54 static void staticStartLB(void* data)
55 {
56   CmiPrintf("[%d] LB Info: StartLB called in NullLB.\n", CkMyPe());
57 }
58
59 void NullLB::init()
60 {
61   // if (CkMyPe() == 0) CkPrintf("[%d] NullLB created\n",CkMyPe());
62   thisProxy = CProxy_NullLB(thisgroup);
63   CkpvAccess(hasNullLB) = 1;
64   receiver = theLbdb->
65     AddLocalBarrierReceiver((LDBarrierFn)(staticAtSync),
66                             (void*)(this));
67   theLbdb->
68     AddStartLBFn((LDStartLBFn)(staticStartLB),(void*)(this));
69
70   _theNullLB = thisgroup;
71 }
72
73 NullLB::~NullLB()
74 {
75   // the LBDatabase object may have been deleted.
76   theLbdb = CProxy_LBDatabase(_lbdb).ckLocalBranch();
77   if (theLbdb) {
78     theLbdb->RemoveLocalBarrierReceiver(receiver);
79     theLbdb->RemoveStartLBFn((LDStartLBFn)(staticStartLB));
80   }
81 }
82
83 void NullLB::staticAtSync(void* data)
84 {
85   /// if there is other LBs, just ignore return
86   // CmiPrintf("numLoadBalancers = %d\n", CkpvAccess(numLoadBalancers));
87   if (CkpvAccess(numLoadBalancers) > 1) return;
88
89   NullLB *me = (NullLB*)(data);
90   me->AtSync();
91 }
92
93 void NullLB::AtSync()
94 {
95   // tried to reset the database so it doesn't waste memory
96   // if nobody else is here, the stat collection is not even turned on
97   // so I should not have to clear loads.
98 //  theLbdb->ClearLoads();
99   
100   // disable the batsyncer if no balancer exists
101   // theLbdb->SetLBPeriod(1e10);
102
103 #if ! NULLLB_CONVERSE
104   // prevent this charm message from being seen by QD
105   // so that the QD detection works
106   CpvAccess(_qd)->create(-1);
107   thisProxy[CkMyPe()].migrationsDone();
108 #else
109   // send converse message to escape the QD detection
110   envelope *env = UsrToEnv(CkAllocSysMsg());
111   CmiSetHandler(env, _migDoneHandle);
112   CmiSyncSendAndFree(CkMyPe(), env->getTotalsize(), (char *)env);
113 #endif
114 }
115
116 void NullLB::migrationsDone(void)
117 {
118 #if ! NULLLB_CONVERSE
119   // prevent this charm message from being seen by QD
120   CpvAccess(_qd)->process(-1);
121 #endif
122   theLbdb->ResumeClients();
123 }
124
125 #else
126 /*No load balancer-- still need definitions to prevent linker errors.
127 I sure wish we had #ifdefs in the .ci file-- then we could avoid all this.
128 */
129 void NullLB::init(void) {}
130 NullLB::~NullLB() {}
131 void NullLB::staticAtSync(void* data) {}
132 void NullLB::AtSync() {}
133 void NullLB::migrationsDone(void) {}
134 #endif
135
136 #include "NullLB.def.h"
137
138
139 /*@}*/