From: Arnaud Giersch Date: Sun, 29 Oct 2017 22:07:16 +0000 (+0100) Subject: Parmap: add missing atomic load/store, and convert legacy builtins. X-Git-Tag: v3.18~355 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/45e860b49df0a17950158c0f5c6403463bd68b71?hp=e6c138f2e253f244fffd9bcb0fcabbdef8b2dfde;ds=sidebyside Parmap: add missing atomic load/store, and convert legacy builtins. --- diff --git a/src/include/xbt/parmap.hpp b/src/include/xbt/parmap.hpp index 00f4b8c94b..77d13e0b88 100644 --- a/src/include/xbt/parmap.hpp +++ b/src/include/xbt/parmap.hpp @@ -381,25 +381,25 @@ template inline void Parmap::FutexSynchro::futex_wake(unsigned* template void Parmap::FutexSynchro::master_signal() { - this->parmap.thread_counter = 1; - __sync_add_and_fetch(&this->parmap.work_round, 1); + __atomic_store_n(&this->parmap.thread_counter, 1, __ATOMIC_SEQ_CST); + __atomic_add_fetch(&this->parmap.work_round, 1, __ATOMIC_SEQ_CST); /* wake all workers */ futex_wake(&this->parmap.work_round, std::numeric_limits::max()); } template void Parmap::FutexSynchro::master_wait() { - unsigned count = this->parmap.thread_counter; + unsigned count = __atomic_load_n(&this->parmap.thread_counter, __ATOMIC_SEQ_CST); while (count < this->parmap.num_workers) { /* wait for all workers to be ready */ futex_wait(&this->parmap.thread_counter, count); - count = this->parmap.thread_counter; + count = __atomic_load_n(&this->parmap.thread_counter, __ATOMIC_SEQ_CST); } } template void Parmap::FutexSynchro::worker_signal() { - unsigned count = __sync_add_and_fetch(&this->parmap.thread_counter, 1); + unsigned count = __atomic_add_fetch(&this->parmap.thread_counter, 1, __ATOMIC_SEQ_CST); if (count == this->parmap.num_workers) { /* all workers have finished, wake the controller */ futex_wake(&this->parmap.thread_counter, std::numeric_limits::max()); @@ -408,37 +408,37 @@ template void Parmap::FutexSynchro::worker_signal() template void Parmap::FutexSynchro::worker_wait(unsigned round) { - unsigned work_round = this->parmap.work_round; + unsigned work_round = __atomic_load_n(&this->parmap.work_round, __ATOMIC_SEQ_CST); /* wait for more work */ while (work_round != round) { futex_wait(&this->parmap.work_round, work_round); - work_round = this->parmap.work_round; + work_round = __atomic_load_n(&this->parmap.work_round, __ATOMIC_SEQ_CST); } } #endif template void Parmap::BusyWaitSynchro::master_signal() { - this->parmap.thread_counter = 1; - __sync_add_and_fetch(&this->parmap.work_round, 1); + __atomic_store_n(&this->parmap.thread_counter, 1, __ATOMIC_SEQ_CST); + __atomic_add_fetch(&this->parmap.work_round, 1, __ATOMIC_SEQ_CST); } template void Parmap::BusyWaitSynchro::master_wait() { - while (this->parmap.thread_counter < this->parmap.num_workers) { + while (__atomic_load_n(&this->parmap.thread_counter, __ATOMIC_SEQ_CST) < this->parmap.num_workers) { xbt_os_thread_yield(); } } template void Parmap::BusyWaitSynchro::worker_signal() { - __sync_add_and_fetch(&this->parmap.thread_counter, 1); + __atomic_add_fetch(&this->parmap.thread_counter, 1, __ATOMIC_SEQ_CST); } template void Parmap::BusyWaitSynchro::worker_wait(unsigned round) { /* wait for more work */ - while (this->parmap.work_round != round) { + while (__atomic_load_n(&this->parmap.work_round, __ATOMIC_SEQ_CST) != round) { xbt_os_thread_yield(); } }