1 /* Public domain. */ 2 3 #ifndef _LINUX_MUTEX_H 4 #define _LINUX_MUTEX_H 5 6 #include <sys/stdint.h> 7 #include <sys/rwlock.h> 8 #include <linux/list.h> 9 #include <linux/spinlock_types.h> 10 11 #define DEFINE_MUTEX(x) struct rwlock x = RWLOCK_INITIALIZER(#x) 12 13 #define mutex_lock_interruptible_nested(rwl, subc) \ 14 mutex_lock_interruptible(rwl) 15 #define mutex_lock(rwl) rw_enter_write(rwl) 16 #define mutex_lock_nest_lock(rwl, sub) rw_enter_write(rwl) 17 #define mutex_lock_nested(rwl, sub) rw_enter_write(rwl) 18 #define mutex_trylock(rwl) (rw_enter(rwl, RW_WRITE | RW_NOSLEEP) == 0) 19 #define mutex_unlock(rwl) rw_exit_write(rwl) 20 #define mutex_is_locked(rwl) (rw_status(rwl) != 0) 21 #define mutex_destroy(rwl) 22 23 static inline int 24 mutex_lock_interruptible(struct rwlock *rwl) 25 { 26 if (rw_enter(rwl, RW_WRITE | RW_INTR) != 0) 27 return -EINTR; 28 return 0; 29 } 30 31 enum mutex_trylock_recursive_result { 32 MUTEX_TRYLOCK_FAILED, 33 MUTEX_TRYLOCK_SUCCESS, 34 MUTEX_TRYLOCK_RECURSIVE 35 }; 36 37 static inline enum mutex_trylock_recursive_result 38 mutex_trylock_recursive(struct rwlock *rwl) 39 { 40 if (rw_status(rwl) == RW_WRITE) 41 return MUTEX_TRYLOCK_RECURSIVE; 42 if (mutex_trylock(rwl)) 43 return MUTEX_TRYLOCK_SUCCESS; 44 return MUTEX_TRYLOCK_FAILED; 45 } 46 47 int atomic_dec_and_mutex_lock(volatile int *, struct rwlock *); 48 49 #endif 50