#ifndef _SIMIX_PROCESS_PRIVATE_H
#define _SIMIX_PROCESS_PRIVATE_H
+#include <atomic>
#include <functional>
#include <string>
#include <xbt/string.hpp>
#include <simgrid/simix.hpp>
+#include <simgrid/s4u/Actor.hpp>
+
#include "simgrid/simix.h"
#include "popping_private.h"
class Process {
public:
+ Process() : actor_(this) {}
// TODO, replace with boost intrusive container hooks
s_xbt_swag_hookup_t process_hookup = { nullptr, nullptr }; /* simix_global->process_list */
// TODO, pack them
std::exception_ptr exception;
+ bool finished = false;
bool blocked = false;
bool suspended = false;
bool auto_restart = false;
std::function<void()> code;
smx_timer_t kill_timer = nullptr;
int segment_index = 0; /*Reference to an SMPI process' data segment. Default value is -1 if not in SMPI context*/
+
+ friend void intrusive_ptr_add_ref(Process* process)
+ {
+ // Atomic operation! Do not split in two instructions!
+ auto previous = (process->refcount_)++;
+ xbt_assert(previous != 0);
+ (void) previous;
+ }
+ friend void intrusive_ptr_release(Process* process)
+ {
+ // Atomic operation! Do not split in two instructions!
+ auto count = --(process->refcount_);
+ if (count == 0)
+ delete process;
+ }
+
+ ~Process();
+
+ simgrid::s4u::Actor& actor() { return actor_; }
+
+private:
+ std::atomic_int_fast32_t refcount_ { 1 };
+ simgrid::s4u::Actor actor_;
};
}