From 49eaeb06fb4e979a07eee79531854370ece5ec5f Mon Sep 17 00:00:00 2001 From: Mario Dominguez Date: Wed, 16 Oct 2024 08:43:55 +0200 Subject: [PATCH] Refs #21293: Make *LocalReaderPointer atomic Signed-off-by: Mario Dominguez --- src/cpp/rtps/reader/LocalReaderPointer.cpp | 52 ++++++++++++++++++++-- src/cpp/rtps/reader/LocalReaderPointer.hpp | 7 +-- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/src/cpp/rtps/reader/LocalReaderPointer.cpp b/src/cpp/rtps/reader/LocalReaderPointer.cpp index f94a30127f..8e75fc3553 100644 --- a/src/cpp/rtps/reader/LocalReaderPointer.cpp +++ b/src/cpp/rtps/reader/LocalReaderPointer.cpp @@ -36,9 +36,19 @@ WeakLocalReaderPointer::WeakLocalReaderPointer() WeakLocalReaderPointer::WeakLocalReaderPointer( BaseReader* reader, std::shared_ptr view) - : local_reader_(reader) - , view_(view) { + std::lock_guard lock(this->mutex_); + local_reader_ = reader; + view_ = view; +} + +WeakLocalReaderPointer::WeakLocalReaderPointer( + const WeakLocalReaderPointer& other) +{ + std::lock_guard lock_other(other.mutex_); + std::lock_guard lock(this->mutex_); + local_reader_ = other.local_reader_; + view_ = other.view_; } BaseReader* WeakLocalReaderPointer::operator ->() @@ -51,16 +61,29 @@ WeakLocalReaderPointer::operator bool() const { bool ret = false; + std::lock_guard lock(mutex_); if (nullptr != local_reader_ && nullptr != view_) { ret = true; } + return ret; } +WeakLocalReaderPointer& WeakLocalReaderPointer::operator =( + const WeakLocalReaderPointer& other) +{ + std::lock_guard lock_other(other.mutex_); + std::lock_guard lock(this->mutex_); + local_reader_ = other.local_reader_; + view_ = other.view_; + return *this; +} + void WeakLocalReaderPointer::reset() { + std::lock_guard lock(mutex_); local_reader_ = nullptr; view_.reset(); } @@ -75,6 +98,7 @@ LocalReaderPointer::LocalReaderPointer( std::shared_ptr view) : WeakLocalReaderPointer(reader, view) { + std::lock_guard lock(mutex_); if (nullptr != view_) { view_->add_reference(); @@ -83,8 +107,14 @@ LocalReaderPointer::LocalReaderPointer( LocalReaderPointer::LocalReaderPointer( const LocalReaderPointer& other) - : WeakLocalReaderPointer(other.local_reader_, other.view_) + : WeakLocalReaderPointer() { + std::lock_guard lock(mutex_); + std::lock_guard lock_other(other.mutex_); + + local_reader_ = other.local_reader_; + view_ = other.view_; + if (nullptr != view_) { view_->add_reference(); @@ -93,8 +123,14 @@ LocalReaderPointer::LocalReaderPointer( LocalReaderPointer::LocalReaderPointer( const WeakLocalReaderPointer& weak_local_reader_ptr) - : WeakLocalReaderPointer(weak_local_reader_ptr.local_reader_, weak_local_reader_ptr.view_) + : WeakLocalReaderPointer() { + std::lock_guard lock(mutex_); + std::lock_guard lock_other(weak_local_reader_ptr.mutex_); + + local_reader_ = weak_local_reader_ptr.local_reader_; + view_ = weak_local_reader_ptr.view_; + if (nullptr != view_) { view_->add_reference(); @@ -103,6 +139,7 @@ LocalReaderPointer::LocalReaderPointer( LocalReaderPointer::~LocalReaderPointer() { + std::lock_guard lock(mutex_); if (nullptr != view_) { view_->dereference(); @@ -118,6 +155,8 @@ BaseReader* LocalReaderPointer::operator ->() LocalReaderPointer& LocalReaderPointer::operator =( const LocalReaderPointer& other) { + std::lock_guard lock_other(other.mutex_); + std::lock_guard lock(this->mutex_); local_reader_ = other.local_reader_; view_ = other.view_; @@ -132,6 +171,9 @@ LocalReaderPointer& LocalReaderPointer::operator =( LocalReaderPointer& LocalReaderPointer::operator =( const WeakLocalReaderPointer& other) { + std::lock_guard lock_other(other.mutex_); + std::lock_guard lock(this->mutex_); + local_reader_ = other.local_reader_; view_ = other.view_; @@ -147,6 +189,8 @@ LocalReaderPointer::operator bool() const { bool ret = false; + std::lock_guard lock(mutex_); + if (nullptr != local_reader_ && nullptr != view_ && view_->get_status() != LocalReaderViewStatus::INACTIVE) diff --git a/src/cpp/rtps/reader/LocalReaderPointer.hpp b/src/cpp/rtps/reader/LocalReaderPointer.hpp index 7377aa91d7..b9efb53544 100644 --- a/src/cpp/rtps/reader/LocalReaderPointer.hpp +++ b/src/cpp/rtps/reader/LocalReaderPointer.hpp @@ -34,7 +34,7 @@ class WeakLocalReaderPointer; * @brief Class representing a pointer to a local reader. * * This class simply encapsulates a pointer to a BaseReader and a - * shared pointer to its associated LocalReaderView. + * shared pointer to its associated LocalReaderView in a thread-safe manner. * * @ingroup READER_MODULE */ @@ -65,7 +65,7 @@ class WeakLocalReaderPointer * @brief WeakLocalpointers cannot be copied. */ WeakLocalReaderPointer( - const WeakLocalReaderPointer&) = default; + const WeakLocalReaderPointer&); /** * @brief Destructor for WeakLocalReaderPointer. @@ -88,7 +88,7 @@ class WeakLocalReaderPointer * @return Reference to the assigned WeakLocalReaderPointer. */ WeakLocalReaderPointer& operator =( - const WeakLocalReaderPointer& other) = default; + const WeakLocalReaderPointer& other); /** * @brief Overloaded operator bool to check the status of the reader. @@ -104,6 +104,7 @@ class WeakLocalReaderPointer protected: + mutable std::mutex mutex_; BaseReader* local_reader_{nullptr}; std::shared_ptr view_; };