// remove the obj-th object from database void BaseLB::LDStats::removeObject(int obj) { CmiAssert(obj < objData.size()); LDObjData odata = objData[obj]; LDObjKey okey; // build a key okey.omID() = odata.omID(); okey.objID() = odata.objID(); objData.remove(obj); from_proc.remove(obj); to_proc.remove(obj); n_objs --; if (odata.migratable) n_migrateobjs --; // search for sender, can be multiple sender int removed = 0; for (int com=0; com<n_comm; com++) { LDCommData &cdata = commData[com-removed]; if(!cdata.from_proc() && cdata.sender == okey) { commData.remove(com-removed); removed++; } } n_comm -= removed; }
// an object arrives with only objdata void HybridBaseLB::ObjMigrated(LDObjData data, LDCommData *cdata, int n, int atlevel) { LevelData *lData = levelData[atlevel]; LDStats *statsData = lData->statsData; if (statsData != NULL) { CkVec<LDObjData> &oData = statsData->objData; // copy into LDStats oData.push_back(data); statsData->n_objs++; if (data.migratable) statsData->n_migrateobjs++; // an incoming object to the root // pretend this object belongs to it statsData->from_proc.push_back(lData->nChildren); statsData->to_proc.push_back(lData->nChildren); // copy into comm data if (n) { CkVec<LDCommData> &cData = statsData->commData; for (int i=0; i<n; i++) cData.push_back(cdata[i]); statsData->n_comm += n; statsData->deleteCommHash(); } } else { // leaf node, from which proc is unknown at this time LDObjKey key; key.omID() = data.omID(); key.objID() = data.objID(); newObjs.push_back(Location(key, -1)); } lData->obj_completed++; if (lData->migrationDone()) { StatsDone(atlevel); } }