Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix MPI_Initialized
authorAugustin Degomme <degomme@idpann.imag.fr>
Tue, 16 Jul 2013 15:11:34 +0000 (17:11 +0200)
committerAugustin Degomme <degomme@idpann.imag.fr>
Tue, 16 Jul 2013 15:11:34 +0000 (17:11 +0200)
src/smpi/private.h
src/smpi/smpi_global.c
src/smpi/smpi_pmpi.c

index f72f515..61c341b 100644 (file)
@@ -98,6 +98,9 @@ void smpi_process_init(int *argc, char ***argv);
 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);
index 7cf9d54..27a53de 100644 (file)
@@ -29,6 +29,7 @@ typedef struct s_smpi_process_data {
   double simulated;
   MPI_Comm comm_self;
   void *data; /* user data */
+  int initialized;
 } s_smpi_process_data_t;
 
 static smpi_process_data_t *process_data = NULL;
@@ -104,6 +105,24 @@ int smpi_process_finalized()
   // If finalized, this value has been set to -100;
 }
 
+/**
+ * @brief Check if a process is initialized
+ */
+int smpi_process_initialized(void)
+{
+  int index = smpi_process_index();
+  return((index != -100) && (index!=MPI_UNDEFINED) && (process_data[index]->initialized));
+}
+
+/**
+ * @brief Mark a process as initialized (=MPI_Init called)
+ */
+void smpi_process_mark_as_initialized(void)
+{
+  int index = smpi_process_index();
+  if(index != -100)process_data[index]->initialized=1;
+}
+
 
 #ifdef SMPI_F2C
 int smpi_process_argc(void) {
@@ -264,6 +283,8 @@ void smpi_global_init(void)
     process_data[i]->timer = xbt_os_timer_new();
     group = smpi_group_new(1);
     process_data[i]->comm_self = smpi_comm_new(group);
+    process_data[i]->initialized =0;
+
     smpi_group_set_mapping(group, i, 0);
   }
   group = smpi_group_new(process_count);
index 7859738..5e7d3b9 100644 (file)
@@ -27,6 +27,7 @@ void TRACE_smpi_set_category(const char *category)
 int PMPI_Init(int *argc, char ***argv)
 {
   smpi_process_init(argc, argv);
+  smpi_process_mark_as_initialized();
 #ifdef HAVE_TRACING
   int rank = smpi_process_index();
   TRACE_smpi_init(rank);
@@ -2395,7 +2396,7 @@ int PMPI_Error_class(int errorcode, int* errorclass) {
 
 
 int PMPI_Initialized(int* flag) {
-   *flag=(smpi_process_data()!=NULL);
+   *flag=smpi_process_initialized();
    return MPI_SUCCESS;
 }