libnx  v4.2.2
mutex.h
Go to the documentation of this file.
1 /**
2  * @file mutex.h
3  * @brief Mutex synchronization primitive.
4  * @author plutoo
5  * @copyright libnx Authors
6  */
7 #pragma once
8 #include <sys/lock.h>
9 #include "../types.h"
10 
11 /// Mutex datatype, defined in newlib.
12 typedef _LOCK_T Mutex;
13 /// Recursive mutex datatype, defined in newlib.
14 typedef _LOCK_RECURSIVE_T RMutex;
15 
16 /**
17  * @brief Initializes a mutex.
18  * @param m Mutex object.
19  * @note A mutex can also be statically initialized by assigning 0 to it.
20  */
21 static inline void mutexInit(Mutex* m)
22 {
23  *m = INVALID_HANDLE;
24 }
25 
26 /**
27  * @brief Locks a mutex.
28  * @param m Mutex object.
29  */
30 void mutexLock(Mutex* m);
31 
32 /**
33  * @brief Attempts to lock a mutex without waiting.
34  * @param m Mutex object.
35  * @return 1 if the mutex has been acquired successfully, and 0 on contention.
36  */
37 bool mutexTryLock(Mutex* m);
38 
39 /**
40  * @brief Unlocks a mutex.
41  * @param m Mutex object.
42  */
43 void mutexUnlock(Mutex* m);
44 
45 /**
46  * @brief Gets whether the current thread owns the mutex.
47  * @param m Mutex object.
48  * @return 1 if the mutex is locked by the current thread, and 0 otherwise.
49  */
50 bool mutexIsLockedByCurrentThread(const Mutex* m);
51 
52 /**
53  * @brief Initializes a recursive mutex.
54  * @param m Recursive mutex object.
55  * @note A recursive mutex can also be statically initialized by assigning {0,0,0} to it.
56  */
57 static inline void rmutexInit(RMutex* m)
58 {
59  m->lock = 0;
60  m->thread_tag = 0;
61  m->counter = 0;
62 }
63 
64 /**
65  * @brief Locks a recursive mutex.
66  * @param m Recursive mutex object.
67  */
68 void rmutexLock(RMutex* m);
69 
70 /**
71  * @brief Attempts to lock a recursive mutex without waiting.
72  * @param m Recursive mutex object.
73  * @return 1 if the mutex has been acquired successfully, and 0 on contention.
74  */
75 bool rmutexTryLock(RMutex* m);
76 
77 /**
78  * @brief Unlocks a recursive mutex.
79  * @param m Recursive mutex object.
80  */
81 void rmutexUnlock(RMutex* m);
rmutexUnlock
void rmutexUnlock(RMutex *m)
Unlocks a recursive mutex.
mutexLock
void mutexLock(Mutex *m)
Locks a mutex.
rmutexLock
void rmutexLock(RMutex *m)
Locks a recursive mutex.
rmutexInit
static void rmutexInit(RMutex *m)
Initializes a recursive mutex.
Definition: mutex.h:57
INVALID_HANDLE
#define INVALID_HANDLE
Invalid handle.
Definition: types.h:96
mutexTryLock
bool mutexTryLock(Mutex *m)
Attempts to lock a mutex without waiting.
RMutex
_LOCK_RECURSIVE_T RMutex
Recursive mutex datatype, defined in newlib.
Definition: mutex.h:14
mutexInit
static void mutexInit(Mutex *m)
Initializes a mutex.
Definition: mutex.h:21
Mutex
_LOCK_T Mutex
Mutex datatype, defined in newlib.
Definition: mutex.h:12
mutexIsLockedByCurrentThread
bool mutexIsLockedByCurrentThread(const Mutex *m)
Gets whether the current thread owns the mutex.
rmutexTryLock
bool rmutexTryLock(RMutex *m)
Attempts to lock a recursive mutex without waiting.
mutexUnlock
void mutexUnlock(Mutex *m)
Unlocks a mutex.