summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2015-11-17 22:05:16 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2015-11-17 22:05:16 +0000
commitfb56ee788784bb285de4b56e981580756c61e477 (patch)
treeb636e12986f867014c501a262e2e67640c627080
parentAdd doxygen comments (diff)
downloadlibadhocutil-fb56ee788784bb285de4b56e981580756c61e477.tar.bz2
libadhocutil-fb56ee788784bb285de4b56e981580756c61e477.tar.xz
libadhocutil-fb56ee788784bb285de4b56e981580756c61e477.zip
Improve core with traits and decltype for working with functions that return references to mutexes.
Add support for upgradable locks
-rw-r--r--libadhocutil/lockHelpers.h29
-rw-r--r--libadhocutil/unittests/testLocks.cpp17
2 files changed, 35 insertions, 11 deletions
diff --git a/libadhocutil/lockHelpers.h b/libadhocutil/lockHelpers.h
index 5ac4bf7..1482644 100644
--- a/libadhocutil/lockHelpers.h
+++ b/libadhocutil/lockHelpers.h
@@ -1,13 +1,15 @@
#ifndef ADHOCUTIL_LOCKHELPERS_H
#define ADHOCUTIL_LOCKHELPERS_H
+#include <type_traits>
+
/// @cond
template <typename locktype>
-class _LockLoop {
+class _LockLoop : public locktype {
public:
- template<typename l>
- _LockLoop(l & _l) :
- lock(_l),
+ template<typename MutexType>
+ _LockLoop(MutexType & m) :
+ locktype(m),
flag(true)
{
}
@@ -16,7 +18,6 @@ class _LockLoop {
void operator!() { flag = false; }
private:
- locktype lock;
bool flag;
};
/// @endcond
@@ -24,15 +25,21 @@ class _LockLoop {
#define LIBADHOC_LOCK_CONCAT2(a, b) a ## b
#define LIBADHOC_LOCK_CONCAT(a, b) LIBADHOC_LOCK_CONCAT2(a, b)
#define LIBADHOC_LOCK_WITHLINE(a) LIBADHOC_LOCK_CONCAT(a, __LINE__)
+#define LIBADHOC_RRT(l) typename std::remove_reference<decltype(l)>::type
-#define BaseScopeLock(l,lt,mt) for (_LockLoop<lt<mt>> LIBADHOC_LOCK_WITHLINE(_lck)(l); LIBADHOC_LOCK_WITHLINE(_lck); !LIBADHOC_LOCK_WITHLINE(_lck))
-#define BaseLock(l,lt,mt) lt<mt> LIBADHOC_LOCK_WITHLINE(_lck)(l)
+#define BaseScopeLock(l,lt) for (_LockLoop<lt<LIBADHOC_RRT(l)>> LIBADHOC_LOCK_WITHLINE(_lck)(l); LIBADHOC_LOCK_WITHLINE(_lck); !LIBADHOC_LOCK_WITHLINE(_lck))
+#define TypeBaseLock(l,lt,mt) lt<mt> LIBADHOC_LOCK_WITHLINE(_lck)(l)
+#define BaseLock(l,lt) TypeBaseLock(l, lt, LIBADHOC_RRT(l))
-#define Lock(l) BaseLock(l, boost::unique_lock, boost::shared_mutex)
-#define SharedLock(l) BaseLock(l, boost::shared_lock, boost::shared_mutex)
+#define Lock(l) BaseLock(l, boost::unique_lock)
+#define SharedLock(l) BaseLock(l, boost::shared_lock)
+#define UpgradableLock(l, ln) boost::upgrade_lock<LIBADHOC_RRT(l)> ln(l)
+#define UpgradeLock(l) TypeBaseLock(l, boost::upgrade_to_unique_lock, LIBADHOC_RRT(l)::mutex_type)
-#define ScopeLock(l) BaseScopeLock(l, boost::unique_lock, boost::shared_mutex)
-#define SharedScopeLock(l) BaseScopeLock(l, boost::shared_lock, boost::shared_mutex)
+#define ScopeLock(l) BaseScopeLock(l, boost::unique_lock)
+#define SharedScopeLock(l) BaseScopeLock(l, boost::shared_lock)
+#define UpgradableScopeLock(l, ln) for (_LockLoop<boost::upgrade_lock<LIBADHOC_RRT(l)>> ln(l); ln; !ln)
+#define UpgradeScopeLock(l) for (_LockLoop<boost::upgrade_to_unique_lock<LIBADHOC_RRT(l)::mutex_type>> LIBADHOC_LOCK_WITHLINE(_lck)(l); LIBADHOC_LOCK_WITHLINE(_lck); !LIBADHOC_LOCK_WITHLINE(_lck))
#endif
diff --git a/libadhocutil/unittests/testLocks.cpp b/libadhocutil/unittests/testLocks.cpp
index bdf0d18..4b0bad5 100644
--- a/libadhocutil/unittests/testLocks.cpp
+++ b/libadhocutil/unittests/testLocks.cpp
@@ -16,6 +16,14 @@ BOOST_AUTO_TEST_CASE ( sharedlock )
SharedLock(_lock);
}
+BOOST_AUTO_TEST_CASE ( upgradelock )
+{
+ boost::upgrade_mutex _lock;
+ UpgradableLock(_lock, ln);
+ UpgradeScopeLock(ln) { }
+ UpgradeLock(ln);
+}
+
BOOST_AUTO_TEST_CASE ( scopelock )
{
boost::shared_mutex _lock;
@@ -28,3 +36,12 @@ BOOST_AUTO_TEST_CASE ( sharedscopelock )
SharedScopeLock(_lock) { }
}
+BOOST_AUTO_TEST_CASE ( upgradescopelock )
+{
+ boost::upgrade_mutex _lock;
+ UpgradableScopeLock(_lock, ln) {
+ UpgradeScopeLock(ln) { }
+ UpgradeLock(ln);
+ }
+}
+