From e4ca9a6e7cab528417576a115bde07c7a5675179 Mon Sep 17 00:00:00 2001 From: Nathan Hughes Date: Mon, 26 Oct 2026 02:04:47 +0000 Subject: [PATCH] expose explict node handle shutdown --- ianvs/ianvs/__init__.py | 1 + ianvs/include/ianvs/node_init.h | 1 + ianvs/src/bindings/node_init.cpp | 12 +++++++++++- ianvs/src/node_init.cpp | 2 ++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/ianvs/ianvs/__init__.py b/ianvs/ianvs/__init__.py index 35259d3..0c9451d 100644 --- a/ianvs/ianvs/__init__.py +++ b/ianvs/ianvs/__init__.py @@ -25,4 +25,5 @@ def get_image(msg: Image | CompressedImage) -> np.ndarray | None: def init_node_handle(node_name: str): guard = _bindings._NodeInitHolder(node_name) yield guard.name + guard._exit() del guard diff --git a/ianvs/include/ianvs/node_init.h b/ianvs/include/ianvs/node_init.h index a418106..5c62fa0 100644 --- a/ianvs/include/ianvs/node_init.h +++ b/ianvs/include/ianvs/node_init.h @@ -27,6 +27,7 @@ class CurrentNode { struct NodeGuard { NodeGuard() = default; ~NodeGuard(); + void reset(); }; [[nodiscard]] IANVS_PUBLIC NodeGuard init_node(int& argc, diff --git a/ianvs/src/bindings/node_init.cpp b/ianvs/src/bindings/node_init.cpp index 82a2653..8327e53 100644 --- a/ianvs/src/bindings/node_init.cpp +++ b/ianvs/src/bindings/node_init.cpp @@ -17,6 +17,8 @@ namespace ianvs::bindings::node_init { struct NodeInitHolder { explicit NodeInitHolder(const std::string& name); + ~NodeInitHolder(); + void exit(); NodeGuard guard; const std::string name; @@ -24,10 +26,18 @@ struct NodeInitHolder { NodeInitHolder::NodeInitHolder(const std::string& _name) : guard(start_node(_name)), name(_name) {} +NodeInitHolder::~NodeInitHolder() { exit(); } + +void NodeInitHolder::exit() { + guard.reset(); + rclcpp::shutdown(); +} + void add(py::module_& m) { py::class_(m, "_NodeInitHolder") .def(py::init()) - .def_readonly("name", &NodeInitHolder::name); + .def_readonly("name", &NodeInitHolder::name) + .def("_exit", &NodeInitHolder::exit); } } // namespace ianvs::bindings::node_init diff --git a/ianvs/src/node_init.cpp b/ianvs/src/node_init.cpp index 5e215f0..ef24a6f 100644 --- a/ianvs/src/node_init.cpp +++ b/ianvs/src/node_init.cpp @@ -29,6 +29,8 @@ CurrentNode::CurrentNode() {} NodeGuard::~NodeGuard() { CurrentNode::clear(); } +void NodeGuard::reset() { CurrentNode::clear(); } + NodeGuard init_node(int& argc, char** argv, const std::string& node_name) { rclcpp::init(argc, argv); CurrentNode::init(std::make_shared(node_name));