From cb490d4644f8726d6c65f25fd6a2fc1dc547d795 Mon Sep 17 00:00:00 2001 From: adash Date: Thu, 3 Dec 2009 01:03:44 +0000 Subject: [PATCH] bug from a long time : change unsigned ints to signed, needs to be ported to dsm recovery version --- Robust/src/Runtime/DSTM/interface/dsmlock.c | 18 ++++++++-------- Robust/src/Runtime/DSTM/interface/dsmlock.h | 23 ++++++++------------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/Robust/src/Runtime/DSTM/interface/dsmlock.c b/Robust/src/Runtime/DSTM/interface/dsmlock.c index f9bc82e0..e9839362 100644 --- a/Robust/src/Runtime/DSTM/interface/dsmlock.c +++ b/Robust/src/Runtime/DSTM/interface/dsmlock.c @@ -1,21 +1,21 @@ #include "dsmlock.h" #include -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" @@ -31,13 +31,13 @@ static inline int atomic_sub_and_test(int i, volatile unsigned int *v) { * * 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 @@ -45,7 +45,7 @@ inline int read_trylock(volatile unsigned int *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 } @@ -53,11 +53,11 @@ inline int write_trylock(volatile unsigned int *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"); } diff --git a/Robust/src/Runtime/DSTM/interface/dsmlock.h b/Robust/src/Runtime/DSTM/interface/dsmlock.h index 80761fee..f95edf67 100644 --- a/Robust/src/Runtime/DSTM/interface/dsmlock.h +++ b/Robust/src/Runtime/DSTM/interface/dsmlock.h @@ -13,18 +13,13 @@ "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 -- 2.34.1