Skip to content

Commit

Permalink
Refs #21293: Make *LocalReaderPointer atomic
Browse files Browse the repository at this point in the history
Signed-off-by: Mario Dominguez <mariodominguez@eprosima.com>
  • Loading branch information
Mario-DL committed Oct 16, 2024
1 parent e8036c9 commit 5bb09b7
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 7 deletions.
51 changes: 47 additions & 4 deletions src/cpp/rtps/reader/LocalReaderPointer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,19 @@ WeakLocalReaderPointer::WeakLocalReaderPointer()
WeakLocalReaderPointer::WeakLocalReaderPointer(
BaseReader* reader,
std::shared_ptr<LocalReaderView> view)
: local_reader_(reader)
, view_(view)
{
std::lock_guard<std::mutex> lock(this->mutex_);
local_reader_ = reader;
view_ = view;
}

WeakLocalReaderPointer::WeakLocalReaderPointer(
const WeakLocalReaderPointer& other)
{
std::lock_guard<std::mutex> lock_other(other.mutex_);
std::lock_guard<std::mutex> lock(this->mutex_);
local_reader_ = other.local_reader_;
view_ = other.view_;
}

BaseReader* WeakLocalReaderPointer::operator ->()
Expand All @@ -51,16 +61,28 @@ WeakLocalReaderPointer::operator bool() const
{
bool ret = false;

std::lock_guard<std::mutex> lock(mutex_);
if (nullptr != local_reader_ &&
nullptr != view_)
{
ret = true;
}

return ret;
}

WeakLocalReaderPointer& WeakLocalReaderPointer::operator =( const WeakLocalReaderPointer& other)
{
std::lock_guard<std::mutex> lock_other(other.mutex_);
std::lock_guard<std::mutex> lock(this->mutex_);
local_reader_ = other.local_reader_;
view_ = other.view_;
return *this;
}

void WeakLocalReaderPointer::reset()
{
std::lock_guard<std::mutex> lock(mutex_);
local_reader_ = nullptr;
view_.reset();
}
Expand All @@ -75,6 +97,7 @@ LocalReaderPointer::LocalReaderPointer(
std::shared_ptr<LocalReaderView> view)
: WeakLocalReaderPointer(reader, view)
{
std::lock_guard<std::mutex> lock(mutex_);
if (nullptr != view_)
{
view_->add_reference();
Expand All @@ -83,8 +106,14 @@ LocalReaderPointer::LocalReaderPointer(

LocalReaderPointer::LocalReaderPointer(
const LocalReaderPointer& other)
: WeakLocalReaderPointer(other.local_reader_, other.view_)
: WeakLocalReaderPointer()
{
std::lock_guard<std::mutex> lock(mutex_);
std::lock_guard<std::mutex> lock_other(other.mutex_);

local_reader_ = other.local_reader_;
view_ = other.view_;

if (nullptr != view_)
{
view_->add_reference();
Expand All @@ -93,8 +122,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<std::mutex> lock(mutex_);
std::lock_guard<std::mutex> 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();
Expand All @@ -103,6 +138,7 @@ LocalReaderPointer::LocalReaderPointer(

LocalReaderPointer::~LocalReaderPointer()
{
std::lock_guard<std::mutex> lock(mutex_);
if (nullptr != view_)
{
view_->dereference();
Expand All @@ -118,6 +154,8 @@ BaseReader* LocalReaderPointer::operator ->()
LocalReaderPointer& LocalReaderPointer::operator =(
const LocalReaderPointer& other)
{
std::lock_guard<std::mutex> lock_other(other.mutex_);
std::lock_guard<std::mutex> lock(this->mutex_);
local_reader_ = other.local_reader_;
view_ = other.view_;

Expand All @@ -132,6 +170,9 @@ LocalReaderPointer& LocalReaderPointer::operator =(
LocalReaderPointer& LocalReaderPointer::operator =(
const WeakLocalReaderPointer& other)
{
std::lock_guard<std::mutex> lock_other(other.mutex_);
std::lock_guard<std::mutex> lock(this->mutex_);

local_reader_ = other.local_reader_;
view_ = other.view_;

Expand All @@ -147,6 +188,8 @@ LocalReaderPointer::operator bool() const
{
bool ret = false;

std::lock_guard<std::mutex> lock(mutex_);

if (nullptr != local_reader_ &&
nullptr != view_ &&
view_->get_status() != LocalReaderViewStatus::INACTIVE)
Expand Down
7 changes: 4 additions & 3 deletions src/cpp/rtps/reader/LocalReaderPointer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down Expand Up @@ -65,7 +65,7 @@ class WeakLocalReaderPointer
* @brief WeakLocalpointers cannot be copied.
*/
WeakLocalReaderPointer(
const WeakLocalReaderPointer&) = default;
const WeakLocalReaderPointer&);

/**
* @brief Destructor for WeakLocalReaderPointer.
Expand All @@ -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.
Expand All @@ -104,6 +104,7 @@ class WeakLocalReaderPointer

protected:

mutable std::mutex mutex_;
BaseReader* local_reader_{nullptr};
std::shared_ptr<LocalReaderView> view_;
};
Expand Down

0 comments on commit 5bb09b7

Please sign in to comment.