Add max_duration to spin_some() (#558)
With max_duration spin_some will execute work until it has spent more time than the elapsed duration.
This commit is contained in:
parent
86cc8fdb3a
commit
b860b899e5
2 changed files with 20 additions and 3 deletions
|
@ -190,10 +190,14 @@ public:
|
||||||
* single-threaded model of execution.
|
* single-threaded model of execution.
|
||||||
* Adding subscriptions, timers, services, etc. with blocking callbacks will cause this function
|
* Adding subscriptions, timers, services, etc. with blocking callbacks will cause this function
|
||||||
* to block (which may have unintended consequences).
|
* to block (which may have unintended consequences).
|
||||||
|
*
|
||||||
|
* \param[in] max_duration The maximum amount of time to spend executing work, or 0 for no limit.
|
||||||
|
* Note that spin_some() may take longer than this time as it only returns once max_duration has
|
||||||
|
* been exceeded.
|
||||||
*/
|
*/
|
||||||
RCLCPP_PUBLIC
|
RCLCPP_PUBLIC
|
||||||
virtual void
|
virtual void
|
||||||
spin_some();
|
spin_some(std::chrono::nanoseconds max_duration = std::chrono::nanoseconds(0));
|
||||||
|
|
||||||
RCLCPP_PUBLIC
|
RCLCPP_PUBLIC
|
||||||
virtual void
|
virtual void
|
||||||
|
|
|
@ -200,13 +200,26 @@ Executor::spin_node_some(std::shared_ptr<rclcpp::Node> node)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Executor::spin_some()
|
Executor::spin_some(std::chrono::nanoseconds max_duration)
|
||||||
{
|
{
|
||||||
|
auto start = std::chrono::steady_clock::now();
|
||||||
|
auto max_duration_not_elapsed = [max_duration, start]() {
|
||||||
|
if (std::chrono::nanoseconds(0) == max_duration) {
|
||||||
|
// told to spin forever if need be
|
||||||
|
return true;
|
||||||
|
} else if (std::chrono::steady_clock::now() - start < max_duration) {
|
||||||
|
// told to spin only for some maximum amount of time
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// spun too long
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
if (spinning.exchange(true)) {
|
if (spinning.exchange(true)) {
|
||||||
throw std::runtime_error("spin_some() called while already spinning");
|
throw std::runtime_error("spin_some() called while already spinning");
|
||||||
}
|
}
|
||||||
RCLCPP_SCOPE_EXIT(this->spinning.store(false); );
|
RCLCPP_SCOPE_EXIT(this->spinning.store(false); );
|
||||||
while (spinning.load()) {
|
while (spinning.load() && max_duration_not_elapsed()) {
|
||||||
AnyExecutable any_exec;
|
AnyExecutable any_exec;
|
||||||
if (get_next_executable(any_exec, std::chrono::milliseconds::zero())) {
|
if (get_next_executable(any_exec, std::chrono::milliseconds::zero())) {
|
||||||
execute_any_executable(any_exec);
|
execute_any_executable(any_exec);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue