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