[COMMIT osv master] aarch64: make synch_thread/synch_port work with weak memory model

3 views
Skip to first unread message

Commit Bot

unread,
May 28, 2021, 10:59:35 AM5/28/21
to osv...@googlegroups.com, Waldemar Kozaczuk
From: Waldemar Kozaczuk <jwkoz...@gmail.com>
Committer: Waldemar Kozaczuk <jwkoz...@gmail.com>
Branch: master

aarch64: make synch_thread/synch_port work with weak memory model

This patch changes bsd/porting/synch.cc to change _awake variable to an atomic
for similar reasons as the t variable in the waiter. In this case, the synch_port::wakeup*()
methods use "void thread::wake_with(Action action)" and we need to make sure the _awake variable
is visible between CPUs.

Signed-off-by: Waldemar Kozaczuk <jwkoz...@gmail.com>

---
diff --git a/bsd/porting/synch.cc b/bsd/porting/synch.cc
--- a/bsd/porting/synch.cc
+++ b/bsd/porting/synch.cc
@@ -26,7 +26,7 @@ TRACEPOINT(trace_synch_wakeup_one_waking, "chan=%p thread=%p", void *, void *);

struct synch_thread {
sched::thread* _thread;
- bool _awake;
+ std::atomic<bool> _awake;
};

class synch_port {
@@ -69,7 +69,7 @@ int synch_port::_msleep(void *chan, struct mtx *mtx,
// Init the wait
synch_thread wait;
wait._thread = sched::thread::current();
- wait._awake = false;
+ wait._awake.store(false, std::memory_order_release);

if (mtx) {
wait_lock = &mtx->_mutex;
@@ -100,7 +100,8 @@ int synch_port::_msleep(void *chan, struct mtx *mtx,
{
sched::thread::wait_until_interruptible([&] {
return ( (timo_hz && t.expired()) ||
- (wait._awake) );
+ (wait._awake.load(std::memory_order_acquire)) );
+
});
}
catch (int e)
@@ -113,7 +114,7 @@ int synch_port::_msleep(void *chan, struct mtx *mtx,
mutex_lock(wait_lock);
}
// msleep timeout
- if (!wait._awake) {
+ if (!wait._awake.load(std::memory_order_acquire)) {
trace_synch_msleep_expired(chan);
if (chan) {
// A pointer to the local "wait" may still be on the list -
@@ -146,7 +147,7 @@ void synch_port::wakeup(void* chan)
for (auto it=ppp.first; it!=ppp.second; ++it) {
synch_thread* wait = (*it).second;
trace_synch_wakeup_waking(chan, wait->_thread);
- wait->_thread->wake_with([&] { wait->_awake = true; });
+ wait->_thread->wake_with([&] { wait->_awake.store(true, std::memory_order_release); });
}
_evlist.erase(ppp.first, ppp.second);
mutex_unlock(&_lock);
@@ -163,7 +164,7 @@ void synch_port::wakeup_one(void* chan)
synch_thread* wait = (*it).second;
_evlist.erase(it);
trace_synch_wakeup_one_waking(chan, wait->_thread);
- wait->_thread->wake_with([&] { wait->_awake = true; });
+ wait->_thread->wake_with([&] { wait->_awake.store(true, std::memory_order_release); });
}
mutex_unlock(&_lock);
}
Reply all
Reply to author
Forward
0 new messages