xref: /aosp_15_r20/external/ComputeLibrary/support/Mutex.h (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1 /*
2  * Copyright (c) 2017-2019 Arm Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #ifndef __ARM_COMPUTE_MUTEX_H__
25 #define __ARM_COMPUTE_MUTEX_H__
26 
27 #include <mutex>
28 
29 namespace arm_compute
30 {
31 #ifndef NO_MULTI_THREADING
32 /** Wrapper of Mutex data-object */
33 using Mutex = std::mutex;
34 
35 /** Wrapper of lock_guard data-object */
36 template <typename Mutex>
37 using lock_guard = std::lock_guard<Mutex>;
38 
39 /** Wrapper of lock_guard data-object */
40 template <typename Mutex>
41 using unique_lock = std::unique_lock<Mutex>;
42 #else  /* NO_MULTI_THREADING */
43 /** Wrapper implementation of Mutex data-object */
44 class Mutex
45 {
46 public:
47     /** Default constructor */
48     Mutex() = default;
49     /** Default destructor */
50     ~Mutex() = default;
51 
52     /** Lock */
53     void lock() {};
54 
55     /** Unlock */
56     void unlock() {};
57 
58     /** Try the lock.
59      *
60      * @return true.
61      */
62     bool try_lock()
63     {
64         return true;
65     }
66 };
67 
68 /** Wrapper implementation of lock-guard data-object */
69 template <typename Mutex>
70 class lock_guard
71 {
72 public:
73     typedef Mutex mutex_type;
74 
75 public:
76     explicit lock_guard(Mutex &m_)
77         : m(m_)
78     {
79     }
80     ~lock_guard()
81     {
82     }
83     lock_guard(const lock_guard &) = delete;
84 
85 private:
86     mutex_type &m;
87 };
88 
89 /** Wrapper implementation of unique-lock data-object */
90 template <typename Mutex>
91 class unique_lock
92 {
93 public:
94     typedef Mutex mutex_type;
95 
96 public:
97     unique_lock() noexcept : m(nullptr)
98     {
99     }
100     explicit unique_lock(mutex_type &m)
101         : m(&m)
102     {
103     }
104     unique_lock(const unique_lock &) = delete;
105     unique_lock(unique_lock &&)      = default;
106     unique_lock &operator=(const unique_lock &) = delete;
107     unique_lock &operator=(unique_lock &&) = default;
108     ~unique_lock()                         = default;
109     void lock()
110     {
111     }
112     bool try_lock()
113     {
114         return true;
115     }
116     void unlock()
117     {
118     }
119 
120 private:
121     mutex_type *m;
122 };
123 #endif /* NO_MULTI_THREADING */
124 }
125 #endif /* __ARM_COMPUTE_MUTEX_H__ */
126