- size_t offset;
-
- xbt_dynar_foreach(mc_checkpoint_ignore, cursor, region){
- if(region->addr > snapshot->regions[0]->start_addr && (char *)(region->addr) < (char *)snapshot->regions[0]->start_addr + STD_HEAP_SIZE){
- offset = (char *)region->addr - (char *)snapshot->regions[0]->start_addr;
- memset((char *)snapshot->regions[0]->data + offset, 0, region->size);
- }else if(region->addr > snapshot->regions[2]->start_addr && (char *)(region->addr) < (char*)snapshot->regions[2]->start_addr + snapshot->regions[2]->size){
- offset = (char *)region->addr - (char *)snapshot->regions[2]->start_addr;
- memset((char *)snapshot->regions[2]->data + offset, 0, region->size);
- }else if(region->addr > snapshot->regions[1]->start_addr && (char *)(region->addr) < (char*)snapshot->regions[1]->start_addr + snapshot->regions[1]->size){
- offset = (char *)region->addr - (char *)snapshot->regions[1]->start_addr;
- memset((char *)snapshot->regions[1]->data + offset, 0, region->size);
+ xbt_dynar_foreach (mc_checkpoint_ignore, cursor, region) {
+ s_mc_snapshot_ignored_data_t ignored_data;
+ ignored_data.start = region->addr;
+ ignored_data.size = region->size;
+ ignored_data.data = malloc(region->size);
+ memcpy(ignored_data.data, region->addr, region->size);
+ xbt_dynar_push(snapshot->ignored_data, &ignored_data);
+ }
+
+ // Zero the memory:
+ xbt_dynar_foreach (mc_checkpoint_ignore, cursor, region) {
+ memset(region->addr, 0, region->size);
+ }
+
+}
+
+static void MC_snapshot_ignore_restore(mc_snapshot_t snapshot)
+{
+ unsigned int cursor = 0;
+ s_mc_snapshot_ignored_data_t ignored_data;
+ xbt_dynar_foreach (snapshot->ignored_data, cursor, ignored_data) {
+ memcpy(ignored_data.start, ignored_data.data, ignored_data.size);
+ }
+}
+
+/** @brief Can we remove this snapshot?
+ *
+ * Some snapshots cannot be removed (yet) because we need them
+ * at this point.
+ *
+ * @param snapshot
+ */
+int mc_important_snapshot(mc_snapshot_t snapshot)
+{
+ // We need this snapshot in order to know which
+ // pages needs to be stored in the next snapshot.
+ // This field is only non-NULL when using soft-dirty
+ // page tracking.
+ if (snapshot == mc_model_checker->parent_snapshot)
+ return true;
+
+ return false;
+}
+
+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)
+ xbt_die("Unexpected buffer is too small for fd_dir_path");
+
+ DIR* fd_dir = opendir (fd_dir_path);
+ if (fd_dir == NULL)
+ xbt_die("Cannot open directory '/proc/self/fd'\n");
+
+ size_t total_fd = 0;
+ struct dirent* fd_number;
+ while ((fd_number = readdir(fd_dir))) {
+
+ int fd_value = atoi(fd_number->d_name);
+
+ if(fd_value < 3)
+ continue;
+
+ const size_t source_size = 25;
+ char source[25];
+ if (snprintf(source, source_size, "/proc/self/fd/%s", 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;
+ char link[200];
+ size_t res = readlink(source, link, link_size);
+ if (res<0) {
+ xbt_die("Could not read link for %s", source);