-/* Copyright (c) 2007-2012. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2007-2014. 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 "xbt/str.h"
#include "xbt/ex.h" /* ex_backtrace_display */
#include "mc/mc.h"
+#include "simgrid/sg_config.h"
XBT_LOG_NEW_CATEGORY(simix, "All SIMIX categories");
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_kernel, simix,
#ifdef TIME_BENCH_AMDAHL
simix_global->timer_seq = xbt_os_timer_new();
simix_global->timer_par = xbt_os_timer_new();
- xbt_os_timer_start(simix_global->timer_seq);
+ xbt_os_cputimer_start(simix_global->timer_seq);
#endif
simix_global->process_to_run = xbt_dynar_new(sizeof(smx_process_t), NULL);
simix_global->process_that_ran = xbt_dynar_new(sizeof(smx_process_t), NULL);
}
SIMIX_HOST_LEVEL = xbt_lib_add_level(host_lib,SIMIX_host_destroy);
+ SIMIX_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, SIMIX_storage_destroy);
- atexit(SIMIX_clean);
+ if (sg_cfg_get_boolean("clean_atexit"))
+ atexit(SIMIX_clean);
+
+ if (_sg_cfg_exit_asap)
+ exit(0);
}
/**
surf_exit();
#ifdef TIME_BENCH_AMDAHL
- xbt_os_timer_stop(simix_global->timer_seq);
- XBT_INFO("Amdhal timing informations. Sequential time: %lf; Parallel time: %lf",
+ xbt_os_cputimer_stop(simix_global->timer_seq);
+ XBT_INFO("Amdahl timing informations. Sequential time: %f; Parallel time: %f",
xbt_os_timer_elapsed(simix_global->timer_seq),
xbt_os_timer_elapsed(simix_global->timer_par));
xbt_os_timer_free(simix_global->timer_seq);
{
double time = 0;
smx_process_t process;
- xbt_swag_t set;
surf_action_t action;
smx_timer_t timer;
surf_model_t model;
/* Run all processes that are ready to run, possibly in parallel */
#ifdef TIME_BENCH_AMDAHL
- xbt_os_timer_stop(simix_global->timer_seq);
- xbt_os_timer_resume(simix_global->timer_par);
+ xbt_os_cputimer_stop(simix_global->timer_seq);
+ xbt_os_cputimer_resume(simix_global->timer_par);
#endif
SIMIX_process_runall();
#ifdef TIME_BENCH_AMDAHL
- xbt_os_timer_stop(simix_global->timer_par);
- xbt_os_timer_resume(simix_global->timer_seq);
+ xbt_os_cputimer_stop(simix_global->timer_par);
+ xbt_os_cputimer_resume(simix_global->timer_seq);
#endif
/* Move all killing processes to the end of the list, because killing a process that have an ongoing simcall is a bad idea */
timer = xbt_heap_pop(simix_timers);
if (timer->func)
((void (*)(void*))timer->func)(timer->args);
+ xbt_free(timer);
}
+
/* Wake up all processes waiting for a Surf action to finish */
xbt_dynar_foreach(model_list, iter, model) {
- set = model->states.failed_action_set;
- while ((action = xbt_swag_extract(set)))
- SIMIX_simcall_post((smx_action_t) action->data);
- set = model->states.done_action_set;
-
- while ((action = xbt_swag_extract(set))) {
- if (action->data == NULL)
- XBT_INFO("probably vcpu's action %p, skip", action);
+ while ((action = surf_model_extract_failed_action_set(model)))
+
+ SIMIX_simcall_post((smx_action_t) surf_action_get_data(action));
+
+ while ((action = surf_model_extract_done_action_set(model)))
+ if (surf_action_get_data(action) == NULL)
+ XBT_DEBUG("probably vcpu's action %p, skip", action);
else
- SIMIX_simcall_post((smx_action_t) action->data);
+ SIMIX_simcall_post((smx_action_t) surf_action_get_data(action));
+ }
+
+ /* Autorestart all process */
+ if(host_that_restart) {
+ 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));
}
+ xbt_dynar_reset(host_that_restart);
}
/* Clean processes to destroy */
TRACE_end();
#endif
- XBT_WARN("Oops ! Deadlock or code not perfectly clean.");
+ XBT_CRITICAL("Oops ! Deadlock or code not perfectly clean.");
SIMIX_display_process_status();
xbt_abort();
}