xref: /kvmtool/include/kvm/mutex.h (revision d3476f7d3bb7cee0b620cf207c168cb4f5b5c41e)
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 
13*d3476f7dSSasha Levin struct mutex {
14*d3476f7dSSasha Levin 	pthread_mutex_t mutex;
15*d3476f7dSSasha Levin };
16*d3476f7dSSasha Levin #define MUTEX_INITIALIZER (struct mutex) { .mutex = PTHREAD_MUTEX_INITIALIZER }
17b5b501ccSIngo Molnar 
18*d3476f7dSSasha Levin #define DEFINE_MUTEX(mtx) struct mutex mtx = MUTEX_INITIALIZER
19*d3476f7dSSasha Levin 
20*d3476f7dSSasha Levin static inline void mutex_init(struct mutex *lock)
21c0799eb9SPekka Enberg {
22*d3476f7dSSasha Levin 	if (pthread_mutex_init(&lock->mutex, NULL) != 0)
23c0799eb9SPekka Enberg 		die("unexpected pthread_mutex_init() failure!");
24c0799eb9SPekka Enberg }
25c0799eb9SPekka Enberg 
26*d3476f7dSSasha Levin static inline void mutex_lock(struct mutex *lock)
274ef0f4d6SPekka Enberg {
28*d3476f7dSSasha Levin 	if (pthread_mutex_lock(&lock->mutex) != 0)
294ef0f4d6SPekka Enberg 		die("unexpected pthread_mutex_lock() failure!");
30*d3476f7dSSasha Levin 
314ef0f4d6SPekka Enberg }
324ef0f4d6SPekka Enberg 
33*d3476f7dSSasha Levin static inline void mutex_unlock(struct mutex *lock)
344ef0f4d6SPekka Enberg {
35*d3476f7dSSasha 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