#ifndef __TOOLS_LINUX_RWSEM_H #define __TOOLS_LINUX_RWSEM_H #include struct rw_semaphore { pthread_rwlock_t lock; }; #define __RWSEM_INITIALIZER(name) \ { .lock = PTHREAD_RWLOCK_INITIALIZER } #define DECLARE_RWSEM(name) \ struct rw_semaphore name = __RWSEM_INITIALIZER(name) static inline void init_rwsem(struct rw_semaphore *lock) { pthread_rwlock_init(&lock->lock, NULL); } #define down_read(l) pthread_rwlock_rdlock(&(l)->lock) #define down_read_killable(l) (pthread_rwlock_rdlock(&(l)->lock), 0) #define down_read_trylock(l) (!pthread_rwlock_tryrdlock(&(l)->lock)) #define up_read(l) pthread_rwlock_unlock(&(l)->lock) #define down_write(l) pthread_rwlock_wrlock(&(l)->lock) #define up_write(l) pthread_rwlock_unlock(&(l)->lock) #endif /* __TOOLS_LINUX_RWSEM_H */