#include "dsmlock.h"
#include <stdio.h>
-inline void initdsmlocks(volatile unsigned int *addr) {
+inline void initdsmlocks(volatile int *addr) {
(*addr) = RW_LOCK_BIAS;
}
-inline void atomic_dec(volatile unsigned int *v) {
+inline void atomic_dec(volatile int *v) {
__asm__ __volatile__ (LOCK_PREFIX "decl %0"
: "+m" (*v));
}
-inline void atomic_inc(volatile unsigned int *v) {
+inline void atomic_inc(volatile int *v) {
__asm__ __volatile__ (LOCK_PREFIX "incl %0"
: "+m" (*v));
}
-static inline int atomic_sub_and_test(int i, volatile unsigned int *v) {
+static inline int atomic_sub_and_test(int i, volatile int *v) {
unsigned char c;
__asm__ __volatile__ (LOCK_PREFIX "subl %2,%0; sete %1"
*
* Atomically adds @i to @v.
*/
-static inline void atomic_add(int i, volatile unsigned int *v) {
+static inline void atomic_add(int i, volatile int *v) {
__asm__ __volatile__ (LOCK_PREFIX "addl %1,%0"
: "+m" (*v)
: "ir" (i));
}
-inline int read_trylock(volatile unsigned int *lock) {
+inline int read_trylock(volatile int *lock) {
atomic_dec(lock);
if (atomic_read(lock) >= 0)
return 1; //can aquire a new read lock
return 0; //failure
}
-inline int write_trylock(volatile unsigned int *lock) {
+inline int write_trylock(volatile int *lock) {
if (atomic_sub_and_test(RW_LOCK_BIAS, lock)) {
return 1; // get a write lock
}
return 0; // failed to acquire a write lock
}
-inline void read_unlock(volatile unsigned int *rw) {
+inline void read_unlock(volatile int *rw) {
__asm__ __volatile__ (LOCK_PREFIX "incl %0" : "+m" (*rw) : : "memory");
}
-inline void write_unlock(volatile unsigned int *rw) {
+inline void write_unlock(volatile int *rw) {
__asm__ __volatile__ (LOCK_PREFIX "addl %1, %0"
: "+m" (*rw) : "i" (RW_LOCK_BIAS) : "memory");
}
"661:\n\tlock; "
-
-typedef struct {
- unsigned int counter;
-} atomic_t;
-
-void initdsmlocks(volatile unsigned int *addr);
-int read_trylock(volatile unsigned int *lock);
-int write_trylock(volatile unsigned int *lock);
-void atomic_dec(volatile unsigned int *v);
-void atomic_inc(volatile unsigned int *v);
-static void atomic_add(int i, volatile unsigned int *v);
-static int atomic_sub_and_test(int i, volatile unsigned int *v);
-void read_unlock(volatile unsigned int *rw);
-void write_unlock(volatile unsigned int *rw);
+void initdsmlocks(volatile int *addr);
+int read_trylock(volatile int *lock);
+int write_trylock(volatile int *lock);
+void atomic_dec(volatile int *v);
+void atomic_inc(volatile int *v);
+static void atomic_add(int i, volatile int *v);
+static int atomic_sub_and_test(int i, volatile int *v);
+void read_unlock(volatile int *rw);
+void write_unlock(volatile int *rw);
#endif