From 2f8d17b7da365107340aab6f75763d0a9f2cecbb Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Mon, 24 Apr 2017 15:43:33 +0200 Subject: [PATCH 1/1] try to use more standard, less obscure synchro for refcounting --- src/simix/ActorImpl.hpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/simix/ActorImpl.hpp b/src/simix/ActorImpl.hpp index 71b48e014d..9e4930deac 100644 --- a/src/simix/ActorImpl.hpp +++ b/src/simix/ActorImpl.hpp @@ -68,17 +68,15 @@ public: friend void intrusive_ptr_add_ref(ActorImpl* process) { - // Atomic operation! Do not split in two instructions! - auto previous = (process->refcount_)++; - xbt_assert(previous != 0); - (void) previous; + process->refcount_.fetch_add(1, std::memory_order_relaxed); } friend void intrusive_ptr_release(ActorImpl* process) { - // Atomic operation! Do not split in two instructions! - auto count = --(process->refcount_); - if (count == 0) + // inspired from http://www.boost.org/doc/libs/1_55_0/doc/html/atomic/usage_examples.html + if (process->refcount_.fetch_sub(1, std::memory_order_release) == 1) { + std::atomic_thread_fence(std::memory_order_acquire); delete process; + } } ~ActorImpl(); -- 2.20.1