* under the terms of the license (GNU LGPL) which comes with this package. */
#include <stdlib.h>
+#include "src/portable.h"
+#ifdef HAVE_SYS_PTRACE_H
+# include <sys/types.h>
+# include <sys/ptrace.h>
+#endif
#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"
+#include "src/surf/callbacks.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");
smx_global_t simix_global = NULL;
static xbt_heap_t simix_timers = NULL;
+/** @brief Timer datatype */
+typedef struct s_smx_timer {
+ double date;
+ void(* func)(void*);
+ void* args;
+} s_smx_timer_t;
+
static void* SIMIX_synchro_mallocator_new_f(void);
static void SIMIX_synchro_mallocator_free_f(void* synchro);
static void SIMIX_synchro_mallocator_reset_f(void* synchro);
}
#endif
}
-#ifdef HAVE_MC
- if (MC_is_active()) {
- if (mc_stack) {
- MC_dump_stack_safety(mc_stack);
- }
- MC_print_statistics(mc_stats);
- }
-#endif
raise(signum);
}
return xbt_heap_size(simix_timers) > 0 ? xbt_heap_maxkey(simix_timers) : -1.0;
}
+static void kill_process(smx_process_t process)
+{
+ SIMIX_process_kill(process, NULL);
+}
+
+static void SIMIX_storage_create_(smx_storage_t storage)
+{
+ const char* key = xbt_dict_get_elm_key(storage);
+ SIMIX_storage_create(key, storage, NULL);
+}
+
/**
* \ingroup SIMIX_API
* \brief Initialize SIMIX internal data.
*/
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_global->registered_functions = xbt_dict_new_homogeneous(NULL);
simix_global->create_process_function = SIMIX_process_create;
- simix_global->kill_process_function = SIMIX_process_kill;
+ simix_global->kill_process_function = kill_process;
simix_global->cleanup_process_function = SIMIX_process_cleanup;
simix_global->synchro_mallocator = xbt_mallocator_new(65536,
SIMIX_synchro_mallocator_new_f, SIMIX_synchro_mallocator_free_f,
/* register a function to be called by SURF after the environment creation */
sg_platf_init();
sg_platf_postparse_add_cb(SIMIX_post_create_environment);
+ surf_on_host_created(SIMIX_host_create);
+ surf_on_storage_created(SIMIX_storage_create_);
}
if (!simix_timers) {
#ifdef HAVE_MC
// The communication initialization is done ASAP.
// 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();
- MC_client_handle_messages();
- }
- }
+ MC_client_init();
#endif
if (_sg_cfg_exit_asap)
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;
+ 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(" ");
}
}
/* Wake up all processes waiting for a Surf action to finish */
- xbt_dynar_foreach(model_list, iter, model) {
+ xbt_dynar_foreach(all_existing_models, iter, model) {
XBT_DEBUG("Handling process whose action failed");
while ((action = surf_model_extract_failed_action_set(model))) {
XBT_DEBUG(" Handling Action %p",action);
// (i.e. provide dispatchers that read and expand the args)
timer = xbt_heap_pop(simix_timers);
if (timer->func)
- ((void (*)(void*))timer->func)(timer->args);
+ 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) {
+ xbt_dynar_foreach(all_existing_models, iter, model) {
XBT_DEBUG("Handling process whose action failed");
while ((action = surf_model_extract_failed_action_set(model))) {
XBT_DEBUG(" Handling Action %p",action);
* \param arg Parameters of the function
*
*/
-XBT_INLINE smx_timer_t SIMIX_timer_set(double date, void *function, void *arg)
+XBT_INLINE smx_timer_t SIMIX_timer_set(double date, void (*function)(void*), void *arg)
{
smx_timer_t timer = xbt_new0(s_smx_timer_t, 1);
*
* \param function Kill process function
*/
-XBT_INLINE void SIMIX_function_register_process_kill(void_pfn_smxprocess_t_smxprocess_t
+XBT_INLINE void SIMIX_function_register_process_kill(void_pfn_smxprocess_t
function)
{
simix_global->kill_process_function = function;
break;
}
XBT_INFO("Process %lu (%s@%s): waiting for %s synchro %p (%s) in state %d to finish",
- process->pid, process->name, sg_host_name(process->host),
+ process->pid, process->name, sg_host_get_name(process->host),
synchro_description, process->waiting_synchro,
process->waiting_synchro->name, (int)process->waiting_synchro->state);
}
else {
- XBT_INFO("Process %lu (%s@%s)", process->pid, process->name, sg_host_name(process->host));
+ XBT_INFO("Process %lu (%s@%s)", process->pid, process->name, sg_host_get_name(process->host));
}
}
}