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