-void smpi_process_destroy(void);
-void smpi_process_finalize(void);
-int smpi_process_finalized(void);
-int smpi_process_initialized(void);
-void smpi_process_mark_as_initialized(void);
-
-
-smpi_process_data_t smpi_process_data(void);
-smpi_process_data_t smpi_process_remote_data(int index);
-void smpi_process_set_user_data(void *);
-void* smpi_process_get_user_data(void);
-int smpi_process_count(void);
-smx_rdv_t smpi_process_mailbox(void);
-smx_rdv_t smpi_process_remote_mailbox(int index);
-smx_rdv_t smpi_process_mailbox_small(void);
-smx_rdv_t smpi_process_remote_mailbox_small(int index);
-xbt_os_timer_t smpi_process_timer(void);
-void smpi_process_simulated_start(void);
-double smpi_process_simulated_elapsed(void);
-void smpi_process_set_sampling(int s);
-int smpi_process_get_sampling(void);
-
-void print_request(const char *message, MPI_Request request);
-
-void smpi_global_init(void);
-void smpi_global_destroy(void);
-
-size_t smpi_datatype_size(MPI_Datatype datatype);
-MPI_Aint smpi_datatype_lb(MPI_Datatype datatype);
-MPI_Aint smpi_datatype_ub(MPI_Datatype datatype);
-int smpi_datatype_extent(MPI_Datatype datatype, MPI_Aint * lb,
+typedef struct s_smpi_mpi_comm_key_elem {
+ MPI_Comm_copy_attr_function* copy_fn;
+ MPI_Comm_delete_attr_function* delete_fn;
+} s_smpi_mpi_comm_key_elem_t;
+typedef struct s_smpi_mpi_comm_key_elem *smpi_comm_key_elem;
+
+typedef struct s_smpi_mpi_type_key_elem {
+ MPI_Type_copy_attr_function* copy_fn;
+ MPI_Type_delete_attr_function* delete_fn;
+} s_smpi_mpi_type_key_elem_t;
+typedef struct s_smpi_mpi_type_key_elem *smpi_type_key_elem;
+
+typedef struct s_smpi_mpi_info {
+ xbt_dict_t info_dict;
+ int refcount;
+} s_smpi_mpi_info_t;
+
+
+XBT_PRIVATE void smpi_process_destroy(void);
+XBT_PRIVATE void smpi_process_finalize(void);
+XBT_PRIVATE int smpi_process_finalized(void);
+XBT_PRIVATE int smpi_process_initialized(void);
+XBT_PRIVATE void smpi_process_mark_as_initialized(void);
+
+
+struct s_smpi_mpi_cart_topology;
+typedef struct s_smpi_mpi_cart_topology *MPIR_Cart_Topology;
+
+struct s_smpi_mpi_graph_topology;
+typedef struct s_smpi_mpi_graph_topology *MPIR_Graph_Topology;
+
+struct s_smpi_dist_graph_topology;
+typedef struct s_smpi_dist_graph_topology *MPIR_Dist_Graph_Topology;
+
+// MPI_Topology defined in smpi.h, as it is public
+
+XBT_PRIVATE void smpi_topo_destroy(MPI_Topology topo);
+XBT_PRIVATE MPI_Topology smpi_topo_create(MPIR_Topo_type kind);
+XBT_PRIVATE void smpi_cart_topo_destroy(MPIR_Cart_Topology cart);
+XBT_PRIVATE MPI_Topology smpi_cart_topo_create(int ndims);
+XBT_PRIVATE int smpi_mpi_cart_create(MPI_Comm comm_old, int ndims, int dims[],
+ int periods[], int reorder, MPI_Comm *comm_cart);
+XBT_PRIVATE int smpi_mpi_cart_sub(MPI_Comm comm, const int remain_dims[], MPI_Comm *newcomm);
+XBT_PRIVATE int smpi_mpi_cart_coords(MPI_Comm comm, int rank, int maxdims,
+ int coords[]);
+XBT_PRIVATE int smpi_mpi_cart_get(MPI_Comm comm, int maxdims, int* dims, int* periods,
+ int* coords);
+XBT_PRIVATE int smpi_mpi_cart_rank(MPI_Comm comm, int* coords, int* rank);
+XBT_PRIVATE int smpi_mpi_cart_shift(MPI_Comm comm, int direction, int disp,
+ int *rank_source, int *rank_dest);
+XBT_PRIVATE int smpi_mpi_cartdim_get(MPI_Comm comm, int *ndims);
+XBT_PRIVATE int smpi_mpi_dims_create(int nnodes, int ndims, int dims[]);
+
+
+XBT_PRIVATE smpi_process_data_t smpi_process_data(void);
+XBT_PRIVATE smpi_process_data_t smpi_process_remote_data(int index);
+// smpi_process_[set/get]_user_data must be public
+/* XBT_PRIVATE void smpi_process_set_user_data(void *); */
+/* XBT_PRIVATE void* smpi_process_get_user_data(void); */
+XBT_PRIVATE int smpi_process_count(void);
+XBT_PRIVATE MPI_Comm smpi_process_comm_world(void);
+XBT_PRIVATE MPI_Comm smpi_process_get_comm_intra(void);
+XBT_PRIVATE void smpi_process_set_comm_intra(MPI_Comm comm);
+XBT_PRIVATE smx_rdv_t smpi_process_mailbox(void);
+XBT_PRIVATE smx_rdv_t smpi_process_remote_mailbox(int index);
+XBT_PRIVATE smx_rdv_t smpi_process_mailbox_small(void);
+XBT_PRIVATE smx_rdv_t smpi_process_remote_mailbox_small(int index);
+XBT_PRIVATE xbt_mutex_t smpi_process_mailboxes_mutex(void);
+XBT_PRIVATE xbt_mutex_t smpi_process_remote_mailboxes_mutex(int index);
+XBT_PRIVATE xbt_os_timer_t smpi_process_timer(void);
+XBT_PRIVATE void smpi_process_simulated_start(void);
+XBT_PRIVATE double smpi_process_simulated_elapsed(void);
+XBT_PRIVATE void smpi_process_set_sampling(int s);
+XBT_PRIVATE int smpi_process_get_sampling(void);
+XBT_PRIVATE void smpi_process_set_replaying(int s);
+XBT_PRIVATE int smpi_process_get_replaying(void);
+
+XBT_PRIVATE void smpi_deployment_register_process(const char* instance_id, int rank, int index, MPI_Comm**, xbt_bar_t*);
+XBT_PRIVATE void smpi_deployment_cleanup_instances(void);
+
+XBT_PRIVATE void smpi_comm_copy_buffer_callback(smx_synchro_t comm,
+ void *buff, size_t buff_size);
+
+XBT_PRIVATE void smpi_comm_null_copy_buffer_callback(smx_synchro_t comm,
+ void *buff, size_t buff_size);
+
+XBT_PRIVATE void print_request(const char *message, MPI_Request request);
+
+XBT_PRIVATE int smpi_enabled(void);
+XBT_PRIVATE void smpi_global_init(void);
+XBT_PRIVATE void smpi_global_destroy(void);
+XBT_PRIVATE double smpi_mpi_wtime(void);
+
+XBT_PRIVATE int is_datatype_valid(MPI_Datatype datatype);
+
+XBT_PRIVATE size_t smpi_datatype_size(MPI_Datatype datatype);
+XBT_PRIVATE MPI_Aint smpi_datatype_lb(MPI_Datatype datatype);
+XBT_PRIVATE MPI_Aint smpi_datatype_ub(MPI_Datatype datatype);
+XBT_PRIVATE int smpi_datatype_dup(MPI_Datatype datatype, MPI_Datatype* new_t);
+XBT_PRIVATE int smpi_datatype_extent(MPI_Datatype datatype, MPI_Aint * lb,