1616
1717#include < vector>
1818
19- #include " rcl_handle.hpp"
2019#include " spdlog/spdlog.h"
2120
2221namespace rclnodejs {
@@ -47,45 +46,92 @@ void HandleManager::CollectHandles(const v8::Local<v8::Object> node) {
4746 Nan::Get (node, Nan::New (" _clients" ).ToLocalChecked ());
4847 Nan::MaybeLocal<v8::Value> services =
4948 Nan::Get (node, Nan::New (" _services" ).ToLocalChecked ());
49+ Nan::MaybeLocal<v8::Value> guard_conditions =
50+ Nan::Get (node, Nan::New (" _guards" ).ToLocalChecked ());
5051
5152 CollectHandlesByType (timers.ToLocalChecked ()->ToObject (), &timers_);
5253 CollectHandlesByType (subscriptions.ToLocalChecked ()->ToObject (),
5354 &subscriptions_);
5455 CollectHandlesByType (clients.ToLocalChecked ()->ToObject (), &clients_);
5556 CollectHandlesByType (services.ToLocalChecked ()->ToObject (), &services_);
57+ CollectHandlesByType (guard_conditions.ToLocalChecked ()->ToObject (),
58+ &guard_conditions_);
5659 }
5760
5861 is_synchronizing_.store (false );
5962 uv_sem_post (&sem_);
6063
6164 SPDLOG_DEBUG (
6265 spdlog::get (" rclnodejs" ),
63- " Add {0:d} timers, {1:d} subscriptions, {2:d} clients, {3:d} services." ,
64- timers_.size (), subscriptions_.size (), clients_.size (), services_.size ());
66+ " Add {0:d} timers, {1:d} subscriptions, {2:d} clients, " +
67+ " {3:d} services, {4:d} guards." ,
68+ timers_.size (),
69+ subscriptions_.size (),
70+ clients_.size (),
71+ services_.size (),
72+ guard_conditions_.size ());
6573}
6674
6775bool HandleManager::AddHandlesToWaitSet (rcl_wait_set_t * wait_set) {
6876 for (auto & timer : timers_) {
69- if (rcl_wait_set_add_timer (wait_set, timer, nullptr ) != RCL_RET_OK)
77+ rcl_timer_t * rcl_timer = reinterpret_cast <rcl_timer_t *>(timer->ptr ());
78+ if (rcl_wait_set_add_timer (wait_set, rcl_timer, nullptr ) != RCL_RET_OK)
7079 return false ;
7180 }
7281 for (auto & subscription : subscriptions_) {
73- if (rcl_wait_set_add_subscription (wait_set, subscription, nullptr ) !=
82+ rcl_subscription_t * rcl_subscription =
83+ reinterpret_cast <rcl_subscription_t *>(subscription->ptr ());
84+ if (rcl_wait_set_add_subscription (wait_set, rcl_subscription, nullptr ) !=
7485 RCL_RET_OK)
7586 return false ;
7687 }
7788 for (auto & client : clients_) {
78- if (rcl_wait_set_add_client (wait_set, client, nullptr ) != RCL_RET_OK)
89+ rcl_client_t * rcl_client = reinterpret_cast <rcl_client_t *>(client->ptr ());
90+ if (rcl_wait_set_add_client (wait_set, rcl_client, nullptr ) != RCL_RET_OK)
7991 return false ;
8092 }
8193 for (auto & service : services_) {
82- if (rcl_wait_set_add_service (wait_set, service, nullptr ) != RCL_RET_OK)
94+ rcl_service_t * rcl_service =
95+ reinterpret_cast <rcl_service_t *>(service->ptr ());
96+ if (rcl_wait_set_add_service (wait_set, rcl_service, nullptr ) != RCL_RET_OK)
97+ return false ;
98+ }
99+ for (auto & guard_condition : guard_conditions_) {
100+ rcl_guard_condition_t * rcl_guard_condition =
101+ reinterpret_cast <rcl_guard_condition_t *>(guard_condition->ptr ());
102+ if (rcl_wait_set_add_guard_condition (wait_set, rcl_guard_condition, nullptr )
103+ != RCL_RET_OK)
83104 return false ;
84105 }
85106
86107 return true ;
87108}
88109
110+ void HandleManager::CollectReadyHandles (rcl_wait_set_t * wait_set) {
111+ ready_handles_.clear ();
112+
113+ CollectReadyHandlesByType (
114+ wait_set->subscriptions ,
115+ wait_set->size_of_subscriptions ,
116+ subscriptions_);
117+ CollectReadyHandlesByType (
118+ wait_set->clients ,
119+ wait_set->size_of_clients ,
120+ clients_);
121+ CollectReadyHandlesByType (
122+ wait_set->services ,
123+ wait_set->size_of_services ,
124+ services_);
125+ CollectReadyHandlesByType (
126+ wait_set->timers ,
127+ wait_set->size_of_timers ,
128+ timers_);
129+ CollectReadyHandlesByType (
130+ wait_set->guard_conditions ,
131+ wait_set->size_of_guard_conditions ,
132+ guard_conditions_);
133+ }
134+
89135void HandleManager::ClearHandles () {
90136 timers_.clear ();
91137 clients_.clear ();
@@ -94,10 +140,9 @@ void HandleManager::ClearHandles() {
94140 guard_conditions_.clear ();
95141}
96142
97- template <typename T>
98143void HandleManager::CollectHandlesByType (
99144 const v8::Local<v8::Object>& typeObject,
100- std::vector<const T *>* vec) {
145+ std::vector<rclnodejs::RclHandle *>* vec) {
101146 Nan::HandleScope scope;
102147
103148 if (typeObject->IsArray ()) {
@@ -112,7 +157,23 @@ void HandleManager::CollectHandlesByType(
112157 rclnodejs::RclHandle* rcl_handle =
113158 rclnodejs::RclHandle::Unwrap<rclnodejs::RclHandle>(
114159 handle.ToLocalChecked ()->ToObject ());
115- vec->push_back (reinterpret_cast <T*>(rcl_handle->ptr ()));
160+ vec->push_back (rcl_handle);
161+ }
162+ }
163+ }
164+
165+ template <typename T>
166+ void HandleManager::CollectReadyHandlesByType (
167+ const T** struct_ptr,
168+ size_t size,
169+ const std::vector<rclnodejs::RclHandle*>& handles) {
170+ for (size_t idx = 0 ; idx < size; ++idx) {
171+ if (struct_ptr[idx]) {
172+ for (auto & handle : handles) {
173+ if (struct_ptr[idx] == handle->ptr ()) {
174+ ready_handles_.push_back (handle);
175+ }
176+ }
116177 }
117178 }
118179}
0 commit comments