Line data Source code
1 : // Copyright (c) 2015 The Bitcoin Core developers 2 : // Copyright (c) 2017-2022 The PIVX Core developers 3 : // Distributed under the MIT software license, see the accompanying 4 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 5 : 6 : #include "sync.h" 7 : 8 : #include <boost/test/unit_test.hpp> 9 : 10 : BOOST_AUTO_TEST_SUITE(reverselock_tests) 11 : 12 2 : BOOST_AUTO_TEST_CASE(reverselock_basics) 13 : { 14 2 : Mutex mutex; 15 2 : WAIT_LOCK(mutex, lock); 16 : 17 2 : BOOST_CHECK(lock.owns_lock()); 18 1 : { 19 2 : REVERSE_LOCK(lock); 20 2 : BOOST_CHECK(!lock.owns_lock()); 21 : } 22 2 : BOOST_CHECK(lock.owns_lock()); 23 1 : } 24 : 25 2 : BOOST_AUTO_TEST_CASE(reverselock_multiple) 26 : { 27 2 : Mutex mutex2; 28 2 : Mutex mutex; 29 2 : WAIT_LOCK(mutex2, lock2); 30 2 : WAIT_LOCK(mutex, lock); 31 : 32 : // Make sure undoing two locks succeeds 33 1 : { 34 2 : REVERSE_LOCK(lock); 35 2 : BOOST_CHECK(!lock.owns_lock()); 36 2 : REVERSE_LOCK(lock2); 37 2 : BOOST_CHECK(!lock2.owns_lock()); 38 : } 39 1 : BOOST_CHECK(lock.owns_lock()); 40 2 : BOOST_CHECK(lock2.owns_lock()); 41 1 : } 42 : 43 2 : BOOST_AUTO_TEST_CASE(reverselock_errors) 44 : { 45 2 : Mutex mutex2; 46 2 : Mutex mutex; 47 2 : WAIT_LOCK(mutex2, lock2); 48 2 : WAIT_LOCK(mutex, lock); 49 : 50 : #ifdef DEBUG_LOCKORDER 51 : // Make sure trying to reverse lock a previous lock fails 52 : try { 53 : REVERSE_LOCK(lock2); 54 : BOOST_CHECK(false); // REVERSE_LOCK(lock2) succeeded 55 : } catch(...) { } 56 : BOOST_CHECK(lock2.owns_lock()); 57 : #endif 58 : 59 : // Make sure trying to reverse lock an unlocked lock fails 60 1 : lock.unlock(); 61 : 62 2 : BOOST_CHECK(!lock.owns_lock()); 63 : 64 1 : bool failed = false; 65 1 : try { 66 1 : REVERSE_LOCK(lock); 67 1 : } catch(...) { 68 1 : failed = true; 69 : } 70 : 71 2 : BOOST_CHECK(failed); 72 2 : BOOST_CHECK(!lock.owns_lock()); 73 : 74 : // Locking the original lock after it has been taken by a reverse lock 75 : // makes no sense. Ensure that the original lock no longer owns the lock 76 : // after giving it to a reverse one. 77 : 78 1 : lock.lock(); 79 2 : BOOST_CHECK(lock.owns_lock()); 80 1 : { 81 2 : REVERSE_LOCK(lock); 82 2 : BOOST_CHECK(!lock.owns_lock()); 83 : } 84 : 85 2 : BOOST_CHECK(failed); 86 2 : BOOST_CHECK(lock.owns_lock()); 87 1 : } 88 : 89 : BOOST_AUTO_TEST_SUITE_END()