diff --git a/rmw_fastrtps_cpp/include/rmw_fastrtps_cpp/custom_client_info.hpp b/rmw_fastrtps_cpp/include/rmw_fastrtps_cpp/custom_client_info.hpp index dbb4f3d207..5aea775ef4 100644 --- a/rmw_fastrtps_cpp/include/rmw_fastrtps_cpp/custom_client_info.hpp +++ b/rmw_fastrtps_cpp/include/rmw_fastrtps_cpp/custom_client_info.hpp @@ -55,6 +55,12 @@ class ClientListener : public eprosima::fastrtps::SubscriberListener : info_(info), list_has_data_(false), conditionMutex_(nullptr), conditionVariable_(nullptr) {} + ~ClientListener() + { + // TODO(sloretz) must acquire lock before editing info_ + // Remove reference to self to avoid crash in rmw_wait() + info_->listener_ = nullptr; + } void onNewDataMessage(eprosima::fastrtps::Subscriber * sub) diff --git a/rmw_fastrtps_cpp/src/rmw_wait.cpp b/rmw_fastrtps_cpp/src/rmw_wait.cpp index 30f53250ab..255e63fdca 100644 --- a/rmw_fastrtps_cpp/src/rmw_wait.cpp +++ b/rmw_fastrtps_cpp/src/rmw_wait.cpp @@ -46,7 +46,11 @@ check_wait_set_for_data( for (size_t i = 0; i < clients->client_count; ++i) { void * data = clients->clients[i]; CustomClientInfo * custom_client_info = static_cast(data); - if (custom_client_info && custom_client_info->listener_->hasData()) { + if ( + custom_client_info && + custom_client_info->listener_ && + custom_client_info->listener_->hasData()) + { return true; } } @@ -117,7 +121,9 @@ rmw_wait( for (size_t i = 0; i < clients->client_count; ++i) { void * data = clients->clients[i]; CustomClientInfo * custom_client_info = static_cast(data); - custom_client_info->listener_->attachCondition(conditionMutex, conditionVariable); + if (custom_client_info->listener_) { + custom_client_info->listener_->attachCondition(conditionMutex, conditionVariable); + } } } @@ -184,9 +190,11 @@ rmw_wait( for (size_t i = 0; i < clients->client_count; ++i) { void * data = clients->clients[i]; CustomClientInfo * custom_client_info = static_cast(data); - custom_client_info->listener_->detachCondition(); - if (!custom_client_info->listener_->hasData()) { - clients->clients[i] = 0; + if (custom_client_info->listener_) { + custom_client_info->listener_->detachCondition(); + if (!custom_client_info->listener_->hasData()) { + clients->clients[i] = 0; + } } } }