xbt_dict_t properties = nullptr;
s_smx_simcall_t simcall;
void *data = nullptr; /* kept for compatibility, it should be replaced with moddata */
- xbt_dynar_t on_exit = nullptr; /* list of functions executed when the process dies */
+ std::vector<s_smx_process_exit_fun_t> on_exit; /* list of functions executed when the process dies */
std::function<void()> code;
smx_timer_t kill_timer = nullptr;
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();
simgrid::s4u::ActorPtr iface() { return s4u::ActorPtr(&piface_); }
+ simgrid::s4u::Actor* ciface() { return &piface_; }
+
+ void daemonize();
+ bool isDaemon();
private:
+ bool daemon = false;
std::atomic_int_fast32_t refcount_ { 1 };
simgrid::s4u::Actor piface_; // Our interface is part of ourselves
};