+/** @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) 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);
+ 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/%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;
+ char link[200];
+ int res = readlink(source, link, link_size);
+ if (res<0) {
+ xbt_die("Could not read link for %s", source);
+ }
+ if (res==200) {
+ xbt_die("Buffer to small for link of %s", source);
+ }
+ link[res] = '\0';
+
+ if(smpi_is_privatisation_file(link))
+ continue;
+
+ // This is (probably) the DIR* we are reading:
+ // TODO, read all the file entries at once and close the DIR.*
+ if(strcmp(fd_dir_path, link) == 0)
+ continue;