A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
try to use more standard, less obscure synchro for refcounting
[simgrid.git]
/
src
/
simix
/
ActorImpl.hpp
diff --git
a/src/simix/ActorImpl.hpp
b/src/simix/ActorImpl.hpp
index
c7ce8cd
..
9e4930d
100644
(file)
--- a/
src/simix/ActorImpl.hpp
+++ b/
src/simix/ActorImpl.hpp
@@
-68,24
+68,27
@@
public:
friend void intrusive_ptr_add_ref(ActorImpl* process)
{
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)
{
}
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;
delete process;
+ }
}
~ActorImpl();
simgrid::s4u::ActorPtr iface() { return s4u::ActorPtr(&piface_); }
}
~ActorImpl();
simgrid::s4u::ActorPtr iface() { return s4u::ActorPtr(&piface_); }
+ simgrid::s4u::Actor* ciface() { return &piface_; }
+
+ void daemonize();
+ bool isDaemon();
private:
private:
+ bool daemon = false;
std::atomic_int_fast32_t refcount_ { 1 };
simgrid::s4u::Actor piface_; // Our interface is part of ourselves
};
std::atomic_int_fast32_t refcount_ { 1 };
simgrid::s4u::Actor piface_; // Our interface is part of ourselves
};