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; }