Fix spin_until_future_complete: check spinning value (#1023)
Signed-off-by: Donghee Ye <donghee.ye@samsung.com> Make Executor::spin_once_impl private before backporting, to avoid API compatibility issues Signed-off-by: Ivan Santiago Paunovic <ivanpauno@ekumenlabs.com>
This commit is contained in:
parent
77564eb2ff
commit
70e1830ecd
2 changed files with 23 additions and 6 deletions
|
@ -37,6 +37,7 @@
|
||||||
#include "rclcpp/node_interfaces/node_base_interface.hpp"
|
#include "rclcpp/node_interfaces/node_base_interface.hpp"
|
||||||
#include "rclcpp/utilities.hpp"
|
#include "rclcpp/utilities.hpp"
|
||||||
#include "rclcpp/visibility_control.hpp"
|
#include "rclcpp/visibility_control.hpp"
|
||||||
|
#include "rclcpp/scope_exit.hpp"
|
||||||
|
|
||||||
namespace rclcpp
|
namespace rclcpp
|
||||||
{
|
{
|
||||||
|
@ -212,9 +213,14 @@ public:
|
||||||
}
|
}
|
||||||
std::chrono::nanoseconds timeout_left = timeout_ns;
|
std::chrono::nanoseconds timeout_left = timeout_ns;
|
||||||
|
|
||||||
while (rclcpp::ok(this->context_)) {
|
if (spinning.exchange(true)) {
|
||||||
|
throw std::runtime_error("spin_until_future_complete() called while already spinning");
|
||||||
|
}
|
||||||
|
RCLCPP_SCOPE_EXIT(this->spinning.store(false); );
|
||||||
|
while (rclcpp::ok(this->context_) && spinning.load()) {
|
||||||
// Do one item of work.
|
// Do one item of work.
|
||||||
spin_once(timeout_left);
|
spin_once_impl(timeout_left);
|
||||||
|
|
||||||
// Check if the future is set, return SUCCESS if it is.
|
// Check if the future is set, return SUCCESS if it is.
|
||||||
status = future.wait_for(std::chrono::seconds(0));
|
status = future.wait_for(std::chrono::seconds(0));
|
||||||
if (status == std::future_status::ready) {
|
if (status == std::future_status::ready) {
|
||||||
|
@ -338,6 +344,11 @@ protected:
|
||||||
|
|
||||||
std::list<rclcpp::node_interfaces::NodeBaseInterface::WeakPtr> weak_nodes_;
|
std::list<rclcpp::node_interfaces::NodeBaseInterface::WeakPtr> weak_nodes_;
|
||||||
std::list<const rcl_guard_condition_t *> guard_conditions_;
|
std::list<const rcl_guard_condition_t *> guard_conditions_;
|
||||||
|
|
||||||
|
private:
|
||||||
|
RCLCPP_PUBLIC
|
||||||
|
void
|
||||||
|
spin_once_impl(std::chrono::nanoseconds timeout);
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace executor
|
namespace executor
|
||||||
|
|
|
@ -244,6 +244,15 @@ Executor::spin_some(std::chrono::nanoseconds max_duration)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Executor::spin_once_impl(std::chrono::nanoseconds timeout)
|
||||||
|
{
|
||||||
|
AnyExecutable any_exec;
|
||||||
|
if (get_next_executable(any_exec, timeout)) {
|
||||||
|
execute_any_executable(any_exec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Executor::spin_once(std::chrono::nanoseconds timeout)
|
Executor::spin_once(std::chrono::nanoseconds timeout)
|
||||||
{
|
{
|
||||||
|
@ -251,10 +260,7 @@ Executor::spin_once(std::chrono::nanoseconds timeout)
|
||||||
throw std::runtime_error("spin_once() called while already spinning");
|
throw std::runtime_error("spin_once() called while already spinning");
|
||||||
}
|
}
|
||||||
RCLCPP_SCOPE_EXIT(this->spinning.store(false); );
|
RCLCPP_SCOPE_EXIT(this->spinning.store(false); );
|
||||||
AnyExecutable any_exec;
|
spin_once_impl(timeout);
|
||||||
if (get_next_executable(any_exec, timeout)) {
|
|
||||||
execute_any_executable(any_exec);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue