1 /* 2 Copyright (c) 2005-2021 Intel Corporation 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 #if __INTEL_COMPILER && _MSC_VER 18 #pragma warning(disable : 2586) // decorated name length exceeded, name was truncated 19 #endif 20 21 #include "conformance_mutex.h" 22 23 #include "oneapi/tbb/spin_mutex.h" 24 #include "oneapi/tbb/mutex.h" 25 #include "oneapi/tbb/spin_rw_mutex.h" 26 #include "oneapi/tbb/rw_mutex.h" 27 #include "oneapi/tbb/queuing_mutex.h" 28 #include "oneapi/tbb/queuing_rw_mutex.h" 29 #include "oneapi/tbb/null_mutex.h" 30 #include "oneapi/tbb/null_rw_mutex.h" 31 32 //! \file conformance_mutex.cpp 33 //! \brief Test for [mutex.spin_mutex mutex.spin_rw_mutex mutex.queuing_mutex mutex.queuing_rw_mutex mutex.mutex mutex.rw_mutex mutex.speculative_spin_mutex mutex.speculative_spin_rw_mutex mutex.null_mutex mutex.null_rw_mutex] specifications 34 35 //! Testing Mutex requirements 36 //! \brief \ref interface \ref requirement 37 TEST_CASE("Basic Locable requirement test") { 38 // BasicLockable 39 GeneralTest<oneapi::tbb::spin_mutex>("Spin Mutex"); 40 GeneralTest<oneapi::tbb::spin_rw_mutex>("Spin RW Mutex"); 41 GeneralTest<oneapi::tbb::queuing_mutex>("Queuing Mutex"); 42 GeneralTest<oneapi::tbb::queuing_rw_mutex>("Queuing RW Mutex"); 43 GeneralTest<oneapi::tbb::mutex>("Adaptive Mutex"); 44 GeneralTest<oneapi::tbb::rw_mutex>("Adaptive RW Mutex"); 45 // TODO: Consider adding Thread Sanitizer (note that accesses inside the transaction 46 // considered as races by Thread Sanitizer) 47 #if !__TBB_USE_THREAD_SANITIZER 48 GeneralTest<oneapi::tbb::speculative_spin_mutex>("Speculative Spin Mutex"); 49 GeneralTest<oneapi::tbb::speculative_spin_rw_mutex>("Speculative Spin RW Mutex"); 50 #endif 51 // NullMutexes 52 GeneralTest<oneapi::tbb::null_mutex, utils::AtomicCounter<oneapi::tbb::null_mutex>>("Null Mutex", false); 53 GeneralTest<oneapi::tbb::null_rw_mutex, utils::AtomicCounter<oneapi::tbb::null_rw_mutex>>("Null RW Mutex", false); 54 TestNullMutex<oneapi::tbb::null_mutex>("Null Mutex"); 55 TestNullMutex<oneapi::tbb::null_rw_mutex>("Null RW Mutex"); 56 } 57 58 //! \brief \ref interface \ref requirement 59 TEST_CASE("Lockable requirement test") { 60 // Lockable - single threaded try_acquire operations 61 TestTryAcquire<oneapi::tbb::spin_mutex>("Spin Mutex"); 62 TestTryAcquire<oneapi::tbb::spin_rw_mutex>("Spin RW Mutex"); 63 TestTryAcquire<oneapi::tbb::queuing_mutex>("Queuing Mutex"); 64 TestTryAcquire<oneapi::tbb::queuing_rw_mutex>("Queuing RW Mutex"); 65 TestTryAcquire<oneapi::tbb::mutex>("Adaptive Mutex"); 66 TestTryAcquire<oneapi::tbb::rw_mutex>("Adaptive RW Mutex"); 67 #if !__TBB_USE_THREAD_SANITIZER 68 TestTryAcquire<oneapi::tbb::speculative_spin_mutex>("Speculative Spin Mutex"); 69 TestTryAcquire<oneapi::tbb::speculative_spin_rw_mutex>("Speculative Spin RW Mutex"); 70 #endif 71 TestTryAcquire<oneapi::tbb::null_mutex>("Null Mutex"); 72 } 73 74 //! Testing ReaderWriterMutex requirements 75 //! \brief \ref interface \ref requirement 76 TEST_CASE("Shared mutexes (reader/writer) test") { 77 // General reader writer capabilities + upgrade/downgrade 78 TestReaderWriterLock<oneapi::tbb::spin_rw_mutex>("Spin RW Mutex"); 79 TestReaderWriterLock<oneapi::tbb::queuing_rw_mutex>("Queuing RW Mutex"); 80 TestReaderWriterLock<oneapi::tbb::rw_mutex>("Adaptive RW Mutex"); 81 TestNullRWMutex<oneapi::tbb::null_rw_mutex>("Null RW Mutex"); 82 // Single threaded read/write try_acquire operations 83 TestTryAcquireReader<oneapi::tbb::spin_rw_mutex>("Spin RW Mutex"); 84 TestTryAcquireReader<oneapi::tbb::queuing_rw_mutex>("Queuing RW Mutex"); 85 TestRWStateMultipleChange<oneapi::tbb::spin_rw_mutex>("Spin RW Mutex"); 86 TestRWStateMultipleChange<oneapi::tbb::queuing_rw_mutex>("Queuing RW Mutex"); 87 TestRWStateMultipleChange<oneapi::tbb::rw_mutex>("Adaptive RW Mutex"); 88 TestTryAcquireReader<oneapi::tbb::null_rw_mutex>("Null RW Mutex"); 89 #if !__TBB_USE_THREAD_SANITIZER 90 TestReaderWriterLock<oneapi::tbb::speculative_spin_rw_mutex>("Speculative Spin RW Mutex"); 91 TestTryAcquireReader<oneapi::tbb::speculative_spin_rw_mutex>("Speculative Spin RW Mutex"); 92 TestRWStateMultipleChange<oneapi::tbb::speculative_spin_rw_mutex>("Speculative Spin RW Mutex"); 93 #endif 94 } 95 96 //! Testing ISO C++ Mutex and Shared Mutex requirements. 97 //! Compatibility with the standard 98 //! \brief \ref interface \ref requirement 99 TEST_CASE("ISO interface test") { 100 GeneralTest<TBB_MutexFromISO_Mutex<oneapi::tbb::spin_mutex> >("ISO Spin Mutex"); 101 GeneralTest<TBB_MutexFromISO_Mutex<oneapi::tbb::spin_rw_mutex> >("ISO Spin RW Mutex"); 102 GeneralTest<TBB_MutexFromISO_Mutex<oneapi::tbb::mutex> >("ISO Adaprive Mutex"); 103 GeneralTest<TBB_MutexFromISO_Mutex<oneapi::tbb::rw_mutex>>("ISO Adaptive RW Mutex"); 104 TestTryAcquire<TBB_MutexFromISO_Mutex<oneapi::tbb::spin_mutex> >("ISO Spin Mutex"); 105 TestTryAcquire<TBB_MutexFromISO_Mutex<oneapi::tbb::spin_rw_mutex> >("ISO Spin RW Mutex"); 106 TestTryAcquire<TBB_MutexFromISO_Mutex<oneapi::tbb::mutex> >("ISO Adaptive Mutex"); 107 TestTryAcquire<TBB_MutexFromISO_Mutex<oneapi::tbb::rw_mutex>>("ISO Adaptive RW Mutex"); 108 TestTryAcquireReader<TBB_MutexFromISO_Mutex<oneapi::tbb::spin_rw_mutex> >("ISO Spin RW Mutex"); 109 TestReaderWriterLock<TBB_MutexFromISO_Mutex<oneapi::tbb::spin_rw_mutex> >("ISO Spin RW Mutex"); 110 TestTryAcquireReader<TBB_MutexFromISO_Mutex<oneapi::tbb::rw_mutex>>("ISO Adaptive RW Mutex"); 111 TestReaderWriterLock<TBB_MutexFromISO_Mutex<oneapi::tbb::rw_mutex>>("ISO Adaptive RW Mutex"); 112 } 113