Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[SMPI] Fix headers for call-location tracing.
authorChristian Heinrich <franz-christian.heinrich@inria.fr>
Fri, 27 May 2016 12:50:29 +0000 (14:50 +0200)
committerChristian Heinrich <franz-christian.heinrich@inria.fr>
Fri, 27 May 2016 12:52:46 +0000 (14:52 +0200)
smpi_trace_set_call_location() accesses smpi_process_data(). The data
field however is not initialized until MPI_Init() gets called; hence,
a segfault is caused.

This issue does not exist for the fortran wrappers!

The solution is to initialize the field just before the MPI_Init call.

include/smpi/smpi_extended_traces.h
tools/smpi/generate_smpi_defines.pl

index c856e41..f5dd7e5 100644 (file)
@@ -1,7 +1,7 @@
 // This file has been automatically generated by the script
 // in tools/smpi/./generate_smpi_defines.pl
 // DO NOT EDIT MANUALLY. ALL CHANGES WILL BE OVERWRITTEN!
-#define MPI_Init(...) ({ smpi_trace_set_call_location(__FILE__,__LINE__); MPI_Init(__VA_ARGS__); })
+#define MPI_Init(...) ({ smpi_process_init(__VA_ARGS__); smpi_trace_set_call_location(__FILE__,__LINE__); MPI_Init(NULL, NULL); })
 #define MPI_Finalize(...) ({ smpi_trace_set_call_location(__FILE__,__LINE__); MPI_Finalize(__VA_ARGS__); })
 #define MPI_Finalized(...) ({ smpi_trace_set_call_location(__FILE__,__LINE__); MPI_Finalized(__VA_ARGS__); })
 #define MPI_Init_thread(...) ({ smpi_trace_set_call_location(__FILE__,__LINE__); MPI_Init_thread(__VA_ARGS__); })
index a719771..1306f45 100755 (executable)
@@ -40,7 +40,12 @@ sub output_macro {
     print "#define ". uc($id) ." smpi_trace_set_call_location(__FILE__,__LINE__); call ". lc $id ."\n";
   }
   else {
-    print "#define $id(...) ({ smpi_trace_set_call_location(__FILE__,__LINE__); $id(__VA_ARGS__); })\n";
+    if ($id eq "MPI_Init") {
+      print "#define MPI_Init(...) ({ smpi_process_init(__VA_ARGS__); smpi_trace_set_call_location(__FILE__,__LINE__); MPI_Init(NULL, NULL); })\n";
+    }
+    else {
+      print "#define $id(...) ({ smpi_trace_set_call_location(__FILE__,__LINE__); $id(__VA_ARGS__); })\n";
+    }
   }
 }