From 7de2bbed9b0965e894dbbecd3b0d96c375b3ef90 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Mon, 10 May 2021 10:58:12 +0100 Subject: 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 Reviewed-by: David Plowman Reviewed-by: Laurent Pinchart Signed-off-by: Laurent Pinchart --- src/ipa/raspberrypi/controller/metadata.hpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'src/ipa/raspberrypi') diff --git a/src/ipa/raspberrypi/controller/metadata.hpp b/src/ipa/raspberrypi/controller/metadata.hpp index 07dd28ed..e735cfbe 100644 --- a/src/ipa/raspberrypi/controller/metadata.hpp +++ b/src/ipa/raspberrypi/controller/metadata.hpp @@ -22,14 +22,14 @@ public: template void Set(std::string const &tag, T const &value) { - std::lock_guard lock(mutex_); + std::scoped_lock lock(mutex_); data_[tag] = value; } template int Get(std::string const &tag, T &value) const { - std::lock_guard 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 lock(mutex_); + std::scoped_lock lock(mutex_); data_.clear(); } Metadata &operator=(Metadata const &other) { - std::lock_guard lock(mutex_); - std::lock_guard other_lock(other.mutex_); + std::scoped_lock lock(mutex_, other.mutex_); data_ = other.data_; return *this; } -- cgit v1.2.1