From 0b4d3d01c69d4f3f7bfb2a3835accddc065e5df4 Mon Sep 17 00:00:00 2001 From: CY Chen Date: Mon, 16 Mar 2026 17:19:13 +0000 Subject: [PATCH 1/2] 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; } From 0fff4b0ecbc3ea97fe95cc9c415df4f63e7995c7 Mon Sep 17 00:00:00 2001 From: CY Chen Date: Tue, 24 Mar 2026 21:29:35 +0000 Subject: [PATCH 2/2] Use rcl setter for acceptable_buffer_backends Signed-off-by: CY Chen --- rclcpp/include/rclcpp/generic_subscription.hpp | 4 ++-- rclcpp/include/rclcpp/subscription_options.hpp | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/rclcpp/include/rclcpp/generic_subscription.hpp b/rclcpp/include/rclcpp/generic_subscription.hpp index 7827711ee2..a3c5acb2ce 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, - force_cpu_buffer_backend_(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), @@ -185,7 +185,7 @@ class GenericSubscription : public rclcpp::SubscriptionBase template static rclcpp::SubscriptionOptionsWithAllocator - force_cpu_buffer_backend_( + force_cpu_buffer_backend( const rclcpp::SubscriptionOptionsWithAllocator & options) { auto opts = options; diff --git a/rclcpp/include/rclcpp/subscription_options.hpp b/rclcpp/include/rclcpp/subscription_options.hpp index 68618bc11e..822259289a 100644 --- a/rclcpp/include/rclcpp/subscription_options.hpp +++ b/rclcpp/include/rclcpp/subscription_options.hpp @@ -155,8 +155,13 @@ struct SubscriptionOptionsWithAllocator : public SubscriptionOptionsBase } if (!acceptable_buffer_backends.empty()) { - result.rmw_subscription_options.acceptable_buffer_backends = - acceptable_buffer_backends.c_str(); + rcl_ret_t ret = rcl_subscription_options_set_acceptable_buffer_backends( + acceptable_buffer_backends.c_str(), + &result); + if (RCL_RET_OK != ret) { + rclcpp::exceptions::throw_from_rcl_error( + ret, "failed to set acceptable_buffer_backends"); + } } return result;