-/* Copyright (c) 2007-2014. The SimGrid Team.
+/* Copyright (c) 2007-2015. 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. */
#include <stdlib.h>
+#include <sys/ptrace.h>
#include "smx_private.h"
#include "xbt/heap.h"
#include "xbt/str.h"
#include "xbt/ex.h" /* ex_backtrace_display */
#include "mc/mc.h"
-#include "mc/mc_replay.h"
+#include "src/mc/mc_replay.h"
#include "simgrid/sg_config.h"
#ifdef HAVE_MC
-#include "mc/mc_private.h"
-#include "mc/mc_protocol.h"
-#include "mc/mc_client.h"
+#include "src/mc/mc_private.h"
+#include "src/mc/mc_protocol.h"
+#include "src/mc/mc_client.h"
#endif
-#include "mc/mc_record.h"
+
+#ifdef HAVE_MC
+#include <stdlib.h>
+#include "src/mc/mc_protocol.h"
+#endif
+
+#include "src/mc/mc_record.h"
#ifdef HAVE_SMPI
-#include "smpi/private.h"
+#include "src/smpi/private.h"
#endif
XBT_LOG_NEW_CATEGORY(simix, "All SIMIX categories");
*/
void SIMIX_global_init(int *argc, char **argv)
{
+#ifdef HAVE_MC
+ _sg_do_model_check = getenv(MC_ENV_VARIABLE) != NULL;
+#endif
+
s_smx_process_t proc;
if (!simix_global) {
simix_timers = xbt_heap_new(8, &free);
}
- SIMIX_HOST_LEVEL = xbt_lib_add_level(host_lib,SIMIX_host_destroy);
SIMIX_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, SIMIX_storage_destroy);
if (sg_cfg_get_boolean("clean_atexit"))
// We need to communicate initialization of the different layers to the model-checker.
if (mc_mode == MC_MODE_NONE) {
if (getenv(MC_ENV_SOCKET_FD)) {
+
mc_mode = MC_MODE_CLIENT;
MC_client_init();
- MC_client_hello();
+
+ // Waiting for the model-checker:
+ if (ptrace(PTRACE_TRACEME, 0, NULL, NULL) == -1 || raise(SIGSTOP) != 0)
+ xbt_die("Could not wait for the model-checker");
+
MC_client_handle_messages();
}
}
exit(0);
}
+int smx_cleaned = 0;
/**
* \ingroup SIMIX_API
* \brief Clean the SIMIX simulation
*/
void SIMIX_clean(void)
{
- static int cleaned = 0;
#ifdef TIME_BENCH_PER_SR
smx_ctx_raw_new_sr();
#endif
- if (cleaned) return; // to avoid double cleaning by java and C
- cleaned = 1;
- /* Kill everyone (except maestro) */
+ if (smx_cleaned) return; // to avoid double cleaning by java and C
+ smx_cleaned = 1;
+ XBT_DEBUG("SIMIX_clean called. Simulation's over.");
+ if (!xbt_dynar_is_empty(simix_global->process_to_run) && SIMIX_get_clock() == 0.0) {
+ XBT_CRITICAL(" ");
+ XBT_CRITICAL("The time is still 0, and you still have processes ready to run.");
+ XBT_CRITICAL("It seems that you forgot to run the simulation that you setup.");
+ xbt_die("Bailing out to avoid that stop-before-start madness. Please fix your code.");
+ }
+ /* Kill all processes (but maestro) */
SIMIX_process_killall(simix_global->maestro_process, 1);
/* Exit the SIMIX network module */
char *hostname = NULL;
xbt_dynar_foreach(host_that_restart,iter,hostname) {
XBT_INFO("Restart processes on host: %s",hostname);
- SIMIX_host_autorestart(SIMIX_host_get_by_name(hostname));
+ SIMIX_host_autorestart(sg_host_by_name(hostname));
}
xbt_dynar_reset(host_that_restart);
}