Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
further simplify the MC initialization
[simgrid.git] / src / mc / Session.cpp
index a5721e3..669345d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2019. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2015-2020. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -6,6 +6,10 @@
 #include "src/mc/Session.hpp"
 #include "src/mc/checker/Checker.hpp"
 #include "src/mc/mc_config.hpp"
+#include "src/internal_config.h" // HAVE_SMPI
+#if HAVE_SMPI
+#include "smpi/smpi.h"
+#endif
 #include "src/mc/mc_private.hpp"
 #include "src/mc/mc_state.hpp"
 #include "xbt/log.h"
@@ -21,8 +25,12 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_Session, mc, "Model-checker session");
 namespace simgrid {
 namespace mc {
 
-static void setup_child_environment(int socket)
+static void run_child_process(int socket, const std::function<void()>& code)
 {
+  /* On startup, simix_global_init() calls simgrid::mc::Client::initialize(), which checks whether the MC_ENV_SOCKET_FD
+   * env variable is set. If so, MC mode is assumed, and the client is setup from its side
+   */
+
 #ifdef __linux__
   // Make sure we do not outlive our parent
   sigset_t mask;
@@ -36,9 +44,6 @@ static void setup_child_environment(int socket)
   xbt_assert(fdflags != -1 && fcntl(socket, F_SETFD, fdflags & ~FD_CLOEXEC) != -1,
              "Could not remove CLOEXEC for socket");
 
-  // Set environment so that mmalloc gets used in application
-  setenv(MC_ENV_VARIABLE, "1", 1);
-
   // Disable lazy relocation in the model-checked process to prevent the application from
   // modifying its .got.plt during snapshot.
   setenv("LC_BIND_NOW", "1", 1);
@@ -47,12 +52,15 @@ static void setup_child_environment(int socket)
   int res = std::snprintf(buffer, sizeof(buffer), "%i", socket);
   xbt_assert((size_t)res < sizeof(buffer) && res != -1);
   setenv(MC_ENV_SOCKET_FD, buffer, 1);
+
+  code();
 }
 
 Session::Session(const std::function<void()>& code)
 {
 #if HAVE_SMPI
-  xbt_assert(smpi_privatize_global_variables != SmpiPrivStrategies::MMAP,
+  smpi_init_options();//only performed once
+  xbt_assert(smpi_cfg_privatization() != SmpiPrivStrategies::MMAP,
              "Please use the dlopen privatization schema when model-checking SMPI code");
 #endif
 
@@ -68,9 +76,8 @@ Session::Session(const std::function<void()>& code)
 
   if (pid == 0) { // Child
     ::close(sockets[1]);
-    setup_child_environment(sockets[0]);
-    code();
-    xbt_die("The model-checked process failed to exec()");
+    run_child_process(sockets[0], code);
+    DIE_IMPOSSIBLE;
   }
 
   // Parent (model-checker):
@@ -90,6 +97,7 @@ Session::~Session()
   this->close();
 }
 
+/** Take the initial snapshot of the application, that must be stopped. */
 void Session::initialize()
 {
   xbt_assert(initial_snapshot_ == nullptr);
@@ -118,7 +126,8 @@ void Session::log_state()
   }
   if (getenv("SIMGRID_MC_SYSTEM_STATISTICS")){
     int ret=system("free");
-    if(ret!=0)XBT_WARN("system call did not return 0, but %d",ret);
+    if (ret != 0)
+      XBT_WARN("Call to system(free) did not return 0, but %d", ret);
   }
 }