From 0b4d3d01c69d4f3f7bfb2a3835accddc065e5df4 Mon Sep 17 00:00:00 2001 From: CY Chen Date: Mon, 16 Mar 2026 17:19:13 +0000 Subject: [PATCH] Add acceptable_buffer_backends field in SubscriptionOptionsBase Signed-off-by: CY Chen --- rclcpp/include/rclcpp/generic_subscription.hpp | 13 ++++++++++++- rclcpp/include/rclcpp/subscription_options.hpp | 14 ++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/rclcpp/include/rclcpp/generic_subscription.hpp b/rclcpp/include/rclcpp/generic_subscription.hpp index ef3669ae96..7827711ee2 100644 --- a/rclcpp/include/rclcpp/generic_subscription.hpp +++ b/rclcpp/include/rclcpp/generic_subscription.hpp @@ -80,7 +80,7 @@ class GenericSubscription : public rclcpp::SubscriptionBase node_base, *rclcpp::get_message_typesupport_handle(topic_type, "rosidl_typesupport_cpp", *ts_lib), topic_name, - options.to_rcl_subscription_options(qos), + force_cpu_buffer_backend_(options).to_rcl_subscription_options(qos), options.event_callbacks, options.use_default_callbacks, DeliveredMessageKind::SERIALIZED_MESSAGE), @@ -182,6 +182,17 @@ class GenericSubscription : public rclcpp::SubscriptionBase private: RCLCPP_DISABLE_COPY(GenericSubscription) + + template + static rclcpp::SubscriptionOptionsWithAllocator + force_cpu_buffer_backend_( + const rclcpp::SubscriptionOptionsWithAllocator & options) + { + auto opts = options; + opts.acceptable_buffer_backends = "cpu"; + return opts; + } + AnySubscriptionCallback> any_callback_; // The type support library should stay loaded, so it is stored in the GenericSubscription std::shared_ptr ts_lib_; diff --git a/rclcpp/include/rclcpp/subscription_options.hpp b/rclcpp/include/rclcpp/subscription_options.hpp index 775ad8809d..68618bc11e 100644 --- a/rclcpp/include/rclcpp/subscription_options.hpp +++ b/rclcpp/include/rclcpp/subscription_options.hpp @@ -89,6 +89,15 @@ struct SubscriptionOptionsBase QosOverridingOptions qos_overriding_options; ContentFilterOptions content_filter_options; + + /// Acceptable buffer backend names for this subscription. + /** + * Empty string or "cpu" means CPU-only (default for backward compatibility). + * "any" means all installed backends are acceptable. + * Comma-separated for specific backends, e.g. "cuda,demo". + * CPU is always implicitly acceptable regardless of this value. + */ + std::string acceptable_buffer_backends{"cpu"}; }; /// Structure containing optional configuration for Subscriptions. @@ -145,6 +154,11 @@ struct SubscriptionOptionsWithAllocator : public SubscriptionOptionsBase } } + if (!acceptable_buffer_backends.empty()) { + result.rmw_subscription_options.acceptable_buffer_backends = + acceptable_buffer_backends.c_str(); + } + return result; }