}
}
+// FIXME, multiple privatisation regions
+// FIXME, cross-process
static inline
void* MC_privatization_address(mc_process_t process, int process_index)
{
#ifdef HAVE_SMPI
if (smpi_privatize_global_variables && smpi_process_count()) {
+ // FIXME, cross-process
snapshot->privatization_index = smpi_loaded_page;
} else
#endif
/** \brief Fills the position of the segments (executable, read-only, read/write).
*
- * TODO, use dl_iterate_phdr to be more robust
+ * `dl_iterate_phdr` would be more robust but would not work in cross-process.
* */
void MC_find_object_address(memory_map_t maps, mc_object_info_t result)
{
continue;
int region_type;
+ // FIXME, get rid of `region_type`
if ((long) stack_frame->ip > (long) process->libsimgrid_info->start_exec)
region_type = 1;
else
new_var->address = current_variable->address;
} else if (current_variable->locations.size != 0) {
s_mc_location_t location;
+ // FIXME, cross-process support
mc_dwarf_resolve_locations(&location, ¤t_variable->locations,
current_variable->object_info,
&(stack_frame->unw_cursor),
unw_cursor_t c;
// TODO, check condition check (unw_init_local==0 means end of frame)
+ // FIXME, cross-process support
if (unw_init_local(&c, (unw_context_t *) stack_context) != 0) {
xbt_die("Could not initialize stack unwinding");
unsigned int cursor = 0;
stack_region_t current_stack;
+ // FIXME, cross-process support (stack_areas)
xbt_dynar_foreach(stacks_areas, cursor, current_stack) {
mc_snapshot_stack_t st = xbt_new(s_mc_snapshot_stack_t, 1);
st->stack_frames = MC_unwind_stack_frames(current_stack->context);
}
+// FIXME, cross-process support (mc_heap_comparison_ignore)
static xbt_dynar_t MC_take_snapshot_ignore()
{
// Copy the memory:
unsigned int cursor = 0;
mc_checkpoint_ignore_region_t region;
+ // FIXME, cross-process support (mc_checkpoint_ignore)
xbt_dynar_foreach (mc_checkpoint_ignore, cursor, region) {
s_mc_snapshot_ignored_data_t ignored_data;
ignored_data.start = region->addr;
return false;
}
-static void MC_get_current_fd(mc_snapshot_t snapshot){
+static void MC_get_current_fd(mc_snapshot_t snapshot)
+{
snapshot->total_fd = 0;
const size_t fd_dir_path_size = 20;
char fd_dir_path[fd_dir_path_size];
if (snprintf(fd_dir_path, fd_dir_path_size,
- "/proc/%lli/fd", (long long int) getpid()) > fd_dir_path_size)
+ "/proc/%lli/fd", (long long int) snapshot->process->pid) > fd_dir_path_size)
xbt_die("Unexpected buffer is too small for fd_dir_path");
- DIR* fd_dir = opendir (fd_dir_path);
+ DIR* fd_dir = opendir(fd_dir_path);
if (fd_dir == NULL)
xbt_die("Cannot open directory '/proc/self/fd'\n");
const size_t source_size = 25;
char source[25];
- if (snprintf(source, source_size, "/proc/self/fd/%s", fd_number->d_name) > source_size)
+ if (snprintf(source, source_size, "/proc/%lli/fd/%s",
+ (long long int) snapshot->process->pid, fd_number->d_name) > source_size)
xbt_die("Unexpected buffer is too small for fd %s", fd_number->d_name);
const size_t link_size = 200;
snapshot->enabled_processes = xbt_dynar_new(sizeof(int), NULL);
smx_process_t process;
+ // FIXME, cross-process support (simix_global->process_list)
xbt_swag_foreach(process, simix_global->process_list) {
xbt_dynar_push_as(snapshot->enabled_processes, int, (int)process->pid);
}
#endif
}
+// FIXME, cross-process support ~ we need to implement this on the app side
+// or use some form of [remote syscall execution](http://criu.org/Remote_syscall_execution)
+// based on [parasite code execution](http://criu.org/Parasite_code).
static inline
void MC_restore_snapshot_fds(mc_snapshot_t snapshot)
{
/***********************************************************************/
+// FIXME, cross-process support? (or make this it is used on the app-side)
void MC_ignore_heap(void *address, size_t size)
{
if(!std_heap)
}
+// FIXME, cross-process support?
void MC_ignore_global_variable(const char *name)
{
mc_process_t process = &mc_model_checker->process;
* \param subprogram (possibly inlined) Subprogram of the scope
* \param scope Current scope
*/
+ // FIXME, cross-process support (messaging?)
static void mc_ignore_local_variable_in_scope(const char *var_name,
const char *subprogram_name,
dw_frame_t subprogram,
{
// Processing of direct variables:
- // If the current subprogram matche the given name:
+ // If the current subprogram matches the given name:
if (!subprogram_name ||
(subprogram->name && strcmp(subprogram_name, subprogram->name) == 0)) {
/** @brief Register a stack in the model checker
*
* The stacks are allocated in the heap. The MC handle them especially
- * when we analyse/compare the content of theap so it must be told where
+ * when we analyse/compare the content of the heap so it must be told where
* they are with this function.
*
* @param stack
MC_SET_MC_HEAP;
+ // FIXME, cross-process support
if (mc_checkpoint_ignore == NULL)
mc_checkpoint_ignore =
xbt_dynar_new(sizeof(mc_checkpoint_ignore_region_t),