X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fhla%2FRTI13ObjectInstance.cxx;h=7333d43c633ead9d792aca976b2dd087abfd278c;hb=a563cfd0f2a5e68ad0eab1a371b141fab4ddd59e;hp=87f6a42d8fe4a5b570f63af42122279371406654;hpb=05272d10703f040cbd3a0d972e05a9bc0ee46e14;p=simgear.git diff --git a/simgear/hla/RTI13ObjectInstance.cxx b/simgear/hla/RTI13ObjectInstance.cxx index 87f6a42d..7333d43c 100644 --- a/simgear/hla/RTI13ObjectInstance.cxx +++ b/simgear/hla/RTI13ObjectInstance.cxx @@ -20,15 +20,15 @@ namespace simgear { -RTI13ObjectInstance::RTI13ObjectInstance(const RTI::ObjectHandle& handle, HLAObjectInstance* hlaObjectInstance, - const RTI13ObjectClass* objectClass, RTI13Ambassador* ambassador, bool owned) : - RTIObjectInstance(hlaObjectInstance), +RTI13ObjectInstance::RTI13ObjectInstance(const RTI::ObjectHandle& handle, HLAObjectInstance* objectInstance, + const RTI13ObjectClass* objectClass, RTI13Ambassador* ambassador) : + RTIObjectInstance(objectInstance), _handle(handle), _objectClass(objectClass), _ambassador(ambassador), _attributeValuePairSet(RTI::AttributeSetFactory::create(objectClass->getNumAttributes())) { - updateAttributesFromClass(owned); + _setNumAttributes(getNumAttributes()); } RTI13ObjectInstance::~RTI13ObjectInstance() @@ -50,14 +50,13 @@ RTI13ObjectInstance::get13ObjectClass() const std::string RTI13ObjectInstance::getName() const { - SGSharedPtr ambassador = _ambassador.lock(); - if (!ambassador.valid()) { + if (!_ambassador.valid()) { SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero."); return std::string(); } try { - return ambassador->getObjectInstanceName(_handle); + return _ambassador->getObjectInstanceName(_handle); } catch (RTI::ObjectNotKnown& e) { SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object name: " << e._name << " " << e._reason); return std::string(); @@ -77,28 +76,21 @@ RTI13ObjectInstance::getName() const } void -RTI13ObjectInstance::addToRequestQueue() +RTI13ObjectInstance::deleteObjectInstance(const RTIData& tag) { - SGSharedPtr ambassador = _ambassador.lock(); - if (!ambassador.valid()) { + if (!_ambassador.valid()) { SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero."); return; } - ambassador->addObjectInstanceForCallback(this); -} - -void -RTI13ObjectInstance::deleteObjectInstance(const RTIData& tag) -{ - SGSharedPtr ambassador = _ambassador.lock(); - if (!ambassador.valid()) { - SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero."); + SGSharedPtr federate = _ambassador->_federate.lock(); + if (!federate.valid()) { + SG_LOG(SG_NETWORK, SG_WARN, "Error: Federate is zero."); return; } try { - ambassador->deleteObjectInstance(_handle, tag); + _ambassador->deleteObjectInstance(_handle, tag); } catch (RTI::ObjectNotKnown& e) { SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason); } catch (RTI::DeletePrivilegeNotHeld& e) { @@ -119,14 +111,19 @@ RTI13ObjectInstance::deleteObjectInstance(const RTIData& tag) void RTI13ObjectInstance::deleteObjectInstance(const SGTimeStamp& timeStamp, const RTIData& tag) { - SGSharedPtr ambassador = _ambassador.lock(); - if (!ambassador.valid()) { + if (!_ambassador.valid()) { SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero."); return; } + SGSharedPtr federate = _ambassador->_federate.lock(); + if (!federate.valid()) { + SG_LOG(SG_NETWORK, SG_WARN, "Error: Federate is zero."); + return; + } + try { - ambassador->deleteObjectInstance(_handle, timeStamp, tag); + _ambassador->deleteObjectInstance(_handle, timeStamp, tag); } catch (RTI::ObjectNotKnown& e) { SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason); } catch (RTI::DeletePrivilegeNotHeld& e) { @@ -149,14 +146,19 @@ RTI13ObjectInstance::deleteObjectInstance(const SGTimeStamp& timeStamp, const RT void RTI13ObjectInstance::localDeleteObjectInstance() { - SGSharedPtr ambassador = _ambassador.lock(); - if (!ambassador.valid()) { + if (!_ambassador.valid()) { SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero."); return; } + SGSharedPtr federate = _ambassador->_federate.lock(); + if (!federate.valid()) { + SG_LOG(SG_NETWORK, SG_WARN, "Error: Federate is zero."); + return; + } + try { - ambassador->localDeleteObjectInstance(_handle); + _ambassador->localDeleteObjectInstance(_handle); } catch (RTI::ObjectNotKnown& e) { SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason); } catch (RTI::FederateOwnsAttributes& e) { @@ -175,73 +177,79 @@ RTI13ObjectInstance::localDeleteObjectInstance() } void -RTI13ObjectInstance::reflectAttributeValues(const RTI::AttributeHandleValuePairSet& attributeValuePairSet, const RTIData& tag) +RTI13ObjectInstance::reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, + const RTIData& tag, HLAIndexList& indexPool) { - // Retrieve an empty update struct from the memory pool - UpdateList updateList; - getUpdateFromPool(updateList); - - RTI::ULong numAttribs = attributeValuePairSet.size(); - for (RTI::ULong i = 0; i < numAttribs; ++i) { - unsigned index = getAttributeIndex(attributeValuePairSet.getHandle(i)); - // Get a RTIData from the data pool - getDataFromPool(index, updateList.back()._indexDataPairList); - RTI::ULong length = attributeValuePairSet.getValueLength(i); - updateList.back()._indexDataPairList.back().second.resize(length); - attributeValuePairSet.getValue(i, updateList.back()._indexDataPairList.back().second.data(), length); - updateList.back()._tag = tag; + HLAIndexList reflectedIndices; + for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin(); + i != attributeHandleDataPairList.end(); ++i) { + unsigned index = getAttributeIndex(i->first); + _attributeData[index]._data.swap(i->second); + + if (indexPool.empty()) + reflectedIndices.push_back(index); + else { + reflectedIndices.splice(reflectedIndices.end(), indexPool, indexPool.begin()); + reflectedIndices.back() = index; + } } - RTIObjectInstance::reflectAttributeValues(updateList.front()._indexDataPairList, tag); - // Return the update data back to the pool - putUpdateToPool(updateList); + RTIObjectInstance::reflectAttributeValues(reflectedIndices, tag); + + // Return the index list to the pool + indexPool.splice(indexPool.end(), reflectedIndices); } void -RTI13ObjectInstance::reflectAttributeValues(const RTI::AttributeHandleValuePairSet& attributeValuePairSet, const SGTimeStamp& timeStamp, const RTIData& tag) +RTI13ObjectInstance::reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, + const SGTimeStamp& timeStamp, const RTIData& tag, HLAIndexList& indexPool) { - // Retrieve an empty update struct from the memory pool - UpdateList updateList; - getUpdateFromPool(updateList); - - RTI::ULong numAttribs = attributeValuePairSet.size(); - for (RTI::ULong i = 0; i < numAttribs; ++i) { - unsigned index = getAttributeIndex(attributeValuePairSet.getHandle(i)); - // Get a RTIData from the data pool - getDataFromPool(index, updateList.back()._indexDataPairList); - RTI::ULong length = attributeValuePairSet.getValueLength(i); - updateList.back()._indexDataPairList.back().second.resize(length); - attributeValuePairSet.getValue(i, updateList.back()._indexDataPairList.back().second.data(), length); - updateList.back()._tag = tag; + HLAIndexList reflectedIndices; + for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin(); + i != attributeHandleDataPairList.end(); ++i) { + unsigned index = getAttributeIndex(i->first); + _attributeData[index]._data.swap(i->second); + + if (indexPool.empty()) + reflectedIndices.push_back(index); + else { + reflectedIndices.splice(reflectedIndices.end(), indexPool, indexPool.begin()); + reflectedIndices.back() = index; + } } - scheduleUpdates(timeStamp, updateList); + RTIObjectInstance::reflectAttributeValues(reflectedIndices, timeStamp, tag); + + // Return the index list to the pool + indexPool.splice(indexPool.end(), reflectedIndices); } void -RTI13ObjectInstance::requestObjectAttributeValueUpdate() +RTI13ObjectInstance::requestObjectAttributeValueUpdate(const HLAIndexList& indexList) { - SGSharedPtr ambassador = _ambassador.lock(); - if (!ambassador.valid()) { + if (!_ambassador.valid()) { SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero."); return; } + if (indexList.empty()) + return; + try { unsigned numAttributes = getNumAttributes(); std::auto_ptr attributeHandleSet(RTI::AttributeHandleSetFactory::create(numAttributes)); - for (unsigned i = 0; i < numAttributes; ++i) { - if (!getRequestAttributeUpdate(i)) + for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) { + if (getAttributeOwned(*i)) { + SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectInstance::requestObjectAttributeValueUpdate(): " + "Invalid attribute index!"); continue; - attributeHandleSet->add(getAttributeHandle(i)); + } + attributeHandleSet->add(getAttributeHandle(*i)); } if (!attributeHandleSet->size()) return; - ambassador->requestObjectAttributeValueUpdate(_handle, *attributeHandleSet); - - for (unsigned i = 0; i < numAttributes; ++i) - setRequestAttributeUpdate(i, false); + _ambassador->requestObjectAttributeValueUpdate(_handle, *attributeHandleSet); return; } catch (RTI::ObjectNotKnown& e) { @@ -272,21 +280,20 @@ RTI13ObjectInstance::requestObjectAttributeValueUpdate() } void -RTI13ObjectInstance::provideAttributeValueUpdate(const RTI::AttributeHandleSet& attributes) +RTI13ObjectInstance::provideAttributeValueUpdate(const std::vector& attributeHandleSet) { // Called from the ambassador. Just marks some instance attributes dirty so that they are sent with the next update - RTI::ULong numAttribs = attributes.size(); + size_t numAttribs = attributeHandleSet.size(); for (RTI::ULong i = 0; i < numAttribs; ++i) { - unsigned index = getAttributeIndex(attributes.getHandle(i)); - setAttributeForceUpdate(index); + unsigned index = getAttributeIndex(attributeHandleSet[i]); + _attributeData[index]._dirty = true; } } void RTI13ObjectInstance::updateAttributeValues(const RTIData& tag) { - SGSharedPtr ambassador = _ambassador.lock(); - if (!ambassador.valid()) { + if (!_ambassador.valid()) { SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero."); return; } @@ -297,25 +304,19 @@ RTI13ObjectInstance::updateAttributeValues(const RTIData& tag) unsigned numAttributes = getNumAttributes(); for (unsigned i = 0; i < numAttributes; ++i) { - if (!getAttributeEffectiveUpdateEnabled(i)) + if (!_attributeData[i]._dirty) continue; - const HLADataElement* dataElement = getDataElement(i); - if (!dataElement) - continue; - // FIXME cache somewhere - RTIData data; - HLAEncodeStream stream(data); - dataElement->encode(stream); + const RTIData& data = _attributeData[i]._data; _attributeValuePairSet->add(getAttributeHandle(i), data.data(), data.size()); } if (!_attributeValuePairSet->size()) return; - ambassador->updateAttributeValues(_handle, *_attributeValuePairSet, tag); + _ambassador->updateAttributeValues(_handle, *_attributeValuePairSet, tag); for (unsigned i = 0; i < numAttributes; ++i) { - setAttributeUpdated(i); + _attributeData[i]._dirty = false; } } catch (RTI::ObjectNotKnown& e) { @@ -343,8 +344,7 @@ RTI13ObjectInstance::updateAttributeValues(const RTIData& tag) void RTI13ObjectInstance::updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag) { - SGSharedPtr ambassador = _ambassador.lock(); - if (!ambassador.valid()) { + if (!_ambassador.valid()) { SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero."); return; } @@ -355,25 +355,19 @@ RTI13ObjectInstance::updateAttributeValues(const SGTimeStamp& timeStamp, const R unsigned numAttributes = getNumAttributes(); for (unsigned i = 0; i < numAttributes; ++i) { - if (!getAttributeEffectiveUpdateEnabled(i)) - continue; - const HLADataElement* dataElement = getDataElement(i); - if (!dataElement) + if (!_attributeData[i]._dirty) continue; - // FIXME cache somewhere - RTIData data; - HLAEncodeStream stream(data); - dataElement->encode(stream); + const RTIData& data = _attributeData[i]._data; _attributeValuePairSet->add(getAttributeHandle(i), data.data(), data.size()); } if (!_attributeValuePairSet->size()) return; - ambassador->updateAttributeValues(_handle, *_attributeValuePairSet, timeStamp, tag); + _ambassador->updateAttributeValues(_handle, *_attributeValuePairSet, timeStamp, tag); for (unsigned i = 0; i < numAttributes; ++i) { - setAttributeUpdated(i); + _attributeData[i]._dirty = false; } } catch (RTI::ObjectNotKnown& e) { @@ -401,72 +395,114 @@ RTI13ObjectInstance::updateAttributeValues(const SGTimeStamp& timeStamp, const R } void -RTI13ObjectInstance::attributesInScope(const RTI::AttributeHandleSet& attributeHandleSet) +RTI13ObjectInstance::attributesInScope(const std::vector& attributeHandleSet) { - RTI::ULong numAttribs = attributeHandleSet.size(); + size_t numAttribs = attributeHandleSet.size(); for (RTI::ULong i = 0; i < numAttribs; ++i) { - RTI::AttributeHandle attributeHandle = attributeHandleSet.getHandle(i); + RTI::AttributeHandle attributeHandle = attributeHandleSet[i]; setAttributeInScope(getAttributeIndex(attributeHandle), true); } } void -RTI13ObjectInstance::attributesOutOfScope(const RTI::AttributeHandleSet& attributeHandleSet) +RTI13ObjectInstance::attributesOutOfScope(const std::vector& attributeHandleSet) { - RTI::ULong numAttribs = attributeHandleSet.size(); + size_t numAttribs = attributeHandleSet.size(); for (RTI::ULong i = 0; i < numAttribs; ++i) { - RTI::AttributeHandle attributeHandle = attributeHandleSet.getHandle(i); + RTI::AttributeHandle attributeHandle = attributeHandleSet[i]; setAttributeInScope(getAttributeIndex(attributeHandle), false); } } void -RTI13ObjectInstance::turnUpdatesOnForObjectInstance(const RTI::AttributeHandleSet& attributeHandleSet) +RTI13ObjectInstance::turnUpdatesOnForObjectInstance(const std::vector& attributeHandleSet) { - RTI::ULong numAttribs = attributeHandleSet.size(); + size_t numAttribs = attributeHandleSet.size(); for (RTI::ULong i = 0; i < numAttribs; ++i) { - RTI::AttributeHandle attributeHandle = attributeHandleSet.getHandle(i); + RTI::AttributeHandle attributeHandle = attributeHandleSet[i]; setAttributeUpdateEnabled(getAttributeIndex(attributeHandle), true); } } void -RTI13ObjectInstance::turnUpdatesOffForObjectInstance(const RTI::AttributeHandleSet& attributeHandleSet) +RTI13ObjectInstance::turnUpdatesOffForObjectInstance(const std::vector& attributeHandleSet) { - RTI::ULong numAttribs = attributeHandleSet.size(); + size_t numAttribs = attributeHandleSet.size(); for (RTI::ULong i = 0; i < numAttribs; ++i) { - RTI::AttributeHandle attributeHandle = attributeHandleSet.getHandle(i); + RTI::AttributeHandle attributeHandle = attributeHandleSet[i]; setAttributeUpdateEnabled(getAttributeIndex(attributeHandle), false); } } +bool +RTI13ObjectInstance::isAttributeOwnedByFederate(unsigned index) const +{ + if (!_ambassador.valid()) { + SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero."); + return false; + } + try { + RTI::AttributeHandle attributeHandle = getAttributeHandle(index); + return _ambassador->isAttributeOwnedByFederate(_handle, attributeHandle); + } catch (RTI::ObjectNotKnown& e) { + SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": " + << e._name << " " << e._reason); + return false; + } catch (RTI::AttributeNotDefined& e) { + SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": " + << e._name << " " << e._reason); + return false; + } catch (RTI::FederateNotExecutionMember& e) { + SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": " + << e._name << " " << e._reason); + return false; + } catch (RTI::ConcurrentAccessAttempted& e) { + SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": " + << e._name << " " << e._reason); + return false; + } catch (RTI::SaveInProgress& e) { + SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": " + << e._name << " " << e._reason); + return false; + } catch (RTI::RestoreInProgress& e) { + SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": " + << e._name << " " << e._reason); + return false; + } catch (RTI::RTIinternalError& e) { + SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query attribute ownership for index " << index << ": " + << e._name << " " << e._reason); + return false; + } + return false; + } + void -RTI13ObjectInstance::requestAttributeOwnershipAssumption(const RTI::AttributeHandleSet& attributes, const RTIData& tag) +RTI13ObjectInstance::requestAttributeOwnershipAssumption(const std::vector& attributes, const RTIData& tag) { } void -RTI13ObjectInstance::attributeOwnershipDivestitureNotification(const RTI::AttributeHandleSet& attributes) +RTI13ObjectInstance::attributeOwnershipDivestitureNotification(const std::vector& attributes) { } void -RTI13ObjectInstance::attributeOwnershipAcquisitionNotification(const RTI::AttributeHandleSet& attributes) +RTI13ObjectInstance::attributeOwnershipAcquisitionNotification(const std::vector& attributes) { } void -RTI13ObjectInstance::attributeOwnershipUnavailable(const RTI::AttributeHandleSet& attributes) +RTI13ObjectInstance::attributeOwnershipUnavailable(const std::vector& attributes) { } void -RTI13ObjectInstance::requestAttributeOwnershipRelease(const RTI::AttributeHandleSet& attributes, const RTIData& tag) +RTI13ObjectInstance::requestAttributeOwnershipRelease(const std::vector& attributes, const RTIData& tag) { } void -RTI13ObjectInstance::confirmAttributeOwnershipAcquisitionCancellation(const RTI::AttributeHandleSet& attributes) +RTI13ObjectInstance::confirmAttributeOwnershipAcquisitionCancellation(const std::vector& attributes) { }