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
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 (pid == 0) { // Child
::close(sockets[1]);
- setup_child_environment(sockets[0]);
- code();
- xbt_die("The model-checked process failed to exec(): %s", strerror(errno));
+ run_child_process(sockets[0], code);
+ DIE_IMPOSSIBLE;
}
// Parent (model-checker):
xbt_assert(argv_copy[i] != nullptr,
"Unable to find a binary to exec on the command line. Did you only pass config flags?");
execvp(argv_copy[i], argv_copy + i);
+ xbt_die("The model-checked process failed to exec(): %s", strerror(errno));
});
delete[] argv_copy;