4 inline void initdsmlocks(volatile int *addr) {
5 (*addr) = RW_LOCK_BIAS;
8 inline void atomic_dec(volatile int *v) {
9 __asm__ __volatile__ (LOCK_PREFIX "decl %0"
13 inline void atomic_inc(volatile int *v) {
14 __asm__ __volatile__ (LOCK_PREFIX "incl %0"
18 static inline int atomic_sub_and_test(int i, volatile int *v) {
21 __asm__ __volatile__ (LOCK_PREFIX "subl %2,%0; sete %1"
22 : "+m" (*v), "=qm" (c)
23 : "ir" (i) : "memory");
28 * atomic_add - add integer to atomic variable
29 * @i: integer value to add
30 * @v: pointer of type atomic_t
32 * Atomically adds @i to @v.
34 static inline void atomic_add(int i, volatile int *v) {
35 __asm__ __volatile__ (LOCK_PREFIX "addl %1,%0"
40 inline int read_trylock(volatile int *lock) {
42 if (atomic_read(lock) >= 0)
43 return 1; //can aquire a new read lock
48 inline int write_trylock(volatile int *lock) {
49 if (atomic_sub_and_test(RW_LOCK_BIAS, lock)) {
50 return 1; // get a write lock
52 atomic_add(RW_LOCK_BIAS, lock);
53 return 0; // failed to acquire a write lock
56 inline void read_unlock(volatile int *rw) {
57 __asm__ __volatile__ (LOCK_PREFIX "incl %0" : "+m" (*rw) : : "memory");
60 inline void write_unlock(volatile int *rw) {
61 __asm__ __volatile__ (LOCK_PREFIX "addl %1, %0"
62 : "+m" (*rw) : "i" (RW_LOCK_BIAS) : "memory");
65 inline int is_write_locked(volatile int *lock) {
69 inline int is_read_locked(volatile int *lock) {