From 3ecca5323cba595fa05a599777f0b4c455bdd058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gl=C3=B6ckner?= Date: Thu, 31 Mar 2016 10:09:40 +0200 Subject: Added API for accessing structs in a thread-safe way --- src/syncedsettings.h | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 src/syncedsettings.h (limited to 'src/syncedsettings.h') diff --git a/src/syncedsettings.h b/src/syncedsettings.h new file mode 100644 index 0000000..f83847c --- /dev/null +++ b/src/syncedsettings.h @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * syncedsettings.h + * + * Thu Mar 31 09:23:27 CEST 2016 + * Copyright 2016 Christian Glöckner + * cgloeckner@freenet.de + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * DrumGizmo is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#pragma once + +#include + +// type trait helper + +template +struct pack_contains; + +template +struct pack_contains + : std::true_type { +}; + +template +struct pack_contains + : pack_contains { +}; + +template +struct pack_contains + : std::false_type { +}; + +// -------------------------------------------------------------------- + +template +class Group; + +template +class Accessor { + private: + std::lock_guard lock; + + public: + Accessor(Group& parent) + : lock{parent.mutex} + , data{parent.data} { + } + + T& data; +}; + +template +class Group { + private: + friend class Accessor; + + mutable std::mutex mutex; + T data; + + public: + Group() + : mutex{} + , data{} { + } + + Group(T const & data) + : mutex{} + , data{data} { + } + + Group(T&& data) + : mutex{} + , data{std::move(data)} { + } + + Group(Group const & other) + : mutex{} + , data{} { + std::lock_guard lock{other.mutex}; + data = other.data; + } + + Group(Group&& other) + : mutex{} + , data{} { + std::lock_guard lock{other.mutex}; + std::swap(data, other.data); + } + + operator T() const { + std::lock_guard lock{mutex}; + return data; + } +}; -- cgit v1.2.3 From afa2b578d6debc42bd4429b6efce8868b8f8fa81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gl=C3=B6ckner?= Date: Thu, 31 Mar 2016 10:12:20 +0200 Subject: Cleanup on Synced Settings Header --- src/syncedsettings.h | 128 ++++++++++++++++++++++----------------------------- 1 file changed, 56 insertions(+), 72 deletions(-) (limited to 'src/syncedsettings.h') diff --git a/src/syncedsettings.h b/src/syncedsettings.h index f83847c..eb8e66e 100644 --- a/src/syncedsettings.h +++ b/src/syncedsettings.h @@ -28,85 +28,69 @@ #include -// type trait helper +template class Group; -template -struct pack_contains; +template class Accessor +{ +private: + std::lock_guard lock; -template -struct pack_contains - : std::true_type { -}; +public: + Accessor(Group& parent) + : lock{parent.mutex} + , data{parent.data} + { + } -template -struct pack_contains - : pack_contains { + T& data; }; -template -struct pack_contains - : std::false_type { -}; +template class Group +{ +private: + friend class Accessor; -// -------------------------------------------------------------------- + mutable std::mutex mutex; + T data; -template -class Group; +public: + Group() + : mutex{} + , data{} + { + } -template -class Accessor { - private: - std::lock_guard lock; - - public: - Accessor(Group& parent) - : lock{parent.mutex} - , data{parent.data} { - } - - T& data; -}; + Group(T const& data) + : mutex{} + , data{data} + { + } + + Group(T&& data) + : mutex{} + , data{std::move(data)} + { + } + + Group(Group const& other) + : mutex{} + , data{} + { + std::lock_guard lock{other.mutex}; + data = other.data; + } + + Group(Group&& other) + : mutex{} + , data{} + { + std::lock_guard lock{other.mutex}; + std::swap(data, other.data); + } -template -class Group { - private: - friend class Accessor; - - mutable std::mutex mutex; - T data; - - public: - Group() - : mutex{} - , data{} { - } - - Group(T const & data) - : mutex{} - , data{data} { - } - - Group(T&& data) - : mutex{} - , data{std::move(data)} { - } - - Group(Group const & other) - : mutex{} - , data{} { - std::lock_guard lock{other.mutex}; - data = other.data; - } - - Group(Group&& other) - : mutex{} - , data{} { - std::lock_guard lock{other.mutex}; - std::swap(data, other.data); - } - - operator T() const { - std::lock_guard lock{mutex}; - return data; - } + operator T() const + { + std::lock_guard lock{mutex}; + return data; + } }; -- cgit v1.2.3 From b3ed57f43d0fc18de5ac2610eabc5a97d9eea4a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gl=C3=B6ckner?= Date: Thu, 31 Mar 2016 10:15:37 +0200 Subject: Added thread-safety to implicit cpy/mv assign op for synced group settings --- src/syncedsettings.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/syncedsettings.h') diff --git a/src/syncedsettings.h b/src/syncedsettings.h index eb8e66e..e60eb78 100644 --- a/src/syncedsettings.h +++ b/src/syncedsettings.h @@ -76,6 +76,7 @@ public: : mutex{} , data{} { + std::lock_guard lock{mutex}; std::lock_guard lock{other.mutex}; data = other.data; } @@ -84,6 +85,7 @@ public: : mutex{} , data{} { + std::lock_guard lock{mutex}; std::lock_guard lock{other.mutex}; std::swap(data, other.data); } -- cgit v1.2.3 From dd49e09e4a96635638ad674a337f8f95928ae277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gl=C3=B6ckner?= Date: Thu, 31 Mar 2016 10:21:18 +0200 Subject: Added explicit cpy/mv assign operators to be sure about thread-safety of Group --- src/syncedsettings.h | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'src/syncedsettings.h') diff --git a/src/syncedsettings.h b/src/syncedsettings.h index e60eb78..4991627 100644 --- a/src/syncedsettings.h +++ b/src/syncedsettings.h @@ -76,7 +76,6 @@ public: : mutex{} , data{} { - std::lock_guard lock{mutex}; std::lock_guard lock{other.mutex}; data = other.data; } @@ -85,11 +84,32 @@ public: : mutex{} , data{} { - std::lock_guard lock{mutex}; std::lock_guard lock{other.mutex}; std::swap(data, other.data); } + Group& operator=(const Group& other) + { + if (*this != &other) + { + std::lock_guard lock{mutex}; + std::lock_guard lock{other.mutex}; + data = other.data; + } + return *this; + } + + Group& operator=(Group&& other) + { + if (*this != &other) + { + std::lock_guard lock{mutex}; + std::lock_guard lock{other.mutex}; + std::swap(data, tmp.data); + } + return *this; + } + operator T() const { std::lock_guard lock{mutex}; -- cgit v1.2.3 From 28aec48039c6837f14848580b9a386d9d87de21d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gl=C3=B6ckner?= Date: Thu, 31 Mar 2016 10:22:19 +0200 Subject: Fixed my dumb fail --- src/syncedsettings.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/syncedsettings.h') diff --git a/src/syncedsettings.h b/src/syncedsettings.h index 4991627..b72229e 100644 --- a/src/syncedsettings.h +++ b/src/syncedsettings.h @@ -93,7 +93,7 @@ public: if (*this != &other) { std::lock_guard lock{mutex}; - std::lock_guard lock{other.mutex}; + std::lock_guard lock2{other.mutex}; data = other.data; } return *this; @@ -104,8 +104,8 @@ public: if (*this != &other) { std::lock_guard lock{mutex}; - std::lock_guard lock{other.mutex}; - std::swap(data, tmp.data); + std::lock_guard lock2{other.mutex}; + std::swap(data, other.data); } return *this; } -- cgit v1.2.3 From 8bbb15566e1025fe5784190fa0f594cc837c2673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gl=C3=B6ckner?= Date: Thu, 31 Mar 2016 10:40:02 +0200 Subject: Removed unused features and fixed tests --- src/syncedsettings.h | 12 ------------ 1 file changed, 12 deletions(-) (limited to 'src/syncedsettings.h') diff --git a/src/syncedsettings.h b/src/syncedsettings.h index b72229e..aa43cc0 100644 --- a/src/syncedsettings.h +++ b/src/syncedsettings.h @@ -60,18 +60,6 @@ public: { } - Group(T const& data) - : mutex{} - , data{data} - { - } - - Group(T&& data) - : mutex{} - , data{std::move(data)} - { - } - Group(Group const& other) : mutex{} , data{} -- cgit v1.2.3 From 7a149168533e9d147eb3460c92c4c872a2580fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gl=C3=B6ckner?= Date: Thu, 31 Mar 2016 10:53:04 +0200 Subject: Workaround outdated compiler version --- src/syncedsettings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/syncedsettings.h') diff --git a/src/syncedsettings.h b/src/syncedsettings.h index aa43cc0..0fe5efd 100644 --- a/src/syncedsettings.h +++ b/src/syncedsettings.h @@ -38,7 +38,7 @@ private: public: Accessor(Group& parent) : lock{parent.mutex} - , data{parent.data} + , data(parent.data) { } -- cgit v1.2.3