-extern smx_global_t simix_global;
-extern unsigned long simix_process_maxpid;
-
-/*********************************** Time ************************************/
-
-/** @brief Timer datatype */
-typedef struct s_smx_timer {
- double date;
- void* func;
- void* args;
-} s_smx_timer_t;
-
-/********************************* Action *************************************/
-
-typedef enum {
- SIMIX_ACTION_EXECUTE,
- SIMIX_ACTION_PARALLEL_EXECUTE,
- SIMIX_ACTION_COMMUNICATE,
- SIMIX_ACTION_SLEEP,
- SIMIX_ACTION_SYNCHRO,
- SIMIX_ACTION_IO
-} e_smx_action_type_t;
-
-typedef enum {
- SIMIX_COMM_SEND,
- SIMIX_COMM_RECEIVE,
- SIMIX_COMM_READY,
- SIMIX_COMM_DONE
-} e_smx_comm_type_t;
-
-/** @brief Action datatype */
-typedef struct s_smx_action {
-
- e_smx_action_type_t type; /* Type of SIMIX action*/
- e_smx_state_t state; /* State of the action */
- char *name; /* Action name if any */
- xbt_fifo_t simcalls; /* List of simcalls waiting for this action */
-
- /* Data specific to each action type */
- union {
-
- struct {
- smx_host_t host; /* The host where the execution takes place */
- surf_action_t surf_exec; /* The Surf execution action encapsulated */
- } execution; /* Possibly parallel execution */
-
- struct {
- e_smx_comm_type_t type; /* Type of the communication (SIMIX_COMM_SEND or SIMIX_COMM_RECEIVE) */
- smx_rdv_t rdv; /* Rendez-vous where the comm is queued */
- int refcount; /* Number of processes involved in the cond */
- int detached; /* If detached or not */
-
- void (*clean_fun)(void*); /* Function to clean the detached src_buf if something goes wrong */
-
- /* Surf action data */
- surf_action_t surf_comm; /* The Surf communication action encapsulated */
- surf_action_t src_timeout; /* Surf's actions to instrument the timeouts */
- surf_action_t dst_timeout; /* Surf's actions to instrument the timeouts */
- smx_process_t src_proc;
- smx_process_t dst_proc;
- double rate;
- double task_size;
-
- /* Data to be transfered */
- void *src_buff;
- void *dst_buff;
- size_t src_buff_size;
- size_t *dst_buff_size;
- char copied;
-
- void* src_data; /* User data associated to communication */
- void* dst_data;
- } comm;
-
- struct {
- smx_host_t host; /* The host that is sleeping */
- surf_action_t surf_sleep; /* The Surf sleeping action encapsulated */
- } sleep;
-
- struct {
- surf_action_t sleep;
- } synchro;
-
- struct {
- smx_host_t host;
- surf_action_t surf_io;
- } io;
- };
-
-#ifdef HAVE_LATENCY_BOUND_TRACKING
- int latency_limited;
-#endif
-
-#ifdef HAVE_TRACING
- char *category; /* simix action category for instrumentation */
+namespace simgrid {
+namespace simix {
+
+class Global {
+ friend bool simgrid::s4u::this_actor::isMaestro();
+
+public:
+ smx_context_factory_t context_factory = nullptr;
+ xbt_dynar_t process_to_run = nullptr;
+ xbt_dynar_t process_that_ran = nullptr;
+ std::map<aid_t, smx_actor_t> process_list;
+#if SIMGRID_HAVE_MC
+ /* MCer cannot read the std::map above in the remote process, so we copy the info it needs in a dynar.
+ * FIXME: This is supposed to be a temporary hack.
+ * A better solution would be to change the split between MCer and MCed, where the responsibility
+ * to compute the list of the enabled transitions goes to the MCed.
+ * That way, the MCer would not need to have the list of actors on its side.
+ * These info could be published by the MCed to the MCer in a way inspired of vd.so
+ */
+ xbt_dynar_t actors_vector = xbt_dynar_new(sizeof(smx_actor_t), nullptr);