0001
0002 #ifndef _LINUX_RWBASE_RT_H
0003 #define _LINUX_RWBASE_RT_H
0004
0005 #include <linux/rtmutex.h>
0006 #include <linux/atomic.h>
0007
0008 #define READER_BIAS (1U << 31)
0009 #define WRITER_BIAS (1U << 30)
0010
0011 struct rwbase_rt {
0012 atomic_t readers;
0013 struct rt_mutex_base rtmutex;
0014 };
0015
0016 #define __RWBASE_INITIALIZER(name) \
0017 { \
0018 .readers = ATOMIC_INIT(READER_BIAS), \
0019 .rtmutex = __RT_MUTEX_BASE_INITIALIZER(name.rtmutex), \
0020 }
0021
0022 #define init_rwbase_rt(rwbase) \
0023 do { \
0024 rt_mutex_base_init(&(rwbase)->rtmutex); \
0025 atomic_set(&(rwbase)->readers, READER_BIAS); \
0026 } while (0)
0027
0028
0029 static __always_inline bool rw_base_is_locked(struct rwbase_rt *rwb)
0030 {
0031 return atomic_read(&rwb->readers) != READER_BIAS;
0032 }
0033
0034 static __always_inline bool rw_base_is_contended(struct rwbase_rt *rwb)
0035 {
0036 return atomic_read(&rwb->readers) > 0;
0037 }
0038
0039 #endif