00001
00009
00010 #include "NullLB.h"
00011 #include "ck.h"
00012
00013 #define NULLLB_CONVERSE 1
00014
00015 void CreateNullLB(void) {
00016
00017
00018 CProxy_NullLB::ckNew(-1);
00019 }
00020
00021 static CkGroupID _theNullLB;
00022
00023 #if NULLLB_CONVERSE
00024 static int _migDoneHandle;
00025
00026
00027 static void migrationDone(envelope *env, CkCoreState *ck)
00028 {
00029
00030
00031 if (ck->watcher!=NULL) {
00032 if (!ck->watcher->processMessage(&env,ck)) return;
00033 }
00034
00035 NullLB *lb = (NullLB*)CkLocalBranch(_theNullLB);
00036 lb->migrationsDone();
00037 CkFreeSysMsg(EnvToUsr(env));
00038 }
00039 #endif
00040
00041 static void lbinit(void) {
00042 LBRegisterBalancer("NullLB", CreateNullLB, NULL, "should not be shown", 0);
00043 }
00044
00045 static void lbprocinit(void) {
00046 #if NULLLB_CONVERSE
00047 _migDoneHandle = CkRegisterHandler((CmiHandler)migrationDone);
00048 CkNumberHandlerEx(_migDoneHandle, (CmiHandlerEx)migrationDone, CkpvAccess(_coreState));
00049
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 _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 void NullLB::AtSync()
00094 {
00095
00096
00097
00098
00099
00100
00101
00102
00103 #if ! NULLLB_CONVERSE
00104
00105
00106 CpvAccess(_qd)->create(-1);
00107 thisProxy[CkMyPe()].migrationsDone();
00108 #else
00109
00110 envelope *env = UsrToEnv(CkAllocSysMsg());
00111 CmiSetHandler(env, _migDoneHandle);
00112 CmiSyncSendAndFree(CkMyPe(), env->getTotalsize(), (char *)env);
00113 #endif
00114 }
00115
00116 void NullLB::migrationsDone(void)
00117 {
00118 #if ! NULLLB_CONVERSE
00119
00120 CpvAccess(_qd)->process(-1);
00121 #endif
00122 theLbdb->ResumeClients();
00123 }
00124
00125 #else
00126
00127
00128
00129 void NullLB::init(void) {}
00130 NullLB::~NullLB() {}
00131 void NullLB::staticAtSync(void* data) {}
00132 void NullLB::AtSync() {}
00133 void NullLB::migrationsDone(void) {}
00134 #endif
00135
00136 #include "NullLB.def.h"
00137
00138