xref: /aosp_15_r20/external/deqp/framework/delibs/decpp/deMutex.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker #ifndef _DEMUTEX_HPP
2*35238bceSAndroid Build Coastguard Worker #define _DEMUTEX_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  * drawElements C++ Base Library
5*35238bceSAndroid Build Coastguard Worker  * -----------------------------
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker  *
9*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker  *
15*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker  *
21*35238bceSAndroid Build Coastguard Worker  *//*!
22*35238bceSAndroid Build Coastguard Worker  * \file
23*35238bceSAndroid Build Coastguard Worker  * \brief deMutex C++ wrapper.
24*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "deDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "deMutex.h"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker namespace de
30*35238bceSAndroid Build Coastguard Worker {
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
33*35238bceSAndroid Build Coastguard Worker  * \brief Mutual exclusion lock
34*35238bceSAndroid Build Coastguard Worker  *
35*35238bceSAndroid Build Coastguard Worker  * Mutex class provides standard mutual exclusion lock functionality.
36*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
37*35238bceSAndroid Build Coastguard Worker class Mutex
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker public:
40*35238bceSAndroid Build Coastguard Worker     Mutex(uint32_t flags = 0);
41*35238bceSAndroid Build Coastguard Worker     ~Mutex(void);
42*35238bceSAndroid Build Coastguard Worker 
43*35238bceSAndroid Build Coastguard Worker     void lock(void) throw();
44*35238bceSAndroid Build Coastguard Worker     void unlock(void) throw();
45*35238bceSAndroid Build Coastguard Worker     bool tryLock(void) throw();
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker private:
48*35238bceSAndroid Build Coastguard Worker     Mutex(const Mutex &other);            // Not allowed!
49*35238bceSAndroid Build Coastguard Worker     Mutex &operator=(const Mutex &other); // Not allowed!
50*35238bceSAndroid Build Coastguard Worker 
51*35238bceSAndroid Build Coastguard Worker     deMutex m_mutex;
52*35238bceSAndroid Build Coastguard Worker };
53*35238bceSAndroid Build Coastguard Worker 
54*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
55*35238bceSAndroid Build Coastguard Worker  * \brief Scoped mutex lock.
56*35238bceSAndroid Build Coastguard Worker  *
57*35238bceSAndroid Build Coastguard Worker  * ScopedLock provides helper for maintaining Mutex lock for the duration
58*35238bceSAndroid Build Coastguard Worker  * of current scope. The lock is acquired in constructor and released
59*35238bceSAndroid Build Coastguard Worker  * when ScopedLock goes out of scope.
60*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
61*35238bceSAndroid Build Coastguard Worker class ScopedLock
62*35238bceSAndroid Build Coastguard Worker {
63*35238bceSAndroid Build Coastguard Worker public:
64*35238bceSAndroid Build Coastguard Worker     ScopedLock(Mutex &mutex);
~ScopedLock(void)65*35238bceSAndroid Build Coastguard Worker     ~ScopedLock(void)
66*35238bceSAndroid Build Coastguard Worker     {
67*35238bceSAndroid Build Coastguard Worker         m_mutex.unlock();
68*35238bceSAndroid Build Coastguard Worker     }
69*35238bceSAndroid Build Coastguard Worker 
70*35238bceSAndroid Build Coastguard Worker private:
71*35238bceSAndroid Build Coastguard Worker     ScopedLock(const ScopedLock &other);            // Not allowed!
72*35238bceSAndroid Build Coastguard Worker     ScopedLock &operator=(const ScopedLock &other); // Not allowed!
73*35238bceSAndroid Build Coastguard Worker 
74*35238bceSAndroid Build Coastguard Worker     Mutex &m_mutex;
75*35238bceSAndroid Build Coastguard Worker };
76*35238bceSAndroid Build Coastguard Worker 
77*35238bceSAndroid Build Coastguard Worker // Mutex inline implementations.
78*35238bceSAndroid Build Coastguard Worker 
79*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
80*35238bceSAndroid Build Coastguard Worker  * \brief Acquire mutex lock.
81*35238bceSAndroid Build Coastguard Worker  * \note This method will never report failure. If an error occurs due
82*35238bceSAndroid Build Coastguard Worker  *         to misuse or other reason it will lead to process termination
83*35238bceSAndroid Build Coastguard Worker *         in debug build.
84*35238bceSAndroid Build Coastguard Worker  *
85*35238bceSAndroid Build Coastguard Worker  * If mutex is currently locked the function will block until current
86*35238bceSAndroid Build Coastguard Worker  * lock is released.
87*35238bceSAndroid Build Coastguard Worker  *
88*35238bceSAndroid Build Coastguard Worker  * In recursive mode further calls from the thread owning the mutex will
89*35238bceSAndroid Build Coastguard Worker  * succeed and increment lock count.
90*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
lock(void)91*35238bceSAndroid Build Coastguard Worker inline void Mutex::lock(void) throw()
92*35238bceSAndroid Build Coastguard Worker {
93*35238bceSAndroid Build Coastguard Worker     deMutex_lock(m_mutex);
94*35238bceSAndroid Build Coastguard Worker }
95*35238bceSAndroid Build Coastguard Worker 
96*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
97*35238bceSAndroid Build Coastguard Worker  * \brief Release mutex lock.
98*35238bceSAndroid Build Coastguard Worker  * \note This method will never report failure. If an error occurs due
99*35238bceSAndroid Build Coastguard Worker  *         to misuse or other reason it will lead to process termination
100*35238bceSAndroid Build Coastguard Worker *         in debug build.
101*35238bceSAndroid Build Coastguard Worker  *
102*35238bceSAndroid Build Coastguard Worker  * In recursive mode the mutex will be released once the lock count reaches
103*35238bceSAndroid Build Coastguard Worker  * zero.
104*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
unlock(void)105*35238bceSAndroid Build Coastguard Worker inline void Mutex::unlock(void) throw()
106*35238bceSAndroid Build Coastguard Worker {
107*35238bceSAndroid Build Coastguard Worker     deMutex_unlock(m_mutex);
108*35238bceSAndroid Build Coastguard Worker }
109*35238bceSAndroid Build Coastguard Worker 
110*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
111*35238bceSAndroid Build Coastguard Worker  * \brief Try to acquire lock.
112*35238bceSAndroid Build Coastguard Worker  * \return Returns true if lock was acquired and false otherwise.
113*35238bceSAndroid Build Coastguard Worker  *
114*35238bceSAndroid Build Coastguard Worker  * This function will never block, i.e. it will return false if mutex
115*35238bceSAndroid Build Coastguard Worker  * is currently locked.
116*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
tryLock(void)117*35238bceSAndroid Build Coastguard Worker inline bool Mutex::tryLock(void) throw()
118*35238bceSAndroid Build Coastguard Worker {
119*35238bceSAndroid Build Coastguard Worker     return deMutex_tryLock(m_mutex) == true;
120*35238bceSAndroid Build Coastguard Worker }
121*35238bceSAndroid Build Coastguard Worker 
122*35238bceSAndroid Build Coastguard Worker // ScopedLock inline implementations.
123*35238bceSAndroid Build Coastguard Worker 
124*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
125*35238bceSAndroid Build Coastguard Worker  * \brief Acquire scoped lock to mutex.
126*35238bceSAndroid Build Coastguard Worker  * \param mutex Mutex to be locked.
127*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
ScopedLock(Mutex & mutex)128*35238bceSAndroid Build Coastguard Worker inline ScopedLock::ScopedLock(Mutex &mutex) : m_mutex(mutex)
129*35238bceSAndroid Build Coastguard Worker {
130*35238bceSAndroid Build Coastguard Worker     m_mutex.lock();
131*35238bceSAndroid Build Coastguard Worker }
132*35238bceSAndroid Build Coastguard Worker 
133*35238bceSAndroid Build Coastguard Worker } // namespace de
134*35238bceSAndroid Build Coastguard Worker 
135*35238bceSAndroid Build Coastguard Worker #endif // _DEMUTEX_HPP
136