X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/03d36345c4247a907709b86c189a53f5f85bea88..068c7c9cf6ec9fe22cc80d65633a7c05caf767f5:/src/simix/smx_global.c diff --git a/src/simix/smx_global.c b/src/simix/smx_global.c index 6d52482a29..43e7f830ea 100644 --- a/src/simix/smx_global.c +++ b/src/simix/smx_global.c @@ -281,7 +281,7 @@ void SIMIX_clean(void) */ XBT_INLINE double SIMIX_get_clock(void) { - if(MC_is_active()){ + if(MC_is_active() || MC_record_replay_is_active()){ return MC_process_clock_get(SIMIX_process_self()); }else{ return surf_get_clock(); @@ -308,6 +308,7 @@ static int process_syscall_color(void *p) void SIMIX_run(void) { if(MC_record_path) { + MC_record_replay_init(); MC_record_replay_from_string(MC_record_path); return; } @@ -340,7 +341,7 @@ void SIMIX_run(void) 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 */ + /* Move all killer processes to the end of the list, because killing a process that have an ongoing simcall is a bad idea */ xbt_dynar_three_way_partition(simix_global->process_that_ran, process_syscall_color); /* answer sequentially and in a fixed arbitrary order all the simcalls that were issued during that sub-round */ @@ -403,12 +404,30 @@ void SIMIX_run(void) SIMIX_simcall_handle(&process->simcall, 0); } } + /* Wake up all processes waiting for a Surf action to finish */ + xbt_dynar_foreach(model_list, iter, model) { + XBT_DEBUG("Handling process whose action failed"); + while ((action = surf_model_extract_failed_action_set(model))) { + XBT_DEBUG(" Handling Action %p",action); + SIMIX_simcall_exit((smx_synchro_t) surf_action_get_data(action)); + } + XBT_DEBUG("Handling process whose action terminated normally"); + while ((action = surf_model_extract_done_action_set(model))) { + XBT_DEBUG(" Handling Action %p",action); + if (surf_action_get_data(action) == NULL) + XBT_DEBUG("probably vcpu's action %p, skip", action); + else + SIMIX_simcall_exit((smx_synchro_t) surf_action_get_data(action)); + } + } } time = SIMIX_timer_next(); - if (time != -1.0 || xbt_swag_size(simix_global->process_list) != 0) + if (time != -1.0 || xbt_swag_size(simix_global->process_list) != 0) { + XBT_DEBUG("Calling surf_solve"); time = surf_solve(time); - + XBT_DEBUG("Moving time ahead : %g", time); + } /* Notify all the hosts that have failed */ /* FIXME: iterate through the list of failed host and mark each of them */ /* as failed. On each host, signal all the running processes with host_fail */ @@ -425,14 +444,19 @@ void SIMIX_run(void) /* Wake up all processes waiting for a Surf action to finish */ xbt_dynar_foreach(model_list, iter, model) { - while ((action = surf_model_extract_failed_action_set(model))) + XBT_DEBUG("Handling process whose action failed"); + while ((action = surf_model_extract_failed_action_set(model))) { + XBT_DEBUG(" Handling Action %p",action); SIMIX_simcall_exit((smx_synchro_t) surf_action_get_data(action)); - - while ((action = surf_model_extract_done_action_set(model))) + } + XBT_DEBUG("Handling process whose action terminated normally"); + while ((action = surf_model_extract_done_action_set(model))) { + XBT_DEBUG(" Handling Action %p",action); if (surf_action_get_data(action) == NULL) XBT_DEBUG("probably vcpu's action %p, skip", action); else SIMIX_simcall_exit((smx_synchro_t) surf_action_get_data(action)); + } } /* Autorestart all process */ @@ -455,9 +479,7 @@ void SIMIX_run(void) if (xbt_swag_size(simix_global->process_list) != 0) { -#ifdef HAVE_TRACING - TRACE_end(); -#endif + TRACE_end(); XBT_CRITICAL("Oops ! Deadlock or code not perfectly clean."); SIMIX_display_process_status();