00001
00005
00006 #include <converse.h>
00007
00008 #if CMK_LBDB_ON
00009
00010 #include <math.h>
00011 #include "LBComm.h"
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 LBCommData* LBCommTable::HashInsert(const LBCommData &data)
00026 {
00027 if (in_use > cur_sz/2)
00028 Resize();
00029 int i = 0;
00030 int j;
00031 do {
00032 j = data.hash(i,cur_sz);
00033
00034 if (state[j] == nil) {
00035 state[j] = InUse;
00036 set[j] = data;
00037 in_use++;
00038 return &set[j];
00039 } else i++;
00040 } while (i != cur_sz);
00041
00042
00043
00044 CmiPrintf("HashInsert Couldn't insert!\n");
00045 return 0;
00046 }
00047
00048 LBCommData* LBCommTable::HashSearch(const LBCommData &data)
00049 {
00050 int i=0;
00051 int j;
00052 do {
00053 j = data.hash(i,cur_sz);
00054 if (state[j] != nil && set[j].equal(data)) {
00055 return &set[j];
00056 }
00057 i++;
00058 } while (state[j] != nil && i != cur_sz);
00059 return 0;
00060 }
00061
00062 LBCommData* LBCommTable::HashInsertUnique(const LBCommData &data)
00063 {
00064 LBCommData* item = HashSearch(data);
00065 if (!item) {
00066 item = HashInsert(data);
00067 }
00068 return item;
00069 }
00070
00071 void LBCommTable::Resize()
00072 {
00073 LBCommData* old_set = set;
00074 TableState* old_state = state;
00075 int old_sz = cur_sz;
00076
00077 NewTable(old_sz*2);
00078 for(int i=0; i < old_sz; i++) {
00079 if (old_state[i] == InUse)
00080 HashInsert(old_set[i]);
00081 }
00082 delete [] old_set;
00083 delete [] old_state;
00084 }
00085
00086 CmiBool LBCommData::equal(const LBCommData &d2) const
00087 {
00088 if (from_proc()) {
00089 if (src_proc != d2.src_proc)
00090 return CmiFalse;
00091 } else {
00092 if (!LDOMidEqual(srcObj.omID(), d2.srcObj.omID())
00093 || !LDObjIDEqual(srcObj.objID(),d2.srcObj.objID()) )
00094 return CmiFalse;
00095 }
00096 return (CmiBool)(destObj == d2.destObj);
00097 }
00098
00099 int LBCommData::compute_key()
00100 {
00101 int kstring[80];
00102 char* kptr = (char*)((void*)(&(kstring[0])));
00103 int pcount;
00104
00105 if (from_proc()) {
00106 pcount = sprintf(kptr,"%d",src_proc);
00107 kptr += pcount;
00108 } else {
00109 pcount = sprintf(kptr,"%d%d%d%d%d",srcObj.omID().id.idx,
00110 srcObj.id.id[0],srcObj.id.id[1],
00111 srcObj.id.id[2],srcObj.id.id[3]);
00112 kptr += pcount;
00113 }
00114
00115
00116 switch (destObj.get_type()) {
00117 case LD_PROC_MSG:
00118 pcount += sprintf(kptr,"%d", destObj.proc());
00119 break;
00120 case LD_OBJ_MSG: {
00121 LDObjKey &destKey = destObj.get_destObj();
00122 pcount += sprintf(kptr,"%d%d%d%d%dXXXXXXXX",destKey.omID().id.idx,
00123 destKey.objID().id[0],destKey.objID().id[1],
00124 destKey.objID().id[2],destKey.objID().id[3]);
00125 pcount -= 8;
00126 break;
00127 }
00128 case LD_OBJLIST_MSG: {
00129 int len;
00130 LDObjKey *destKeys = destObj.get_destObjs(len);
00131 CmiAssert(len>0);
00132 pcount += sprintf(kptr,"%d%d%d%d%dXXXXXXXX",destKeys[0].omID().id.idx,
00133 destKeys[0].objID().id[0],destKeys[0].objID().id[1],
00134 destKeys[0].objID().id[2],destKeys[0].objID().id[3]);
00135 pcount -= 8;
00136 break;
00137 }
00138 }
00139
00140 int k=-1;
00141 for(int i=0; i < (pcount+3)/4; i++)
00142 k ^= kstring[i];
00143
00144
00145
00146 return k;
00147 }
00148
00149 int LBCommData::hash(const int i, const int m) const
00150 {
00151 const double a = 0.6803398875;
00152 const int k = key();
00153 const double ka = k * a;
00154
00155 int h1 = (int) floor(m*(ka-floor(ka)));
00156 int h2 = 1;
00157
00158
00159
00160 return (h1 + i * h2) % m;
00161 }
00162
00163 void LBCommTable::GetCommData(LDCommData* data)
00164 {
00165 LDCommData* out=data;
00166 LBCommData* curtable=set;
00167 TableState* curstate=state;
00168 int i;
00169
00170 for(i=0; i < cur_sz; i++, curtable++, curstate++) {
00171 if (*curstate == InUse) {
00172 out->clearHash();
00173 if (curtable->from_proc()) {
00174 out->src_proc = curtable->src_proc;
00175 } else {
00176 out->src_proc = -1;
00177 out->sender.omID() = curtable->srcObj.omID();
00178 out->sender.objID() = curtable->srcObj.objID();
00179 }
00180 out->receiver = curtable->destObj;
00181 out->messages = curtable->n_messages;
00182 out->bytes = curtable->n_bytes;
00183 out++;
00184 }
00185 }
00186 }
00187
00188 #endif // CMK_LBDB_ON
00189