/* FIXME: Yeah, I'll do it in a portable maner one day [Mt] */
#include <signal.h>
+int _surf_do_verbose_exit = 1;
static void _XBT_CALL inthandler(int ignored)
{
- XBT_INFO("CTRL-C pressed. Displaying status and bailing out");
- SIMIX_display_process_status();
+ if ( _surf_do_verbose_exit ) {
+ XBT_INFO("CTRL-C pressed. Displaying status and bailing out");
+ SIMIX_display_process_status();
+ }
+ else {
+ XBT_INFO("CTRL-C pressed. bailing out without displaying because verbose-exit disabled");
+ }
exit(1);
}
simix_global = xbt_new0(s_smx_global_t, 1);
- simix_global->process_to_run = xbt_dynar_new(sizeof(void *), NULL);
+ 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_global->process_list =
xbt_swag_new(xbt_swag_offset(proc, process_hookup));
simix_global->process_to_destroy =
__xbt_running_ctx_fetch = SIMIX_process_get_running_context;
__xbt_ex_terminate = SIMIX_process_exception_terminate;
- /* Initialize request mechanism */
- SIMIX_request_init();
-
/* Initialize the SIMIX network module */
SIMIX_network_init();
/* Exit the SIMIX network module */
SIMIX_network_exit();
- /* Exit request mechanism */
- SIMIX_request_destroy();
-
xbt_heap_free(simix_timers);
/* Free the remaining data structures */
xbt_dynar_free(&simix_global->process_to_run);
+ xbt_dynar_free(&simix_global->process_that_ran);
xbt_swag_free(simix_global->process_to_destroy);
xbt_swag_free(simix_global->process_list);
simix_global->process_list = NULL;
void SIMIX_run(void)
{
double time = 0;
- smx_req_t req;
+ smx_process_t process;
xbt_swag_t set;
surf_action_t action;
smx_timer_t timer;
#ifdef TIME_BENCH
smx_ctx_raw_new_sr();
#endif
- do {
+ while (xbt_dynar_length(simix_global->process_to_run)) {
XBT_DEBUG("New Sub-Schedule Round; size(queue)=%lu",
xbt_dynar_length(simix_global->process_to_run));
- SIMIX_context_runall(simix_global->process_to_run);
- while ((req = SIMIX_request_pop())) {
- XBT_DEBUG("Handling request %p", req);
- SIMIX_request_pre(req, 0);
+ SIMIX_process_runall();
+ xbt_dynar_foreach(simix_global->process_that_ran, iter, process) {
+ if (process->request.call != REQ_NO_REQ) {
+ XBT_DEBUG("Handling request %p", &process->request);
+ SIMIX_request_pre(&process->request, 0);
+ }
}
- } while (xbt_dynar_length(simix_global->process_to_run));
+ }
- time = surf_solve(SIMIX_timer_next());
+ time = SIMIX_timer_next();
+ if (time != -1.0 || xbt_swag_size(simix_global->process_list) != 0)
+ time = surf_solve(time);
/* Notify all the hosts that have failed */
/* FIXME: iterate through the list of failed host and mark each of them */
SIMIX_request_post((smx_action_t) action->data);
}
}
+
+ /* Clean processes to destroy */
+ SIMIX_process_empty_trash();
+
} while (time != -1.0);
if (xbt_swag_size(simix_global->process_list) != 0) {
+#ifdef HAVE_TRACING
+ TRACE_end();
+#endif
+
XBT_WARN("Oops ! Deadlock or code not perfectly clean.");
SIMIX_display_process_status();
xbt_abort();
XBT_INFO("%d processes are still running, waiting for something.", nbprocess);
/* List the process and their state */
XBT_INFO
- ("Legend of the following listing: \"<process> on <host>: <status>.\"");
+ ("Legend of the following listing: \"<process>(<pid>) on <host>: <status>.\"");
xbt_swag_foreach(process, simix_global->process_list) {
if (process->waiting_action) {
action_description = "I/O";
break;
}
- XBT_INFO("Waiting for %s action %p to finish", action_description, process->waiting_action);
+ XBT_INFO("Process %ld (%s@%s): waiting for %s action %p (%s) to finish", process->pid, process->name, process->smx_host->name,
+ action_description, process->waiting_action, process->waiting_action->name);
}
}
}