151c0b2f7Stbbdev /* 2b15aabb3Stbbdev Copyright (c) 2005-2021 Intel Corporation 351c0b2f7Stbbdev 451c0b2f7Stbbdev Licensed under the Apache License, Version 2.0 (the "License"); 551c0b2f7Stbbdev you may not use this file except in compliance with the License. 651c0b2f7Stbbdev You may obtain a copy of the License at 751c0b2f7Stbbdev 851c0b2f7Stbbdev http://www.apache.org/licenses/LICENSE-2.0 951c0b2f7Stbbdev 1051c0b2f7Stbbdev Unless required by applicable law or agreed to in writing, software 1151c0b2f7Stbbdev distributed under the License is distributed on an "AS IS" BASIS, 1251c0b2f7Stbbdev WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1351c0b2f7Stbbdev See the License for the specific language governing permissions and 1451c0b2f7Stbbdev limitations under the License. 1551c0b2f7Stbbdev */ 1651c0b2f7Stbbdev 17478de5b1Stbbdev #if __INTEL_COMPILER && _MSC_VER 18478de5b1Stbbdev #pragma warning(disable : 2586) // decorated name length exceeded, name was truncated 19478de5b1Stbbdev #endif 20478de5b1Stbbdev 214523a761Stbbdev #include "conformance_mutex.h" 2251c0b2f7Stbbdev 2349e08aacStbbdev #include "oneapi/tbb/spin_mutex.h" 244523a761Stbbdev #include "oneapi/tbb/mutex.h" 2549e08aacStbbdev #include "oneapi/tbb/spin_rw_mutex.h" 264523a761Stbbdev #include "oneapi/tbb/rw_mutex.h" 2749e08aacStbbdev #include "oneapi/tbb/queuing_mutex.h" 2849e08aacStbbdev #include "oneapi/tbb/queuing_rw_mutex.h" 2949e08aacStbbdev #include "oneapi/tbb/null_mutex.h" 3049e08aacStbbdev #include "oneapi/tbb/null_rw_mutex.h" 3151c0b2f7Stbbdev 3251c0b2f7Stbbdev //! \file conformance_mutex.cpp 33*3ab999a0SPavel Kumbrasev //! \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 3451c0b2f7Stbbdev 3551c0b2f7Stbbdev //! Testing Mutex requirements 3651c0b2f7Stbbdev //! \brief \ref interface \ref requirement 3751c0b2f7Stbbdev TEST_CASE("Basic Locable requirement test") { 3851c0b2f7Stbbdev // BasicLockable 3949e08aacStbbdev GeneralTest<oneapi::tbb::spin_mutex>("Spin Mutex"); 4049e08aacStbbdev GeneralTest<oneapi::tbb::spin_rw_mutex>("Spin RW Mutex"); 4149e08aacStbbdev GeneralTest<oneapi::tbb::queuing_mutex>("Queuing Mutex"); 4249e08aacStbbdev GeneralTest<oneapi::tbb::queuing_rw_mutex>("Queuing RW Mutex"); 43*3ab999a0SPavel Kumbrasev GeneralTest<oneapi::tbb::mutex>("Adaptive Mutex"); 44*3ab999a0SPavel Kumbrasev GeneralTest<oneapi::tbb::rw_mutex>("Adaptive RW Mutex"); 4597ac8f43SAlex // TODO: Consider adding Thread Sanitizer (note that accesses inside the transaction 4697ac8f43SAlex // considered as races by Thread Sanitizer) 4797ac8f43SAlex #if !__TBB_USE_THREAD_SANITIZER 4849e08aacStbbdev GeneralTest<oneapi::tbb::speculative_spin_mutex>("Speculative Spin Mutex"); 4949e08aacStbbdev GeneralTest<oneapi::tbb::speculative_spin_rw_mutex>("Speculative Spin RW Mutex"); 5097ac8f43SAlex #endif 5151c0b2f7Stbbdev // NullMutexes 52478de5b1Stbbdev GeneralTest<oneapi::tbb::null_mutex, utils::AtomicCounter<oneapi::tbb::null_mutex>>("Null Mutex", false); 53478de5b1Stbbdev GeneralTest<oneapi::tbb::null_rw_mutex, utils::AtomicCounter<oneapi::tbb::null_rw_mutex>>("Null RW Mutex", false); 5449e08aacStbbdev TestNullMutex<oneapi::tbb::null_mutex>("Null Mutex"); 5549e08aacStbbdev TestNullMutex<oneapi::tbb::null_rw_mutex>("Null RW Mutex"); 5651c0b2f7Stbbdev } 5751c0b2f7Stbbdev 5851c0b2f7Stbbdev //! \brief \ref interface \ref requirement 5951c0b2f7Stbbdev TEST_CASE("Lockable requirement test") { 6051c0b2f7Stbbdev // Lockable - single threaded try_acquire operations 6149e08aacStbbdev TestTryAcquire<oneapi::tbb::spin_mutex>("Spin Mutex"); 6249e08aacStbbdev TestTryAcquire<oneapi::tbb::spin_rw_mutex>("Spin RW Mutex"); 6349e08aacStbbdev TestTryAcquire<oneapi::tbb::queuing_mutex>("Queuing Mutex"); 6449e08aacStbbdev TestTryAcquire<oneapi::tbb::queuing_rw_mutex>("Queuing RW Mutex"); 65*3ab999a0SPavel Kumbrasev TestTryAcquire<oneapi::tbb::mutex>("Adaptive Mutex"); 66*3ab999a0SPavel Kumbrasev TestTryAcquire<oneapi::tbb::rw_mutex>("Adaptive RW Mutex"); 6797ac8f43SAlex #if !__TBB_USE_THREAD_SANITIZER 6849e08aacStbbdev TestTryAcquire<oneapi::tbb::speculative_spin_mutex>("Speculative Spin Mutex"); 6949e08aacStbbdev TestTryAcquire<oneapi::tbb::speculative_spin_rw_mutex>("Speculative Spin RW Mutex"); 7097ac8f43SAlex #endif 7149e08aacStbbdev TestTryAcquire<oneapi::tbb::null_mutex>("Null Mutex"); 7251c0b2f7Stbbdev } 7351c0b2f7Stbbdev 7451c0b2f7Stbbdev //! Testing ReaderWriterMutex requirements 7551c0b2f7Stbbdev //! \brief \ref interface \ref requirement 7651c0b2f7Stbbdev TEST_CASE("Shared mutexes (reader/writer) test") { 7751c0b2f7Stbbdev // General reader writer capabilities + upgrade/downgrade 7849e08aacStbbdev TestReaderWriterLock<oneapi::tbb::spin_rw_mutex>("Spin RW Mutex"); 7949e08aacStbbdev TestReaderWriterLock<oneapi::tbb::queuing_rw_mutex>("Queuing RW Mutex"); 80*3ab999a0SPavel Kumbrasev TestReaderWriterLock<oneapi::tbb::rw_mutex>("Adaptive RW Mutex"); 8149e08aacStbbdev TestNullRWMutex<oneapi::tbb::null_rw_mutex>("Null RW Mutex"); 8251c0b2f7Stbbdev // Single threaded read/write try_acquire operations 8349e08aacStbbdev TestTryAcquireReader<oneapi::tbb::spin_rw_mutex>("Spin RW Mutex"); 8449e08aacStbbdev TestTryAcquireReader<oneapi::tbb::queuing_rw_mutex>("Queuing RW Mutex"); 8549e08aacStbbdev TestRWStateMultipleChange<oneapi::tbb::spin_rw_mutex>("Spin RW Mutex"); 8649e08aacStbbdev TestRWStateMultipleChange<oneapi::tbb::queuing_rw_mutex>("Queuing RW Mutex"); 87*3ab999a0SPavel Kumbrasev TestRWStateMultipleChange<oneapi::tbb::rw_mutex>("Adaptive RW Mutex"); 8897ac8f43SAlex TestTryAcquireReader<oneapi::tbb::null_rw_mutex>("Null RW Mutex"); 8997ac8f43SAlex #if !__TBB_USE_THREAD_SANITIZER 9097ac8f43SAlex TestReaderWriterLock<oneapi::tbb::speculative_spin_rw_mutex>("Speculative Spin RW Mutex"); 9149e08aacStbbdev TestTryAcquireReader<oneapi::tbb::speculative_spin_rw_mutex>("Speculative Spin RW Mutex"); 9249e08aacStbbdev TestRWStateMultipleChange<oneapi::tbb::speculative_spin_rw_mutex>("Speculative Spin RW Mutex"); 9397ac8f43SAlex #endif 9451c0b2f7Stbbdev } 9551c0b2f7Stbbdev 9651c0b2f7Stbbdev //! Testing ISO C++ Mutex and Shared Mutex requirements. 9751c0b2f7Stbbdev //! Compatibility with the standard 9851c0b2f7Stbbdev //! \brief \ref interface \ref requirement 9951c0b2f7Stbbdev TEST_CASE("ISO interface test") { 10049e08aacStbbdev GeneralTest<TBB_MutexFromISO_Mutex<oneapi::tbb::spin_mutex> >("ISO Spin Mutex"); 10149e08aacStbbdev GeneralTest<TBB_MutexFromISO_Mutex<oneapi::tbb::spin_rw_mutex> >("ISO Spin RW Mutex"); 102*3ab999a0SPavel Kumbrasev GeneralTest<TBB_MutexFromISO_Mutex<oneapi::tbb::mutex> >("ISO Adaprive Mutex"); 103*3ab999a0SPavel Kumbrasev GeneralTest<TBB_MutexFromISO_Mutex<oneapi::tbb::rw_mutex>>("ISO Adaptive RW Mutex"); 10449e08aacStbbdev TestTryAcquire<TBB_MutexFromISO_Mutex<oneapi::tbb::spin_mutex> >("ISO Spin Mutex"); 10549e08aacStbbdev TestTryAcquire<TBB_MutexFromISO_Mutex<oneapi::tbb::spin_rw_mutex> >("ISO Spin RW Mutex"); 106*3ab999a0SPavel Kumbrasev TestTryAcquire<TBB_MutexFromISO_Mutex<oneapi::tbb::mutex> >("ISO Adaptive Mutex"); 107*3ab999a0SPavel Kumbrasev TestTryAcquire<TBB_MutexFromISO_Mutex<oneapi::tbb::rw_mutex>>("ISO Adaptive RW Mutex"); 10849e08aacStbbdev TestTryAcquireReader<TBB_MutexFromISO_Mutex<oneapi::tbb::spin_rw_mutex> >("ISO Spin RW Mutex"); 10949e08aacStbbdev TestReaderWriterLock<TBB_MutexFromISO_Mutex<oneapi::tbb::spin_rw_mutex> >("ISO Spin RW Mutex"); 110*3ab999a0SPavel Kumbrasev TestTryAcquireReader<TBB_MutexFromISO_Mutex<oneapi::tbb::rw_mutex>>("ISO Adaptive RW Mutex"); 111*3ab999a0SPavel Kumbrasev TestReaderWriterLock<TBB_MutexFromISO_Mutex<oneapi::tbb::rw_mutex>>("ISO Adaptive RW Mutex"); 11251c0b2f7Stbbdev } 113