switch to spaces only..
[IRC.git] / Robust / src / Runtime / DSTM / interface / dsmlock.c
1 #include "dsmlock.h"
2 #include <stdio.h>
3
4 inline void initdsmlocks(volatile int *addr) {
5   (*addr) = RW_LOCK_BIAS;
6 }
7
8 inline void atomic_dec(volatile int *v) {
9   __asm__ __volatile__ (LOCK_PREFIX "decl %0"
10                         : "+m" (*v));
11 }
12
13 inline void atomic_inc(volatile int *v) {
14   __asm__ __volatile__ (LOCK_PREFIX "incl %0"
15                         : "+m" (*v));
16 }
17
18 static inline int atomic_sub_and_test(int i, volatile int *v) {
19   unsigned char c;
20
21   __asm__ __volatile__ (LOCK_PREFIX "subl %2,%0; sete %1"
22                         : "+m" (*v), "=qm" (c)
23                         : "ir" (i) : "memory");
24   return c;
25 }
26
27 /**
28  * atomic_add - add integer to atomic variable
29  * @i: integer value to add
30  * @v: pointer of type atomic_t
31  *
32  * Atomically adds @i to @v.
33  */
34 static inline void atomic_add(int i, volatile int *v) {
35   __asm__ __volatile__ (LOCK_PREFIX "addl %1,%0"
36                         : "+m" (*v)
37                         : "ir" (i));
38 }
39
40 inline int read_trylock(volatile int  *lock) {
41   atomic_dec(lock);
42   if (atomic_read(lock) >= 0)
43     return 1;  //can aquire a new read lock
44   atomic_inc(lock);
45   return 0; //failure
46 }
47
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
51   }
52   atomic_add(RW_LOCK_BIAS, lock);
53   return 0; // failed to acquire a write lock
54 }
55
56 inline void read_unlock(volatile int *rw) {
57   __asm__ __volatile__ (LOCK_PREFIX "incl %0" : "+m" (*rw) : : "memory");
58 }
59
60 inline void write_unlock(volatile int *rw) {
61   __asm__ __volatile__ (LOCK_PREFIX "addl %1, %0"
62                         : "+m" (*rw) : "i" (RW_LOCK_BIAS) : "memory");
63 }
64
65 inline int is_write_locked(volatile int *lock) {
66   return lock <= 0;
67 }
68
69 inline int is_read_locked(volatile int *lock) {
70   return lock > 0;
71 }