ipa: raspberrypi: Switch to std::scoped_lock in the Metadata class
Replace std::lock_guard with std::scoped_lock. When locking a single mutex, both are functionally the same. When locking two mutexes in the operator= overload, the scoped_lock uses a deadlock avoidance algorithm to avoid deadlock. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
committed by
Laurent Pinchart
parent
340477f987
commit
7de2bbed9b
@@ -22,14 +22,14 @@ public:
|
||||
template<typename T>
|
||||
void Set(std::string const &tag, T const &value)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
std::scoped_lock lock(mutex_);
|
||||
data_[tag] = value;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
int Get(std::string const &tag, T &value) const
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
std::scoped_lock lock(mutex_);
|
||||
auto it = data_.find(tag);
|
||||
if (it == data_.end())
|
||||
return -1;
|
||||
@@ -39,14 +39,13 @@ public:
|
||||
|
||||
void Clear()
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
std::scoped_lock lock(mutex_);
|
||||
data_.clear();
|
||||
}
|
||||
|
||||
Metadata &operator=(Metadata const &other)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
std::lock_guard<std::mutex> other_lock(other.mutex_);
|
||||
std::scoped_lock lock(mutex_, other.mutex_);
|
||||
data_ = other.data_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user