00001
00009
00010 #include "NullLB.h"
00011 #include "ck.h"
00012
00013 #define NULLLB_CONVERSE 1
00014
00015 extern int quietModeRequested;
00016
00017 void CreateNullLB(void) {
00018
00019
00020 CProxy_NullLB::ckNew(-1);
00021 }
00022
00023 static CkGroupID _theNullLB;
00024
00025 #if NULLLB_CONVERSE
00026 static int _migDoneHandle;
00027
00028
00029 static void migrationDone(envelope *env, CkCoreState *ck)
00030 {
00031
00032
00033 if (ck->watcher!=NULL) {
00034 if (!ck->watcher->processMessage(&env,ck)) return;
00035 }
00036
00037 NullLB *lb = (NullLB*)CkLocalBranch(_theNullLB);
00038 lb->migrationsDone();
00039 CkFreeSysMsg(EnvToUsr(env));
00040 }
00041 #endif
00042
00043 static void lbinit(void) {
00044 LBRegisterBalancer("NullLB", CreateNullLB, NULL, "should not be shown", 0);
00045 }
00046
00047 static void lbprocinit(void) {
00048 #if NULLLB_CONVERSE
00049 CmiAssignOnce(&_migDoneHandle, CkRegisterHandlerEx(migrationDone, CkpvAccess(_coreState)));
00050 #endif
00051 }
00052
00053 #if CMK_LBDB_ON
00054 static void staticStartLB(void* data)
00055 {
00056 CmiPrintf("[%d] LB Info: StartLB called in NullLB.\n", CkMyPe());
00057 }
00058
00059 void NullLB::init()
00060 {
00061
00062 thisProxy = CProxy_NullLB(thisgroup);
00063 CkpvAccess(hasNullLB) = 1;
00064 receiver = theLbdb->
00065 AddLocalBarrierReceiver((LDBarrierFn)(staticAtSync),
00066 (void*)(this));
00067 theLbdb->
00068 AddStartLBFn((LDStartLBFn)(staticStartLB),(void*)(this));
00069
00070 if(CmiMyRank() == 0) _theNullLB = thisgroup;
00071 }
00072
00073 NullLB::~NullLB()
00074 {
00075
00076 theLbdb = CProxy_LBDatabase(_lbdb).ckLocalBranch();
00077 if (theLbdb) {
00078 theLbdb->RemoveLocalBarrierReceiver(receiver);
00079 theLbdb->RemoveStartLBFn((LDStartLBFn)(staticStartLB));
00080 }
00081 }
00082
00083 void NullLB::staticAtSync(void* data)
00084 {
00086
00087 if (CkpvAccess(numLoadBalancers) > 1) return;
00088
00089 NullLB *me = (NullLB*)(data);
00090 me->AtSync();
00091 }
00092
00093
00094
00095 void NullLB::AtSync()
00096 {
00097
00098
00099
00100
00101
00102
00103
00104
00105 #if ! NULLLB_CONVERSE
00106
00107
00108 CpvAccess(_qd)->create(-1);
00109 thisProxy[CkMyPe()].migrationsDone();
00110 #else
00111
00112 envelope *env = UsrToEnv(CkAllocSysMsg());
00113 CmiSetHandler(env, _migDoneHandle);
00114 CmiSyncSendAndFree(CkMyPe(), env->getTotalsize(), (char *)env);
00115 #endif
00116 }
00117
00118 void NullLB::migrationsDone(void)
00119 {
00120 #if ! NULLLB_CONVERSE
00121
00122 CpvAccess(_qd)->process(-1);
00123 #endif
00124 theLbdb->ResumeClients();
00125 }
00126
00127 #else
00128
00129
00130
00131 void NullLB::init(void) {}
00132 NullLB::~NullLB() {}
00133 void NullLB::staticAtSync(void* data) {}
00134 void NullLB::AtSync() {}
00135 void NullLB::migrationsDone(void) {}
00136 #endif
00137
00138 #include "NullLB.def.h"
00139
00140