@@ -57,7 +57,7 @@ MultiThreadedExecutor::spin()
5757
5858void
5959
60- MultiThreadedExecutor::spin (std::function<void (const std::exception & e)> exception_handler)
60+ MultiThreadedExecutor::spin (const std::function<void (const std::exception & e)> & exception_handler)
6161{
6262 if (spinning.exchange (true )) {
6363 throw std::runtime_error (" spin() called while already spinning" );
@@ -88,38 +88,28 @@ MultiThreadedExecutor::get_number_of_threads()
8888void
8989MultiThreadedExecutor::run (
9090 size_t this_thread_number,
91- std::function<void (const std::exception & e)> exception_handler)
91+ const std::function<void (const std::exception & e)> & exception_handler)
9292{
93- try {
94-
95- (void )this_thread_number;
96- while (rclcpp::ok (this ->context_ ) && spinning.load ()) {
97- rclcpp::AnyExecutable any_exec;
98- {
99- std::lock_guard wait_lock{wait_mutex_};
100- if (!rclcpp::ok (this ->context_ ) || !spinning.load ()) {
101- return ;
102- }
103- if (!get_next_executable (any_exec, next_exec_timeout_)) {
104- continue ;
105- }
93+ (void )this_thread_number;
94+ while (rclcpp::ok (this ->context_ ) && spinning.load ()) {
95+ rclcpp::AnyExecutable any_exec;
96+ {
97+ std::lock_guard wait_lock{wait_mutex_};
98+ if (!rclcpp::ok (this ->context_ ) || !spinning.load ()) {
99+ return ;
106100 }
107- if (yield_before_execute_ ) {
108- std::this_thread::yield () ;
101+ if (! get_next_executable (any_exec, next_exec_timeout_) ) {
102+ continue ;
109103 }
110-
111- execute_any_executable (any_exec);
112-
113- // Clear the callback_group to prevent the AnyExecutable destructor from
114- // resetting the callback group `can_be_taken_from`
115- any_exec.callback_group .reset ();
104+ }
105+ if (yield_before_execute_) {
106+ std::this_thread::yield ();
116107 }
117108
118- } catch (const std::exception & e) {
119- RCLCPP_ERROR_STREAM (
120- rclcpp::get_logger (" rclcpp" ),
121- " Exception while spinning : " << e.what ());
109+ execute_any_executable (any_exec, exception_handler);
122110
123- exception_handler (e);
111+ // Clear the callback_group to prevent the AnyExecutable destructor from
112+ // resetting the callback group `can_be_taken_from`
113+ any_exec.callback_group .reset ();
124114 }
125115}
0 commit comments