summaryrefslogtreecommitdiff
path: root/kern/sref.c
diff options
context:
space:
mode:
authorAgustina Arzille <avarzille@riseup.net>2017-05-05 04:01:13 -1000
committerRichard Braun <rbraun@sceen.net>2017-05-09 21:17:58 +0200
commitbcbe8dc991a9ec63f30d50ed4cca89fd9e6b7ff7 (patch)
tree389517510b8d19082d02f36453dbf68356b548fb /kern/sref.c
parentb5864f82b9c0d8ea2e825e7d86bd8cdeb825f870 (diff)
Replace sequential consistency with more efficient orders
Diffstat (limited to 'kern/sref.c')
-rw-r--r--kern/sref.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/kern/sref.c b/kern/sref.c
index 9ce7a83..3f399a3 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(&weakref->addr, SREF_WEAKREF_DYING, ATOMIC_SEQ_CST);
+ atomic_or_acq_rel(&weakref->addr, SREF_WEAKREF_DYING);
}
static void
sref_weakref_clear_dying(struct sref_weakref *weakref)
{
- atomic_and(&weakref->addr, SREF_WEAKREF_MASK, ATOMIC_SEQ_CST);
+ atomic_and_acq_rel(&weakref->addr, SREF_WEAKREF_MASK);
}
static int
@@ -274,7 +274,7 @@ sref_weakref_kill(struct sref_weakref *weakref)
uintptr_t addr, oldval;
addr = weakref->addr | SREF_WEAKREF_DYING;
- oldval = atomic_cas_seq_cst(&weakref->addr, addr, (uintptr_t)NULL);
+ oldval = atomic_cas_release(&weakref->addr, addr, (uintptr_t)NULL);
if (oldval != addr) {
assert((oldval & SREF_WEAKREF_MASK) == (addr & SREF_WEAKREF_MASK));
@@ -292,7 +292,7 @@ sref_weakref_tryget(struct sref_weakref *weakref)
do {
addr = weakref->addr;
newval = addr & SREF_WEAKREF_MASK;
- oldval = atomic_cas_seq_cst(&weakref->addr, addr, newval);
+ oldval = atomic_cas_acquire(&weakref->addr, addr, newval);
} while (oldval != addr);
return (struct sref_counter *)newval;