summaryrefslogtreecommitdiff
path: root/kern/sref.c
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2017-06-13 21:23:50 +0200
committerRichard Braun <rbraun@sceen.net>2017-06-13 21:23:50 +0200
commit72ed0dc2f153e7cf1d6e96f86a773bbe490e9e1c (patch)
tree8161eda7bec209778b30fdfdb19f154df4cab2a7 /kern/sref.c
parent61df7f19dfe3b56abf6c4d00589414c60716ac2b (diff)
Various atomic access fixes
Diffstat (limited to 'kern/sref.c')
-rw-r--r--kern/sref.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/kern/sref.c b/kern/sref.c
index 5aad8da..bc3f9e9 100644
--- a/kern/sref.c
+++ b/kern/sref.c
@@ -259,13 +259,13 @@ sref_weakref_init(struct sref_weakref *weakref, struct sref_counter *counter)
static void
sref_weakref_mark_dying(struct sref_weakref *weakref)
{
- atomic_or_acq_rel(&weakref->addr, SREF_WEAKREF_DYING);
+ atomic_or(&weakref->addr, SREF_WEAKREF_DYING, ATOMIC_RELEASE);
}
static void
sref_weakref_clear_dying(struct sref_weakref *weakref)
{
- atomic_and_acq_rel(&weakref->addr, SREF_WEAKREF_MASK);
+ atomic_and(&weakref->addr, SREF_WEAKREF_MASK, ATOMIC_RELEASE);
}
static int
@@ -273,8 +273,8 @@ sref_weakref_kill(struct sref_weakref *weakref)
{
uintptr_t addr, oldval;
- addr = weakref->addr | SREF_WEAKREF_DYING;
- oldval = atomic_cas_release(&weakref->addr, addr, (uintptr_t)NULL);
+ addr = atomic_load(&weakref->addr, ATOMIC_RELAXED) | SREF_WEAKREF_DYING;
+ oldval = atomic_cas(&weakref->addr, addr, (uintptr_t)NULL, ATOMIC_RELAXED);
if (oldval != addr) {
assert((oldval & SREF_WEAKREF_MASK) == (addr & SREF_WEAKREF_MASK));
@@ -290,7 +290,7 @@ sref_weakref_tryget(struct sref_weakref *weakref)
uintptr_t addr, oldval, newval;
do {
- addr = weakref->addr;
+ addr = atomic_load(&weakref->addr, ATOMIC_RELAXED);
newval = addr & SREF_WEAKREF_MASK;
oldval = atomic_cas_acquire(&weakref->addr, addr, newval);
} while (oldval != addr);