aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@eecs.berkeley.edu>2015-11-18 11:16:38 -0800
committerAndrew Waterman <waterman@eecs.berkeley.edu>2015-11-18 11:16:38 -0800
commite59b354ab42c18239e7e88939076bb7841aa205c (patch)
tree0acc3c8fb29bc9313263d8571497285e545c7ec7
parent83c8b2027fdbe695ba90f4a505a159767a885c1f (diff)
parentb9961802ce2f774c884d6708beec5e8ac6f264ed (diff)
downloadpk-e59b354ab42c18239e7e88939076bb7841aa205c.zip
pk-e59b354ab42c18239e7e88939076bb7841aa205c.tar.gz
pk-e59b354ab42c18239e7e88939076bb7841aa205c.tar.bz2
Merge pull request #14 from darius-bluespec/fix-disable-atomics
Fix macros for emulating atomic operations (--disable-atomics).
-rw-r--r--pk/atomic.h6
-rw-r--r--pk/file.c2
2 files changed, 4 insertions, 4 deletions
diff --git a/pk/atomic.h b/pk/atomic.h
index c2adf00..2ec4a04 100644
--- a/pk/atomic.h
+++ b/pk/atomic.h
@@ -23,19 +23,19 @@ typedef struct { int lock; } spinlock_t;
#else
# define atomic_add(ptr, inc) ({ \
long flags = disable_irqsave(); \
- typeof(ptr) res = *(volatile typeof(ptr))(ptr); \
+ typeof(*(ptr)) res = *(volatile typeof(*(ptr)) *)(ptr); \
*(volatile typeof(ptr))(ptr) = res + (inc); \
enable_irqrestore(flags); \
res; })
# define atomic_swap(ptr, swp) ({ \
long flags = disable_irqsave(); \
- typeof(ptr) res = *(volatile typeof(ptr))(ptr); \
+ typeof(*(ptr)) res = *(volatile typeof(*(ptr)) *)(ptr); \
*(volatile typeof(ptr))(ptr) = (swp); \
enable_irqrestore(flags); \
res; })
# define atomic_cas(ptr, cmp, swp) ({ \
long flags = disable_irqsave(); \
- typeof(ptr) res = *(volatile typeof(ptr))(ptr); \
+ typeof(*(ptr)) res = *(volatile typeof(*(ptr)) *)(ptr); \
if (res == (cmp)) *(volatile typeof(ptr))(ptr) = (swp); \
enable_irqrestore(flags); \
res; })
diff --git a/pk/file.c b/pk/file.c
index ee2f9fd..0c9c96a 100644
--- a/pk/file.c
+++ b/pk/file.c
@@ -107,7 +107,7 @@ int fd_close(int fd)
file_t* f = file_get(fd);
if (!f)
return -1;
- file_t* old = atomic_cas(&fds[fd], (long)f, 0);
+ file_t* old = atomic_cas(&fds[fd], f, 0);
file_decref(f);
if (old != f)
return -1;