void ManualObjectQueryProcessor::onObjectNodeSession(const SpaceID& space, const ObjectReference& oref, const OHDP::NodeID& id) { QPLOG(detailed, "New object-space node session: " << oref << " connected to " << space << "-" << id); OHDP::SpaceNodeID snid(space, id); SpaceObjectReference sporef(space, oref); ObjectStateMap::iterator obj_it = mObjectState.find(sporef); // First, clear out old state. This needs to happen before any changes are // made so it can clear out all the old state if (obj_it != mObjectState.end() && obj_it->second.node != OHDP::NodeID::null()) { OHDP::SpaceNodeID old_snid(obj_it->first.space(), obj_it->second.node); mServerQueryHandler.decrementServerQuery(old_snid); if (obj_it->second.registered) unregisterObjectQuery(sporef); } // Update state // Object no longer has a session, it's no longer relevant if (id == OHDP::NodeID::null()) { if (obj_it != mObjectState.end()) mObjectState.erase(obj_it); return; } // Otherwise it's new/migrating if (obj_it == mObjectState.end()) obj_it = mObjectState.insert( ObjectStateMap::value_type(sporef, ObjectState()) ).first; obj_it->second.node = id; // Figure out if we need to do anything for registration. At a minimum, // hold onto the server query handler. mServerQueryHandler.incrementServerQuery(snid); // *Don't* try to register. Instead, we need to wait until we're really // fully connected, i.e. until we get an SST stream callback }
bool HostedObject::delegateODPPortSend(const ODP::Endpoint& source_ep, const ODP::Endpoint& dest_ep, MemoryReference payload) { assert(source_ep.space() == dest_ep.space()); SpaceObjectReference sporef(source_ep.space(), source_ep.object()); if (stopped()) return false; return mObjectHost->send(sporef,source_ep.space(), source_ep.port(), dest_ep.object().getAsUUID(),dest_ep.port(), payload); }
void HostedObject::requestQueryUpdate(const SpaceID& space, const ObjectReference& oref, const String& new_query) { if (stopped()) { HO_LOG(detailed,"Ignoring query update request after system stop."); return; } SpaceObjectReference sporef(space,oref); Mutex::scoped_lock lock(presenceDataMutex); PresenceDataMap::iterator pdmIter = mPresenceData.find(sporef); if (pdmIter != mPresenceData.end()) { pdmIter->second->query = new_query; } else { SILOG(cppoh,error,"Error in cppoh, requesting solid angle update for presence that doesn't exist in your presence map."); } mObjectHost->getQueryProcessor()->updateQuery(getSharedPtr(), sporef, new_query); }
void HostedObject::disconnectFromSpace(const SpaceID &spaceID, const ObjectReference& oref) { if (stopped()) { HO_LOG(detailed,"Ignoring disconnection request after system stop requested."); return; } SpaceObjectReference sporef(spaceID, oref); Mutex::scoped_lock locker(presenceDataMutex); PresenceDataMap::iterator where; where=mPresenceData.find(sporef); if (where!=mPresenceData.end()) { // Need to actually send a disconnection request to the space. Note that // this occurse *before* getting rid of the other data so callbacks // invoked as a result still work. mObjectHost->disconnectObject(spaceID,oref); delete where->second; mPresenceData.erase(where); mObjectHost->unregisterHostedObject(sporef, this); } else { SILOG(cppoh,error,"Attempting to disconnect from space "<<spaceID<<" and object: "<< oref<<" when not connected to it..."); } }