xref: /kvmtool/include/kvm/mutex.h (revision 15542bab78ec91a6ccf03d4fedd165c8867c22da)
14ef0f4d6SPekka Enberg #ifndef KVM__MUTEX_H
24ef0f4d6SPekka Enberg #define KVM__MUTEX_H
34ef0f4d6SPekka Enberg 
44ef0f4d6SPekka Enberg #include <pthread.h>
54ef0f4d6SPekka Enberg 
64ef0f4d6SPekka Enberg #include "kvm/util.h"
74ef0f4d6SPekka Enberg 
8b5b501ccSIngo Molnar /*
9b5b501ccSIngo Molnar  * Kernel-alike mutex API - to make it easier for kernel developers
10b5b501ccSIngo Molnar  * to write user-space code! :-)
11b5b501ccSIngo Molnar  */
12b5b501ccSIngo Molnar 
13d3476f7dSSasha Levin struct mutex {
14d3476f7dSSasha Levin 	pthread_mutex_t mutex;
15d3476f7dSSasha Levin };
16*15542babSAndre Przywara #define MUTEX_INITIALIZER { .mutex = PTHREAD_MUTEX_INITIALIZER }
17b5b501ccSIngo Molnar 
18d3476f7dSSasha Levin #define DEFINE_MUTEX(mtx) struct mutex mtx = MUTEX_INITIALIZER
19d3476f7dSSasha Levin 
mutex_init(struct mutex * lock)20d3476f7dSSasha Levin static inline void mutex_init(struct mutex *lock)
21c0799eb9SPekka Enberg {
22d3476f7dSSasha Levin 	if (pthread_mutex_init(&lock->mutex, NULL) != 0)
23c0799eb9SPekka Enberg 		die("unexpected pthread_mutex_init() failure!");
24c0799eb9SPekka Enberg }
25c0799eb9SPekka Enberg 
mutex_lock(struct mutex * lock)26d3476f7dSSasha Levin static inline void mutex_lock(struct mutex *lock)
274ef0f4d6SPekka Enberg {
28d3476f7dSSasha Levin 	if (pthread_mutex_lock(&lock->mutex) != 0)
294ef0f4d6SPekka Enberg 		die("unexpected pthread_mutex_lock() failure!");
30d3476f7dSSasha Levin 
314ef0f4d6SPekka Enberg }
324ef0f4d6SPekka Enberg 
mutex_unlock(struct mutex * lock)33d3476f7dSSasha Levin static inline void mutex_unlock(struct mutex *lock)
344ef0f4d6SPekka Enberg {
35d3476f7dSSasha Levin 	if (pthread_mutex_unlock(&lock->mutex) != 0)
364ef0f4d6SPekka Enberg 		die("unexpected pthread_mutex_unlock() failure!");
374ef0f4d6SPekka Enberg }
384ef0f4d6SPekka Enberg 
394ef0f4d6SPekka Enberg #endif /* KVM__MUTEX_H */
40