@@ -118,14 +118,26 @@ class SubscriptionIntraProcess : public SubscriptionIntraProcessBase
118118 provide_intra_process_message (ConstMessageSharedPtr message)
119119 {
120120 buffer_->add_shared (std::move (message));
121- trigger_guard_condition ();
121+
122+ std::lock_guard<std::mutex> lock (executor_callback_mutex_);
123+ if (executor_callback_) {
124+ invoke_executor_callback ();
125+ } else {
126+ trigger_guard_condition ();
127+ }
122128 }
123129
124130 void
125131 provide_intra_process_message (MessageUniquePtr message)
126132 {
127133 buffer_->add_unique (std::move (message));
128- trigger_guard_condition ();
134+
135+ std::lock_guard<std::mutex> lock (executor_callback_mutex_);
136+ if (executor_callback_) {
137+ invoke_executor_callback ();
138+ } else {
139+ trigger_guard_condition ();
140+ }
129141 }
130142
131143 bool
@@ -134,6 +146,18 @@ class SubscriptionIntraProcess : public SubscriptionIntraProcessBase
134146 return buffer_->use_take_shared_method ();
135147 }
136148
149+ void
150+ set_events_executor_callback (
151+ const rclcpp::executors::EventsExecutor * executor,
152+ rmw_listener_cb_t executor_callback) override
153+ {
154+ std::lock_guard<std::mutex> lock (executor_callback_mutex_);
155+ executor_ = executor;
156+ executor_callback_ = executor_callback;
157+ // Buffer must be cleared under the executor callback lock to make sure that other threads wait for this
158+ buffer_->clear ();
159+ }
160+
137161private:
138162 void
139163 trigger_guard_condition ()
@@ -142,6 +166,17 @@ class SubscriptionIntraProcess : public SubscriptionIntraProcessBase
142166 (void )ret;
143167 }
144168
169+ void
170+ invoke_executor_callback ()
171+ {
172+ static const rmw_listener_event_t this_event = {
173+ .entity = this ,
174+ .type = WAITABLE_EVENT
175+ };
176+
177+ executor_callback_ (executor_, this_event);
178+ }
179+
145180 template <typename T>
146181 typename std::enable_if<std::is_same<T, rcl_serialized_message_t >::value, void >::type
147182 execute_impl ()
0 commit comments