From 94af1d24bb4ea7eb7f19bad309cbdd5009f5d609 Mon Sep 17 00:00:00 2001 From: Dirk Thomas Date: Fri, 15 Mar 2019 15:25:46 -0700 Subject: [PATCH] update listener logic for accurate counting (#262) --- .../custom_client_info.hpp | 32 ++++++++++++------- .../src/rmw_service_server_is_available.cpp | 4 +-- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/rmw_fastrtps_shared_cpp/include/rmw_fastrtps_shared_cpp/custom_client_info.hpp b/rmw_fastrtps_shared_cpp/include/rmw_fastrtps_shared_cpp/custom_client_info.hpp index 727d21d48..9dde673c4 100644 --- a/rmw_fastrtps_shared_cpp/include/rmw_fastrtps_shared_cpp/custom_client_info.hpp +++ b/rmw_fastrtps_shared_cpp/include/rmw_fastrtps_shared_cpp/custom_client_info.hpp @@ -47,8 +47,8 @@ typedef struct CustomClientInfo eprosima::fastrtps::Participant * participant_; const char * typesupport_identifier_; ClientPubListener * pub_listener_; - uint32_t response_subscriber_matched_count_; - uint32_t request_publisher_matched_count_; + std::atomic_uint32_t response_subscriber_matched_count_; + std::atomic_uint32_t request_publisher_matched_count_; } CustomClientInfo; typedef struct CustomClientResponse @@ -152,15 +152,18 @@ class ClientListener : public eprosima::fastrtps::SubscriberListener eprosima::fastrtps::Subscriber * sub, eprosima::fastrtps::rtps::MatchingInfo & matchingInfo) { - if (info_ == nullptr || sub == nullptr) { + (void)sub; + if (info_ == nullptr) { return; } - - if (matchingInfo.status == eprosima::fastrtps::rtps::MATCHED_MATCHING) { - info_->response_subscriber_matched_count_++; + if (eprosima::fastrtps::rtps::MATCHED_MATCHING == matchingInfo.status) { + publishers_.insert(matchingInfo.remoteEndpointGuid); + } else if (eprosima::fastrtps::rtps::REMOVED_MATCHING == matchingInfo.status) { + publishers_.erase(matchingInfo.remoteEndpointGuid); } else { - info_->response_subscriber_matched_count_--; + return; } + info_->response_subscriber_matched_count_.store(publishers_.size()); } private: @@ -170,6 +173,7 @@ class ClientListener : public eprosima::fastrtps::SubscriberListener std::atomic_bool list_has_data_; std::mutex * conditionMutex_; std::condition_variable * conditionVariable_; + std::set publishers_; }; class ClientPubListener : public eprosima::fastrtps::PublisherListener @@ -184,19 +188,23 @@ class ClientPubListener : public eprosima::fastrtps::PublisherListener eprosima::fastrtps::Publisher * pub, eprosima::fastrtps::rtps::MatchingInfo & matchingInfo) { - if (info_ == nullptr || pub == nullptr) { + (void) pub; + if (info_ == nullptr) { return; } - - if (matchingInfo.status == eprosima::fastrtps::rtps::MATCHED_MATCHING) { - info_->request_publisher_matched_count_++; + if (eprosima::fastrtps::rtps::MATCHED_MATCHING == matchingInfo.status) { + subscriptions_.insert(matchingInfo.remoteEndpointGuid); + } else if (eprosima::fastrtps::rtps::REMOVED_MATCHING == matchingInfo.status) { + subscriptions_.erase(matchingInfo.remoteEndpointGuid); } else { - info_->request_publisher_matched_count_--; + return; } + info_->request_publisher_matched_count_.store(subscriptions_.size()); } private: CustomClientInfo * info_; + std::set subscriptions_; }; #endif // RMW_FASTRTPS_SHARED_CPP__CUSTOM_CLIENT_INFO_HPP_ diff --git a/rmw_fastrtps_shared_cpp/src/rmw_service_server_is_available.cpp b/rmw_fastrtps_shared_cpp/src/rmw_service_server_is_available.cpp index 4960ebdbd..bbc9f65f4 100644 --- a/rmw_fastrtps_shared_cpp/src/rmw_service_server_is_available.cpp +++ b/rmw_fastrtps_shared_cpp/src/rmw_service_server_is_available.cpp @@ -104,11 +104,11 @@ __rmw_service_server_is_available( return RMW_RET_OK; } - if (0 == client_info->request_publisher_matched_count_) { + if (0 == client_info->request_publisher_matched_count_.load()) { // not ready return RMW_RET_OK; } - if (0 == client_info->response_subscriber_matched_count_) { + if (0 == client_info->response_subscriber_matched_count_.load()) { // not ready return RMW_RET_OK; }