4 inline void initdsmlocks(volatile unsigned int *addr) {
5 (*addr) = RW_LOCK_BIAS;
9 inline void readLock(volatile unsigned int *addr) {
10 __asm__ __volatile__ ("" " subl $1,(%0)\n\t"
13 :: "a" (addr) : "memory");
16 inline void writeLock(volatile unsigned int *addr) {
17 __asm__ __volatile__ ("" " subl %1,(%0)\n\t"
20 :: "a" (addr), "i" (RW_LOCK_BIAS) : "memory");
23 inline void atomic_dec(volatile unsigned int *v) {
24 __asm__ __volatile__ (LOCK_PREFIX "decl %0"
28 inline void atomic_inc(volatile unsigned int *v) {
29 __asm__ __volatile__ (LOCK_PREFIX "incl %0"
33 static inline int atomic_sub_and_test(int i, atomic_t *v) {
36 __asm__ __volatile__ (LOCK_PREFIX "subl %2,%0; sete %1"
37 : "+m" (v->counter), "=qm" (c)
38 : "ir" (i) : "memory");
43 * atomic_add - add integer to atomic variable
44 * @i: integer value to add
45 * @v: pointer of type atomic_t
47 * Atomically adds @i to @v.
49 static inline void atomic_add(int i, atomic_t *v) {
50 __asm__ __volatile__ (LOCK_PREFIX "addl %1,%0"
55 inline int read_trylock(volatile unsigned int *lock) {
57 if (atomic_read(lock) >= 0)
58 return 1; //can aquire a new read lock
63 inline int write_trylock(volatile unsigned int *lock) {
64 atomic_t *count = (atomic_t *)lock;
65 if (atomic_sub_and_test(RW_LOCK_BIAS, count)) {
66 return 1; // get a write lock
68 atomic_add(RW_LOCK_BIAS, count);
69 return 0; // failed to acquire a write lock
72 inline void read_unlock(volatile unsigned int *rw) {
73 __asm__ __volatile__ (LOCK_PREFIX "incl %0" : "+m" (*rw) : : "memory");
76 inline void write_unlock(volatile unsigned int *rw) {
77 __asm__ __volatile__ (LOCK_PREFIX "addl %1, %0"
78 : "+m" (*rw) : "i" (RW_LOCK_BIAS) : "memory");