/* 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 "mc_base.h"
+
+#ifndef _XBT_WIN32
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <libgen.h>
-
-#define UNW_LOCAL_ONLY
-#include <libunwind.h>
+#endif
#include "simgrid/sg_config.h"
#include "../surf/surf_private.h"
#include "../simix/smx_private.h"
-#include "../xbt/mmalloc/mmprivate.h"
#include "xbt/fifo.h"
-#include "mc_private.h"
-#include "mc_record.h"
#include "xbt/automaton.h"
#include "xbt/dict.h"
+#ifdef HAVE_MC
+#define UNW_LOCAL_ONLY
+#include <libunwind.h>
+
+#include "../xbt/mmalloc/mmprivate.h"
+#include "mc_object_info.h"
+#include "mc_comm_pattern.h"
+#include "mc_request.h"
+#include "mc_safety.h"
+#include "mc_memory_map.h"
+#include "mc_snapshot.h"
+#include "mc_liveness.h"
+#include "mc_private.h"
+#endif
+#include "mc_record.h"
+
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_global, mc,
"Logging specific to MC (global)");
+double *mc_time = NULL;
+
+#ifdef HAVE_MC
int user_max_depth_reached = 0;
/* MC global data structures */
mc_state_t mc_current_state = NULL;
char mc_replay_mode = FALSE;
-double *mc_time = NULL;
+
__thread mc_comparison_times_t mc_comp_times = NULL;
__thread double mc_snapshot_comparison_time;
mc_stats_t mc_stats = NULL;
/* Ignore local variable about time used for tracing */
MC_ignore_local_variable("start_time", "*");
+ /* Main MC state: */
MC_ignore_global_variable("mc_model_checker");
+ MC_ignore_global_variable("communications_pattern");
+ MC_ignore_global_variable("initial_communications_pattern");
+ MC_ignore_global_variable("incomplete_communications_pattern");
- // Mot of those things could be moved into mc_model_checker:
- MC_ignore_global_variable("compared_pointers");
+ /* MC __thread variables: */
+ MC_ignore_global_variable("mc_diff_info");
MC_ignore_global_variable("mc_comp_times");
MC_ignore_global_variable("mc_snapshot_comparison_time");
+
+ /* This MC state is used in MC replay as well: */
MC_ignore_global_variable("mc_time");
- MC_ignore_global_variable("smpi_current_rank");
- MC_ignore_global_variable("counter"); /* Static variable used for tracing */
- MC_ignore_global_variable("maestro_stack_start");
- MC_ignore_global_variable("maestro_stack_end");
+
+ /* Static variable used for tracing */
+ MC_ignore_global_variable("counter");
+
+ /* SIMIX */
MC_ignore_global_variable("smx_total_comms");
- MC_ignore_global_variable("communications_pattern");
- MC_ignore_global_variable("initial_communications_pattern");
- MC_ignore_global_variable("incomplete_communications_pattern");
- MC_ignore_global_variable("mc_diff_info");
MC_ignore_heap(mc_time, simix_process_maxpid * sizeof(double));
user_max_depth_reached = 1;
}
-void MC_process_clock_add(smx_process_t process, double amount)
-{
- mc_time[process->pid] += amount;
-}
-
-double MC_process_clock_get(smx_process_t process)
-{
- if (mc_time) {
- if (process != NULL)
- return mc_time[process->pid];
- else
- return -1;
- } else {
- return 0;
- }
-}
-
void MC_automaton_load(const char *file)
{
if (raw_mem_set)
MC_SET_MC_HEAP;
}
+#endif
+
+double MC_process_clock_get(smx_process_t process)
+{
+ if (mc_time) {
+ if (process != NULL)
+ return mc_time[process->pid];
+ else
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+void MC_process_clock_add(smx_process_t process, double amount)
+{
+ mc_time[process->pid] += amount;
+}