From: Waldemar Kozaczuk <[email protected]> Committer: Waldemar Kozaczuk <[email protected]> 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 <[email protected]> --- 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); } -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/000000000000b5787705c3651f62%40google.com.
