diff options
author | Richard Braun <rbraun@sceen.net> | 2017-06-13 21:23:50 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2017-06-13 21:23:50 +0200 |
commit | 72ed0dc2f153e7cf1d6e96f86a773bbe490e9e1c (patch) | |
tree | 8161eda7bec209778b30fdfdb19f154df4cab2a7 /kern/sref.c | |
parent | 61df7f19dfe3b56abf6c4d00589414c60716ac2b (diff) |
Various atomic access fixes
Diffstat (limited to 'kern/sref.c')
-rw-r--r-- | kern/sref.c | 10 |
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); |