// Make sure we do not outlive our parent:
sigset_t mask;
sigemptyset (&mask);
- if (sigprocmask(SIG_SETMASK, &mask, nullptr) < 0)
- throw simgrid::xbt::errno_error("Could not unblock signals");
- if (prctl(PR_SET_PDEATHSIG, SIGHUP) != 0)
- throw simgrid::xbt::errno_error("Could not PR_SET_PDEATHSIG");
+ xbt_assert(sigprocmask(SIG_SETMASK, &mask, nullptr) >= 0, "Could not unblock signals");
+ xbt_assert(prctl(PR_SET_PDEATHSIG, SIGHUP) == 0, "Could not PR_SET_PDEATHSIG");
#endif
- int res;
-
// Remove CLOEXEC in order to pass the socket to the exec-ed program:
int fdflags = fcntl(socket, F_GETFD, 0);
- if (fdflags == -1 || fcntl(socket, F_SETFD, fdflags & ~FD_CLOEXEC) == -1)
- throw simgrid::xbt::errno_error("Could not remove CLOEXEC for socket");
+ xbt_assert(fdflags != -1 && fcntl(socket, F_SETFD, fdflags & ~FD_CLOEXEC) != -1,
+ "Could not remove CLOEXEC for socket");
// Set environment:
setenv(MC_ENV_VARIABLE, "1", 1);
setenv("LC_BIND_NOW", "1", 1);
char buffer[64];
- res = std::snprintf(buffer, sizeof(buffer), "%i", socket);
- if ((size_t) res >= sizeof(buffer) || res == -1)
- std::abort();
+ 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);
}
pid_t do_fork(F code)
{
pid_t pid = fork();
- if (pid < 0)
- throw simgrid::xbt::errno_error("Could not fork model-checked process");
+ xbt_assert(pid >= 0, "Could not fork model-checked process");
if (pid != 0)
return pid;
// Child-process:
- try {
- code();
- _exit(EXIT_SUCCESS);
- }
- catch(...) {
- // The callback should catch exceptions:
- std::terminate();
- }
+ code();
+ _exit(EXIT_SUCCESS);
}
Session::Session(const std::function<void()>& code)
return argv_copy;
}
-static std::unique_ptr<simgrid::mc::Checker> createChecker(simgrid::mc::Session& session)
+static std::unique_ptr<simgrid::mc::Checker> create_checker(simgrid::mc::Session& session)
{
if (_sg_mc_comms_determinism || _sg_mc_send_determinism)
return std::unique_ptr<simgrid::mc::Checker>(simgrid::mc::createCommunicationDeterminismChecker(session));
int main(int argc, char** argv)
{
- using simgrid::mc::Session;
+ if (argc < 2)
+ xbt_die("Missing arguments.\n");
- try {
- if (argc < 2)
- xbt_die("Missing arguments.\n");
-
- // Currently, we need this before sg_config_init:
- _sg_do_model_check = 1;
+ // Currently, we need this before sg_config_init:
+ _sg_do_model_check = 1;
- // The initialization function can touch argv.
- // We make a copy of argv before modifying it in order to pass the original
- // value to the model-checked:
- char** argv_copy = argvdup(argc, argv);
- xbt_log_init(&argc, argv);
- sg_config_init(&argc, argv);
+ // The initialization function can touch argv.
+ // We make a copy of argv before modifying it in order to pass the original
+ // value to the model-checked:
+ char** argv_copy = argvdup(argc, argv);
+ xbt_log_init(&argc, argv);
+ sg_config_init(&argc, argv);
- simgrid::mc::session = new Session([argv_copy] {
- execvp(argv_copy[1], argv_copy+1);
- });
- delete[] argv_copy;
+ simgrid::mc::session = new simgrid::mc::Session([argv_copy] { execvp(argv_copy[1], argv_copy + 1); });
+ delete[] argv_copy;
- std::unique_ptr<simgrid::mc::Checker> checker = createChecker(*simgrid::mc::session);
- int res = SIMGRID_MC_EXIT_SUCCESS;
- try {
- checker->run();
- } catch (const simgrid::mc::DeadlockError&) {
- res = SIMGRID_MC_EXIT_DEADLOCK;
- } catch (const simgrid::mc::TerminationError&) {
- res = SIMGRID_MC_EXIT_NON_TERMINATION;
- } catch (const simgrid::mc::LivenessError&) {
- res = SIMGRID_MC_EXIT_LIVENESS;
- }
- checker = nullptr;
- simgrid::mc::session->close();
- return res;
- }
- catch(std::exception& e) {
- XBT_ERROR("Exception: %s", e.what());
- return SIMGRID_MC_EXIT_ERROR;
- }
- catch(...) {
- XBT_ERROR("Unknown exception");
- return SIMGRID_MC_EXIT_ERROR;
+ std::unique_ptr<simgrid::mc::Checker> checker = create_checker(*simgrid::mc::session);
+ int res = SIMGRID_MC_EXIT_SUCCESS;
+ try {
+ checker->run();
+ } catch (const simgrid::mc::DeadlockError&) {
+ res = SIMGRID_MC_EXIT_DEADLOCK;
+ } catch (const simgrid::mc::TerminationError&) {
+ res = SIMGRID_MC_EXIT_NON_TERMINATION;
+ } catch (const simgrid::mc::LivenessError&) {
+ res = SIMGRID_MC_EXIT_LIVENESS;
}
+ checker = nullptr;
+ simgrid::mc::session->close();
+ return res;
}