refactor executor.spin_until_future_complete
This commit is contained in:
parent
0c826497f1
commit
e8f9344015
1 changed files with 21 additions and 14 deletions
|
@ -184,23 +184,30 @@ public:
|
||||||
// Check the future before entering the while loop.
|
// Check the future before entering the while loop.
|
||||||
// If the future is already complete, don't try to spin.
|
// If the future is already complete, don't try to spin.
|
||||||
std::future_status status = future.wait_for(std::chrono::seconds(0));
|
std::future_status status = future.wait_for(std::chrono::seconds(0));
|
||||||
|
|
||||||
auto start_time = std::chrono::system_clock::now();
|
|
||||||
|
|
||||||
while (status != std::future_status::ready && rclcpp::utilities::ok()) {
|
|
||||||
spin_once(timeout);
|
|
||||||
if (timeout.count() >= 0) {
|
|
||||||
if (start_time + timeout < std::chrono::system_clock::now()) {
|
|
||||||
return TIMEOUT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
status = future.wait_for(std::chrono::seconds(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the future completed, and we weren't interrupted by ctrl-C, return the response
|
|
||||||
if (status == std::future_status::ready) {
|
if (status == std::future_status::ready) {
|
||||||
return FutureReturnCode::SUCCESS;
|
return FutureReturnCode::SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto start_time = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
|
while (rclcpp::utilities::ok()) {
|
||||||
|
// Do one item of work.
|
||||||
|
spin_once(timeout);
|
||||||
|
// Check if the future is set, return SUCCESS if it is.
|
||||||
|
status = future.wait_for(std::chrono::seconds(0));
|
||||||
|
if (status == std::future_status::ready) {
|
||||||
|
return FutureReturnCode::SUCCESS;
|
||||||
|
}
|
||||||
|
// Otherwise check if we still have time to wait, return TIMEOUT if not.
|
||||||
|
auto elapsed_time = std::chrono::steady_clock::now() - start_time;
|
||||||
|
if (elapsed_time > timeout) {
|
||||||
|
return FutureReturnCode::TIMEOUT;
|
||||||
|
}
|
||||||
|
// Subtract the elapsed time from the original timeout.
|
||||||
|
timeout -= std::chrono::duration_cast<std::chrono::duration<int64_t, TimeT>>(elapsed_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
// The future did not complete before ok() returned false, return INTERRUPTED.
|
||||||
return FutureReturnCode::INTERRUPTED;
|
return FutureReturnCode::INTERRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue