diff --git a/rmw_zenoh_cpp/src/detail/graph_cache.cpp b/rmw_zenoh_cpp/src/detail/graph_cache.cpp index 99f99116..5e480071 100644 --- a/rmw_zenoh_cpp/src/detail/graph_cache.cpp +++ b/rmw_zenoh_cpp/src/detail/graph_cache.cpp @@ -13,7 +13,9 @@ // limitations under the License. #include +#include #include +#include #include #include #include @@ -209,29 +211,32 @@ void GraphCache::handle_matched_events_for_put( EntityEventMap local_entities_with_events = {}; // The entity added may be local with callbacks registered but there // may be other local entities in the graph that are matched. - std::size_t match_count_for_entity = 0; + int32_t match_count_for_entity = 0; for (const auto & [_, topic_data_ptr] : topic_qos_map) { if (is_pub) { // Count the number of matching subs for each set of qos settings. - match_count_for_entity += topic_data_ptr->subs_.size(); + std::size_t sub_size = topic_data_ptr->subs_.size(); + if (sub_size > std::numeric_limits::max()) { + RMW_ZENOH_LOG_ERROR_NAMED( + "rmw_zenoh_cpp", + "Too many subscriptions on publisher; assuming 0. Report this bug."); + sub_size = 0; + } + match_count_for_entity += static_cast(sub_size); // Also iterate through the subs to check if any are local and if update event counters. for (liveliness::ConstEntityPtr sub_entity : topic_data_ptr->subs_) { // Update counters only if key expressions match. if (entity->topic_info()->topic_keyexpr_ == sub_entity->topic_info().value().topic_keyexpr_) { - update_event_counters( - topic_info.name_, - ZENOH_EVENT_SUBSCRIPTION_MATCHED, - static_cast(1)); + update_event_counters(topic_info.name_, ZENOH_EVENT_SUBSCRIPTION_MATCHED, 1); if (is_entity_local(*sub_entity)) { local_entities_with_events[sub_entity].insert(ZENOH_EVENT_SUBSCRIPTION_MATCHED); } } } // Update event counters for the new entity-> - update_event_counters( - topic_info.name_, + update_event_counters(topic_info.name_, ZENOH_EVENT_PUBLICATION_MATCHED, match_count_for_entity); if (is_entity_local(*entity) && match_count_for_entity > 0) { @@ -240,17 +245,21 @@ void GraphCache::handle_matched_events_for_put( } else { // Entity is a sub. // Count the number of matching pubs for each set of qos settings. - match_count_for_entity += topic_data_ptr->pubs_.size(); + std::size_t pub_size = topic_data_ptr->pubs_.size(); + if (pub_size > std::numeric_limits::max()) { + RMW_ZENOH_LOG_ERROR_NAMED( + "rmw_zenoh_cpp", + "Too many publishers on subscription; assuming 0. Report this bug."); + pub_size = 0; + } + match_count_for_entity += static_cast(pub_size); // Also iterate through the pubs to check if any are local and if update event counters. for (liveliness::ConstEntityPtr pub_entity : topic_data_ptr->pubs_) { // Update counters only if key expressions match. if (entity->topic_info()->topic_keyexpr_ == pub_entity->topic_info().value().topic_keyexpr_) { - update_event_counters( - topic_info.name_, - ZENOH_EVENT_PUBLICATION_MATCHED, - static_cast(1)); + update_event_counters(topic_info.name_, ZENOH_EVENT_PUBLICATION_MATCHED, 1); if (is_entity_local(*pub_entity)) { local_entities_with_events[pub_entity].insert(ZENOH_EVENT_PUBLICATION_MATCHED); } diff --git a/rmw_zenoh_cpp/src/detail/rmw_context_impl_s.cpp b/rmw_zenoh_cpp/src/detail/rmw_context_impl_s.cpp index 309720f7..36257d21 100644 --- a/rmw_zenoh_cpp/src/detail/rmw_context_impl_s.cpp +++ b/rmw_zenoh_cpp/src/detail/rmw_context_impl_s.cpp @@ -76,6 +76,7 @@ class rmw_context_impl_s::Data final zenoh::ZResult result; +#ifndef _MSC_VER // Check if shm is enabled. std::string shm_enabled = config.value().get(Z_CONFIG_SHARED_MEMORY_KEY, &result); if (result != Z_OK) { @@ -84,6 +85,7 @@ class rmw_context_impl_s::Data final "Not able to get %s from the config file", Z_CONFIG_SHARED_MEMORY_KEY); } +#endif // Initialize the zenoh session. session_ = std::make_shared( @@ -180,6 +182,7 @@ class rmw_context_impl_s::Data final // Initialize the shm manager if shared_memory is enabled in the config. shm_provider_ = std::nullopt; +#ifndef _MSC_VER if (shm_enabled == "true") { auto layout = zenoh::MemoryLayout( SHM_BUFFER_SIZE_MB * 1024 * 1024, @@ -190,7 +193,7 @@ class rmw_context_impl_s::Data final } shm_provider_ = std::move(provider); } - +#endif graph_guard_condition_ = std::make_unique(); graph_guard_condition_->implementation_identifier = rmw_zenoh_cpp::rmw_zenoh_identifier; graph_guard_condition_->data = &guard_condition_data_; diff --git a/rmw_zenoh_cpp/src/detail/rmw_context_impl_s.hpp b/rmw_zenoh_cpp/src/detail/rmw_context_impl_s.hpp index a74fab85..a2fdaf5e 100644 --- a/rmw_zenoh_cpp/src/detail/rmw_context_impl_s.hpp +++ b/rmw_zenoh_cpp/src/detail/rmw_context_impl_s.hpp @@ -29,7 +29,7 @@ #include "rmw/types.h" ///============================================================================= -class rmw_context_impl_s final +struct rmw_context_impl_s final { public: // Constructor that internally initializes the Zenoh session and other artifacts. @@ -96,5 +96,4 @@ class rmw_context_impl_s final std::shared_ptr data_{nullptr}; }; - #endif // DETAIL__RMW_CONTEXT_IMPL_S_HPP_ diff --git a/rmw_zenoh_cpp/src/detail/zenoh_config.cpp b/rmw_zenoh_cpp/src/detail/zenoh_config.cpp index 075d8806..fa100d0a 100644 --- a/rmw_zenoh_cpp/src/detail/zenoh_config.cpp +++ b/rmw_zenoh_cpp/src/detail/zenoh_config.cpp @@ -109,7 +109,7 @@ std::optional zenoh_router_check_attempts() } // If the environment variable contains a value, handle it accordingly. if (envar_value[0] != '\0') { - const auto read_value = std::strtol(envar_value, nullptr, 10); + const int64_t read_value = std::strtoll(envar_value, nullptr, 10); if (read_value > 0) { return read_value; } else if (read_value < 0) { diff --git a/rmw_zenoh_cpp/src/rmw_event.cpp b/rmw_zenoh_cpp/src/rmw_event.cpp index 63de9bcb..68117032 100644 --- a/rmw_zenoh_cpp/src/rmw_event.cpp +++ b/rmw_zenoh_cpp/src/rmw_event.cpp @@ -220,16 +220,16 @@ rmw_take_event( case rmw_zenoh_cpp::ZENOH_EVENT_REQUESTED_QOS_INCOMPATIBLE: { auto ei = static_cast(event_info); RMW_CHECK_ARGUMENT_FOR_NULL(ei, RMW_RET_INVALID_ARGUMENT); - ei->total_count = st->total_count; - ei->total_count_change = st->total_count_change; + ei->total_count = static_cast(st->total_count); + ei->total_count_change = static_cast(st->total_count_change); *taken = true; return RMW_RET_OK; } case rmw_zenoh_cpp::ZENOH_EVENT_MESSAGE_LOST: { auto ei = static_cast(event_info); RMW_CHECK_ARGUMENT_FOR_NULL(ei, RMW_RET_INVALID_ARGUMENT); - ei->total_count = st->total_count; - ei->total_count_change = st->total_count_change; + ei->total_count = static_cast(st->total_count); + ei->total_count_change = static_cast(st->total_count_change); *taken = true; return RMW_RET_OK; } @@ -247,8 +247,8 @@ rmw_take_event( case rmw_zenoh_cpp::ZENOH_EVENT_OFFERED_QOS_INCOMPATIBLE: { auto ei = static_cast(event_info); RMW_CHECK_ARGUMENT_FOR_NULL(ei, RMW_RET_INVALID_ARGUMENT); - ei->total_count = st->total_count; - ei->total_count_change = st->total_count_change; + ei->total_count = static_cast(st->total_count); + ei->total_count_change = static_cast(st->total_count_change); *taken = true; return RMW_RET_OK; } diff --git a/rmw_zenoh_cpp/src/rmw_init.cpp b/rmw_zenoh_cpp/src/rmw_init.cpp index 86a1974b..cb34697c 100644 --- a/rmw_zenoh_cpp/src/rmw_init.cpp +++ b/rmw_zenoh_cpp/src/rmw_init.cpp @@ -84,10 +84,7 @@ rmw_init(const rmw_init_options_t * options, rmw_context_t * context) } }); - // If not already defined, set the logging environment variable for Zenoh sessions - // to warning level by default. - // TODO(Yadunund): Switch to rcutils_get_env once it supports not overwriting values. - if (setenv(ZENOH_LOG_ENV_VAR_STR, ZENOH_LOG_WARN_LEVEL_STR, 0) != 0) { + if (!rcutils_set_env_overwrite(ZENOH_LOG_ENV_VAR_STR, ZENOH_LOG_WARN_LEVEL_STR, 0)) { RMW_SET_ERROR_MSG("Error configuring Zenoh logging."); return RMW_RET_ERROR; }