diff --git a/include/uxr/agent/client/ProxyClient.hpp b/include/uxr/agent/client/ProxyClient.hpp index 35323001e..622b51022 100644 --- a/include/uxr/agent/client/ProxyClient.hpp +++ b/include/uxr/agent/client/ProxyClient.hpp @@ -24,7 +24,7 @@ namespace eprosima { namespace uxr { -class ProxyClient +class ProxyClient : public std::enable_shared_from_this { public: enum class State : uint8_t @@ -64,12 +64,16 @@ class ProxyClient dds::xrce::SessionId get_session_id() const { return representation_.session_id(); } + void release(); + Session& session(); State get_state(); void update_state(); + Middleware& get_middleware() { return *middleware_ ; }; + private: bool create_object( const dds::xrce::ObjectId& object_id, diff --git a/include/uxr/agent/datareader/DataReader.hpp b/include/uxr/agent/datareader/DataReader.hpp index 292f9694a..e8a3c1387 100644 --- a/include/uxr/agent/datareader/DataReader.hpp +++ b/include/uxr/agent/datareader/DataReader.hpp @@ -26,15 +26,16 @@ namespace eprosima { namespace uxr { +class ProxyClient; class Subscriber; class Topic; -class Middleware; /** * Callback data structure. */ struct ReadCallbackArgs { + std::shared_ptr client; dds::xrce::ClientKey client_key; dds::xrce::StreamId stream_id; dds::xrce::ObjectId object_id; @@ -68,8 +69,6 @@ class DataReader : public XRCEObject bool matched( const dds::xrce::ObjectVariant& new_object_rep) const override; - Middleware& get_middleware() const override; - bool read( const dds::xrce::READ_DATA_Payload& read_data, read_callback read_cb, diff --git a/include/uxr/agent/datawriter/DataWriter.hpp b/include/uxr/agent/datawriter/DataWriter.hpp index a2145cb36..b3dbe7e80 100644 --- a/include/uxr/agent/datawriter/DataWriter.hpp +++ b/include/uxr/agent/datawriter/DataWriter.hpp @@ -43,7 +43,6 @@ class DataWriter : public XRCEObject void release(ObjectContainer&) override {} bool matched(const dds::xrce::ObjectVariant& new_object_rep) const override; - Middleware& get_middleware() const override; bool write(dds::xrce::WRITE_DATA_Payload_Data& write_data); bool write(const std::vector& data); diff --git a/include/uxr/agent/object/XRCEObject.hpp b/include/uxr/agent/object/XRCEObject.hpp index 391e3c062..18ac514a8 100644 --- a/include/uxr/agent/object/XRCEObject.hpp +++ b/include/uxr/agent/object/XRCEObject.hpp @@ -56,7 +56,6 @@ class XRCEObject uint16_t get_raw_id() const { return conversion::objectid_to_raw(id_); } virtual bool matched(const dds::xrce::ObjectVariant& new_object_rep) const = 0; virtual void release(ObjectContainer& root_objects) = 0; - virtual Middleware& get_middleware() const = 0; private: dds::xrce::ObjectId id_; diff --git a/include/uxr/agent/participant/Participant.hpp b/include/uxr/agent/participant/Participant.hpp index 49ec31051..5813eee08 100644 --- a/include/uxr/agent/participant/Participant.hpp +++ b/include/uxr/agent/participant/Participant.hpp @@ -23,14 +23,15 @@ namespace eprosima { namespace uxr { -class Middleware; +class ProxyClient; class Participant : public XRCEObject { public: - static std::unique_ptr create(const dds::xrce::ObjectId& object_id, - const dds::xrce::OBJK_PARTICIPANT_Representation& representation, - Middleware& middleware); + static std::unique_ptr create( + const dds::xrce::ObjectId& object_id, + const std::shared_ptr& proxy_client, + const dds::xrce::OBJK_PARTICIPANT_Representation& representation); virtual ~Participant() override; @@ -43,16 +44,17 @@ class Participant : public XRCEObject void tie_object(const dds::xrce::ObjectId& object_id) { tied_objects_.insert(object_id); } void untie_object(const dds::xrce::ObjectId& object_id) { tied_objects_.erase(object_id); } bool matched(const dds::xrce::ObjectVariant& new_object_rep) const override; - Middleware& get_middleware() const override { return middleware_; } + + const std::shared_ptr& get_proxy_client() { return proxy_client_; }; private: Participant( const dds::xrce::ObjectId& id, - Middleware& middleware); + const std::shared_ptr& proxy_client); private: + std::shared_ptr proxy_client_; std::set tied_objects_; - Middleware& middleware_; }; } // namespace uxr diff --git a/include/uxr/agent/publisher/Publisher.hpp b/include/uxr/agent/publisher/Publisher.hpp index 61d6cb59f..f887a5d5f 100644 --- a/include/uxr/agent/publisher/Publisher.hpp +++ b/include/uxr/agent/publisher/Publisher.hpp @@ -43,7 +43,6 @@ class Publisher : public XRCEObject void tie_object(const dds::xrce::ObjectId& object_id) { tied_objects_.insert(object_id); } void untie_object(const dds::xrce::ObjectId& object_id) { tied_objects_.erase(object_id); } bool matched(const dds::xrce::ObjectVariant& ) const override { return true; } - Middleware& get_middleware() const override; const std::shared_ptr& get_participant() { return participant_; } diff --git a/include/uxr/agent/subscriber/Subscriber.hpp b/include/uxr/agent/subscriber/Subscriber.hpp index e852c5fb0..6146fc373 100644 --- a/include/uxr/agent/subscriber/Subscriber.hpp +++ b/include/uxr/agent/subscriber/Subscriber.hpp @@ -42,7 +42,6 @@ class Subscriber : public XRCEObject void tie_object(const dds::xrce::ObjectId& object_id) { tied_objects_.insert(object_id); } void untie_object(const dds::xrce::ObjectId& object_id) { tied_objects_.erase(object_id); } bool matched(const dds::xrce::ObjectVariant& ) const override { return true; } - Middleware& get_middleware() const override; const std::shared_ptr& get_participant() { return participant_; } diff --git a/include/uxr/agent/topic/Topic.hpp b/include/uxr/agent/topic/Topic.hpp index 5bf8ed4e9..37f2bda55 100644 --- a/include/uxr/agent/topic/Topic.hpp +++ b/include/uxr/agent/topic/Topic.hpp @@ -44,7 +44,6 @@ class Topic : public XRCEObject void tie_object(const dds::xrce::ObjectId& object_id) { tied_objects_.insert(object_id); } void untie_object(const dds::xrce::ObjectId& object_id) { tied_objects_.erase(object_id); } bool matched(const dds::xrce::ObjectVariant& new_object_rep) const override; - Middleware& get_middleware() const override; private: Topic( diff --git a/src/cpp/Root.cpp b/src/cpp/Root.cpp index 2a77a6053..c1d5b81fd 100644 --- a/src/cpp/Root.cpp +++ b/src/cpp/Root.cpp @@ -43,7 +43,14 @@ Root::Root() } /* It must be here instead of the hpp because the forward declaration of Middleware in the hpp. */ -Root::~Root() = default; +Root::~Root() +{ + for (auto it = clients_.begin(); it != clients_.end(); ) + { + it->second->release(); + it = clients_.erase(it); + } +} dds::xrce::ResultStatus Root::create_client( const dds::xrce::CLIENT_Representation& client_representation, @@ -157,13 +164,14 @@ dds::xrce::ResultStatus Root::get_info(dds::xrce::ObjectInfo& agent_info) dds::xrce::ResultStatus Root::delete_client(const dds::xrce::ClientKey& client_key) { dds::xrce::ResultStatus result_status; - if (get_client(client_key)) + if (std::shared_ptr client = get_client(client_key)) { std::lock_guard lock(mtx_); if (current_client_ != clients_.end() && client_key == current_client_->first) { ++current_client_; } + client->release(); clients_.erase(client_key); result_status.status(dds::xrce::STATUS_OK); UXR_AGENT_LOG_INFO( @@ -283,6 +291,11 @@ void Root::set_verbose_level(uint8_t verbose_level) void Root::reset() { std::lock_guard lock(mtx_); + for (auto it = clients_.begin(); it != clients_.end(); ) + { + it->second->release(); + it = clients_.erase(it); + } clients_.clear(); current_client_ = clients_.begin(); } diff --git a/src/cpp/client/ProxyClient.cpp b/src/cpp/client/ProxyClient.cpp index 8f6c1f401..183e27aec 100644 --- a/src/cpp/client/ProxyClient.cpp +++ b/src/cpp/client/ProxyClient.cpp @@ -195,6 +195,11 @@ std::shared_ptr ProxyClient::get_object(const dds::xrce::ObjectId& o return object; } +void ProxyClient::release() +{ + objects_.clear(); +} + Session& ProxyClient::session() { return session_; @@ -248,7 +253,7 @@ bool ProxyClient::create_participant( { bool rv = false; - if (std::unique_ptr participant = Participant::create(object_id, representation, *middleware_)) + if (std::unique_ptr participant = Participant::create(object_id, shared_from_this(), representation)) { if (objects_.emplace(object_id, std::move(participant)).second) { diff --git a/src/cpp/datareader/DataReader.cpp b/src/cpp/datareader/DataReader.cpp index d5086799b..7ff3e854d 100644 --- a/src/cpp/datareader/DataReader.cpp +++ b/src/cpp/datareader/DataReader.cpp @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include @@ -64,7 +64,7 @@ std::unique_ptr DataReader::create( uint16_t raw_object_id = conversion::objectid_to_raw(object_id); std::shared_ptr topic; - Middleware& middleware = subscriber->get_middleware(); + Middleware& middleware = subscriber->get_participant()->get_proxy_client()->get_middleware(); switch (representation.representation()._d()) { case dds::xrce::REPRESENTATION_BY_REFERENCE: @@ -118,7 +118,7 @@ DataReader::~DataReader() noexcept stop_read(); subscriber_->untie_object(get_id()); topic_->untie_object(get_id()); - get_middleware().delete_datareader(get_raw_id()); + subscriber_->get_participant()->get_proxy_client()->get_middleware().delete_datareader(get_raw_id()); } bool DataReader::matched( @@ -136,13 +136,13 @@ bool DataReader::matched( case dds::xrce::REPRESENTATION_BY_REFERENCE: { const std::string& ref = new_object_rep.data_reader().representation().object_reference(); - rv = get_middleware().matched_datareader_from_ref(get_raw_id(), ref); + rv = subscriber_->get_participant()->get_proxy_client()->get_middleware().matched_datareader_from_ref(get_raw_id(), ref); break; } case dds::xrce::REPRESENTATION_AS_XML_STRING: { const std::string& xml = new_object_rep.data_reader().representation().xml_string_representation(); - rv = get_middleware().matched_datareader_from_xml(get_raw_id(), xml); + rv = subscriber_->get_participant()->get_proxy_client()->get_middleware().matched_datareader_from_xml(get_raw_id(), xml); break; } default: @@ -151,11 +151,6 @@ bool DataReader::matched( return rv; } -Middleware& DataReader::get_middleware() const -{ - return subscriber_->get_middleware(); -} - bool DataReader::read( const dds::xrce::READ_DATA_Payload& read_data, read_callback read_cb, @@ -206,14 +201,23 @@ bool DataReader::start_read( bool DataReader::stop_read() { + bool rv = true; std::lock_guard lock(mtx_); - running_cond_ = false; - if (read_thread_.joinable()) + if (running_cond_) { - read_thread_.join(); + running_cond_ = false; + + if (read_thread_.joinable()) + { + read_thread_.join(); + } + else + { + rv = false; + } } - return true; + return rv; } void DataReader::read_task( @@ -221,6 +225,7 @@ void DataReader::read_task( read_callback read_cb, ReadCallbackArgs cb_args) { + cb_args.client = subscriber_->get_participant()->get_proxy_client(); size_t rate = (MAX_BYTES_PER_SECOND_UNLIMITED == delivery_control.max_bytes_per_second()) ? SIZE_MAX : delivery_control.max_bytes_per_second(); @@ -235,7 +240,7 @@ void DataReader::read_task( while (running_cond_ && !stop_cond) { std::chrono::milliseconds read_timeout = get_read_timeout(final_time, delivery_control.max_elapsed_time()); - if (get_middleware().read_data(get_raw_id(), data, read_timeout)) + if (subscriber_->get_participant()->get_proxy_client()->get_middleware().read_data(get_raw_id(), data, read_timeout)) { bool submessage_pushed = false; do diff --git a/src/cpp/datawriter/DataWriter.cpp b/src/cpp/datawriter/DataWriter.cpp index 02263b074..6597422e1 100644 --- a/src/cpp/datawriter/DataWriter.cpp +++ b/src/cpp/datawriter/DataWriter.cpp @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include namespace eprosima { @@ -32,7 +32,7 @@ std::unique_ptr DataWriter::create( uint16_t raw_object_id = conversion::objectid_to_raw(object_id); std::shared_ptr topic; - Middleware& middleware = publisher->get_middleware(); + Middleware& middleware = publisher->get_participant()->get_proxy_client()->get_middleware(); switch (representation.representation()._d()) { case dds::xrce::REPRESENTATION_BY_REFERENCE: @@ -81,7 +81,7 @@ DataWriter::~DataWriter() { publisher_->untie_object(get_id()); topic_->untie_object(get_id()); - get_middleware().delete_datawriter(get_raw_id()); + publisher_->get_participant()->get_proxy_client()->get_middleware().delete_datawriter(get_raw_id()); } bool DataWriter::matched(const dds::xrce::ObjectVariant& new_object_rep) const @@ -98,13 +98,13 @@ bool DataWriter::matched(const dds::xrce::ObjectVariant& new_object_rep) const case dds::xrce::REPRESENTATION_BY_REFERENCE: { const std::string& ref = new_object_rep.data_writer().representation().object_reference(); - rv = get_middleware().matched_datawriter_from_ref(get_raw_id(), ref); + rv = publisher_->get_participant()->get_proxy_client()->get_middleware().matched_datawriter_from_ref(get_raw_id(), ref); break; } case dds::xrce::REPRESENTATION_AS_XML_STRING: { const std::string& xml = new_object_rep.data_writer().representation().xml_string_representation(); - rv = get_middleware().matched_datawriter_from_xml(get_raw_id(), xml); + rv = publisher_->get_participant()->get_proxy_client()->get_middleware().matched_datawriter_from_xml(get_raw_id(), xml); break; } default: @@ -116,7 +116,7 @@ bool DataWriter::matched(const dds::xrce::ObjectVariant& new_object_rep) const bool DataWriter::write(dds::xrce::WRITE_DATA_Payload_Data& write_data) { bool rv = false; - if (get_middleware().write_data(get_raw_id(), write_data.data().serialized_data())) + if (publisher_->get_participant()->get_proxy_client()->get_middleware().write_data(get_raw_id(), write_data.data().serialized_data())) { UXR_AGENT_LOG_MESSAGE( UXR_DECORATE_YELLOW("[** <> **]"), @@ -131,7 +131,7 @@ bool DataWriter::write(dds::xrce::WRITE_DATA_Payload_Data& write_data) bool DataWriter::write(const std::vector& data) { bool rv = false; - if (get_middleware().write_data(get_raw_id(), data)) + if (publisher_->get_participant()->get_proxy_client()->get_middleware().write_data(get_raw_id(), data)) { UXR_AGENT_LOG_MESSAGE( UXR_DECORATE_YELLOW("[** <> **]"), @@ -143,11 +143,5 @@ bool DataWriter::write(const std::vector& data) return rv; } -Middleware& DataWriter::get_middleware() const -{ - return publisher_->get_middleware(); -} - - } // namespace uxr } // namespace eprosima diff --git a/src/cpp/participant/Participant.cpp b/src/cpp/participant/Participant.cpp index 821cef0c8..3096a2fc6 100644 --- a/src/cpp/participant/Participant.cpp +++ b/src/cpp/participant/Participant.cpp @@ -13,15 +13,15 @@ // limitations under the License. #include -#include +#include namespace eprosima { namespace uxr { std::unique_ptr Participant::create( const dds::xrce::ObjectId& object_id, - const dds::xrce::OBJK_PARTICIPANT_Representation& representation, - Middleware& middleware) + const std::shared_ptr& proxy_client, + const dds::xrce::OBJK_PARTICIPANT_Representation& representation) { bool created_entity = false; uint16_t raw_object_id = conversion::objectid_to_raw(object_id); @@ -31,31 +31,32 @@ std::unique_ptr Participant::create( case dds::xrce::REPRESENTATION_BY_REFERENCE: { const std::string& ref_rep = representation.representation().object_reference(); - created_entity = middleware.create_participant_by_ref(raw_object_id, representation.domain_id(), ref_rep); + created_entity = proxy_client->get_middleware().create_participant_by_ref(raw_object_id, representation.domain_id(), ref_rep); break; } case dds::xrce::REPRESENTATION_AS_XML_STRING: { const std::string& xml_rep = representation.representation().xml_string_representation(); - created_entity = middleware.create_participant_by_xml(raw_object_id, representation.domain_id(), xml_rep); + created_entity = proxy_client->get_middleware().create_participant_by_xml(raw_object_id, representation.domain_id(), xml_rep); break; } default: break; } - return (created_entity ? std::unique_ptr(new Participant(object_id, middleware)) : nullptr); + return (created_entity ? std::unique_ptr(new Participant(object_id, proxy_client)) : nullptr); } -Participant::Participant(const dds::xrce::ObjectId& id, - Middleware& middleware) - : XRCEObject(id), - middleware_(middleware) +Participant::Participant( + const dds::xrce::ObjectId& id, + const std::shared_ptr& proxy_client) + : XRCEObject(id) + , proxy_client_{proxy_client} {} Participant::~Participant() { - middleware_.delete_participant(get_raw_id()); + proxy_client_->get_middleware().delete_participant(get_raw_id()); } void Participant::release(ObjectContainer& root_objects) @@ -83,14 +84,14 @@ bool Participant::matched(const dds::xrce::ObjectVariant& new_object_rep) const { const std::string& ref = new_object_rep.participant().representation().object_reference(); const int16_t domain_id = new_object_rep.participant().domain_id(); - rv = middleware_.matched_participant_from_ref(get_raw_id(), domain_id, ref); + rv = proxy_client_->get_middleware().matched_participant_from_ref(get_raw_id(), domain_id, ref); break; } case dds::xrce::REPRESENTATION_AS_XML_STRING: { const std::string& xml = new_object_rep.participant().representation().xml_string_representation(); const int16_t domain_id = new_object_rep.participant().domain_id(); - rv = middleware_.matched_participant_from_xml(get_raw_id(), domain_id, xml); + rv = proxy_client_->get_middleware().matched_participant_from_xml(get_raw_id(), domain_id, xml); break; } default: diff --git a/src/cpp/processor/Processor.cpp b/src/cpp/processor/Processor.cpp index 2bcc5b719..d4dfa187c 100644 --- a/src/cpp/processor/Processor.cpp +++ b/src/cpp/processor/Processor.cpp @@ -654,7 +654,6 @@ bool Processor::read_data_callback( std::chrono::milliseconds timeout) { bool rv = false; - std::shared_ptr client = root_.get_client(cb_args.client_key); /* DATA payload. */ dds::xrce::DATA_Payload_Data data_payload; @@ -668,10 +667,10 @@ bool Processor::read_data_callback( if (output_packet.destination) { /* Push submessage into the output stream. */ - rv = client->session().push_output_submessage(cb_args.stream_id, dds::xrce::DATA, data_payload, timeout); + rv = cb_args.client->session().push_output_submessage(cb_args.stream_id, dds::xrce::DATA, data_payload, timeout); /* Set output message. */ - while (client->session().get_next_output_message(cb_args.stream_id, output_packet.message)) + while (cb_args.client->session().get_next_output_message(cb_args.stream_id, output_packet.message)) { /* Send message. */ server_.push_output_packet(output_packet); diff --git a/src/cpp/publisher/Publisher.cpp b/src/cpp/publisher/Publisher.cpp index df810387a..a3cfe6e9f 100644 --- a/src/cpp/publisher/Publisher.cpp +++ b/src/cpp/publisher/Publisher.cpp @@ -14,7 +14,7 @@ #include #include -#include +#include namespace eprosima { namespace uxr { @@ -27,7 +27,7 @@ std::unique_ptr Publisher::create( bool created_entity = false; uint16_t raw_object_id = conversion::objectid_to_raw(object_id); - Middleware& middleware = participant->get_middleware(); + Middleware& middleware = participant->get_proxy_client()->get_middleware(); switch (representation.representation()._d()) { case dds::xrce::REPRESENTATION_AS_XML_STRING: @@ -58,7 +58,7 @@ Publisher::Publisher( Publisher::~Publisher() { participant_->untie_object(get_id()); - get_middleware().delete_publisher(get_raw_id()); + participant_->get_proxy_client()->get_middleware().delete_publisher(get_raw_id()); } void Publisher::release(ObjectContainer& root_objects) @@ -71,10 +71,5 @@ void Publisher::release(ObjectContainer& root_objects) } } -Middleware& Publisher::get_middleware() const -{ - return participant_->get_middleware(); -} - } // namespace uxr } // namespace eprosima diff --git a/src/cpp/subscriber/Subscriber.cpp b/src/cpp/subscriber/Subscriber.cpp index 816f3e2d0..b3c24e465 100644 --- a/src/cpp/subscriber/Subscriber.cpp +++ b/src/cpp/subscriber/Subscriber.cpp @@ -14,7 +14,7 @@ #include #include -#include +#include namespace eprosima { namespace uxr { @@ -27,7 +27,7 @@ std::unique_ptr Subscriber::create( bool created_entity = false; uint16_t raw_object_id = conversion::objectid_to_raw(object_id); - Middleware& middleware = participant->get_middleware(); + Middleware& middleware = participant->get_proxy_client()->get_middleware(); switch (representation.representation()._d()) { case dds::xrce::REPRESENTATION_AS_XML_STRING: @@ -58,7 +58,7 @@ Subscriber::Subscriber( Subscriber::~Subscriber() { participant_->untie_object(get_id()); - get_middleware().delete_subscriber(get_raw_id()); + participant_->get_proxy_client()->get_middleware().delete_subscriber(get_raw_id()); } void Subscriber::release(ObjectContainer& root_objects) @@ -71,10 +71,5 @@ void Subscriber::release(ObjectContainer& root_objects) } } -Middleware& Subscriber::get_middleware() const -{ - return participant_->get_middleware(); -} - } // namespace uxr } // namespace eprosima diff --git a/src/cpp/topic/Topic.cpp b/src/cpp/topic/Topic.cpp index 975dfed7b..7aebd40e4 100644 --- a/src/cpp/topic/Topic.cpp +++ b/src/cpp/topic/Topic.cpp @@ -13,8 +13,8 @@ // limitations under the License. #include -#include #include +#include namespace eprosima { namespace uxr { @@ -27,7 +27,7 @@ std::unique_ptr Topic::create( bool created_entity = false; uint16_t raw_object_id = conversion::objectid_to_raw(object_id); - Middleware& middleware = participant->get_middleware(); + Middleware& middleware = participant->get_proxy_client()->get_middleware(); switch (representation.representation()._d()) { case dds::xrce::REPRESENTATION_BY_REFERENCE: @@ -61,7 +61,7 @@ Topic::Topic( Topic::~Topic() { participant_->untie_object(get_id()); - get_middleware().delete_topic(get_raw_id()); + participant_->get_proxy_client()->get_middleware().delete_topic(get_raw_id()); } void Topic::release(ObjectContainer& root_objects) @@ -88,13 +88,13 @@ bool Topic::matched(const dds::xrce::ObjectVariant& new_object_rep) const case dds::xrce::REPRESENTATION_BY_REFERENCE: { const std::string& ref = new_object_rep.topic().representation().object_reference(); - rv = get_middleware().matched_topic_from_ref(get_raw_id(), ref); + rv = participant_->get_proxy_client()->get_middleware().matched_topic_from_ref(get_raw_id(), ref); break; } case dds::xrce::REPRESENTATION_AS_XML_STRING: { const std::string& xml = new_object_rep.topic().representation().xml_string_representation(); - rv = get_middleware().matched_topic_from_xml(get_raw_id(), xml); + rv = participant_->get_proxy_client()->get_middleware().matched_topic_from_xml(get_raw_id(), xml); break; } default: @@ -103,10 +103,5 @@ bool Topic::matched(const dds::xrce::ObjectVariant& new_object_rep) const return rv; } -Middleware& Topic::get_middleware() const -{ - return participant_->get_middleware(); -} - } // namespace uxr } // namespace eprosima diff --git a/test/mock/ProxyClient/uxr/agent/client/ProxyClient.hpp b/test/mock/ProxyClient/uxr/agent/client/ProxyClient.hpp index 11e549261..f115c39ef 100644 --- a/test/mock/ProxyClient/uxr/agent/client/ProxyClient.hpp +++ b/test/mock/ProxyClient/uxr/agent/client/ProxyClient.hpp @@ -42,6 +42,8 @@ class ProxyClient MOCK_METHOD0(get_session_id, dds::xrce::SessionId()); MOCK_METHOD0(session, Session&()); + + void release() {} }; } // namespace uxr