diff options
author | Andrew Waterman <waterman@s141.Millennium.Berkeley.EDU> | 2011-06-19 20:47:29 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@s141.Millennium.Berkeley.EDU> | 2011-06-19 20:47:29 -0700 |
commit | 0edaecc54329048eb91ad6a45338265ef1a4569c (patch) | |
tree | b0695be27ac3b1e14aa944c4820683fcd8adefca /pk/atomic.h | |
parent | e63e4fbe8794c68e1ad846a36e33cba62e801b34 (diff) | |
download | pk-0edaecc54329048eb91ad6a45338265ef1a4569c.zip pk-0edaecc54329048eb91ad6a45338265ef1a4569c.tar.gz pk-0edaecc54329048eb91ad6a45338265ef1a4569c.tar.bz2 |
temporary undoing of renaming
Diffstat (limited to 'pk/atomic.h')
-rw-r--r-- | pk/atomic.h | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/pk/atomic.h b/pk/atomic.h new file mode 100644 index 0000000..88bb239 --- /dev/null +++ b/pk/atomic.h @@ -0,0 +1,45 @@ +#ifndef _RISCV_ATOMIC_H +#define _RISCV_ATOMIC_H + +typedef struct { long val; } atomic_t; +typedef struct { atomic_t lock; } spinlock_t; +#define SPINLOCK_INIT {{0}} + +static inline long atomic_add(atomic_t* a, long inc) +{ + //return __sync_fetch_and_add(&a->val, inc); + long ret = a->val; + a->val++; + return ret; +} + +static inline long atomic_swap(atomic_t* a, long val) +{ + //return __sync_lock_test_and_set(&a->val, val); + long reg = a->val; + a->val = val; + return reg; +} + +static inline void atomic_set(atomic_t* a, long val) +{ + a->val = val; +} + +static inline long atomic_read(atomic_t* a) +{ + return a->val; +} + +static inline void spinlock_lock(spinlock_t* lock) +{ + while(atomic_read(&lock->lock)) + while(atomic_swap(&lock->lock,-1)); +} + +static inline void spinlock_unlock(spinlock_t* lock) +{ + atomic_set(&lock->lock,0); +} + +#endif |