Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Biggest commit ever (SIMIX2): the user processes can now run in parallel
[simgrid.git] / src / mc / mc_checkpoint.c
1 #include "private.h"
2
3 static mc_mem_region_t MC_region_new(void *start_addr, size_t size);
4 static void MC_region_restore(mc_mem_region_t reg);
5 static void MC_region_destroy(mc_mem_region_t reg);
6
7 static void MC_snapshot_add_region(mc_snapshot_t snapshot, void *start_addr, size_t size);
8
9 static mc_mem_region_t MC_region_new(void *start_addr, size_t size)
10 {
11   mc_mem_region_t new_reg = xbt_new0(s_mc_mem_region_t, 1);
12   new_reg->start_addr = start_addr;
13   new_reg->size = size;
14   new_reg->data = xbt_malloc0(size);
15   memcpy(new_reg->data, start_addr, size);
16   return new_reg;
17 }
18
19 static void MC_region_restore(mc_mem_region_t reg)
20 {
21   /*FIXME: check if start_addr is still mapped, if it is not, then map it
22     before copying the data */
23   memcpy(reg->start_addr, reg->data, reg->size);
24 }
25
26 static void MC_region_destroy(mc_mem_region_t reg)
27 {
28   xbt_free(reg->data);
29   xbt_free(reg);
30 }
31
32 static void MC_snapshot_add_region(mc_snapshot_t snapshot, void *start_addr, size_t size)
33 {
34   mc_mem_region_t new_reg = MC_region_new(start_addr, size);
35   snapshot->regions = xbt_realloc(snapshot->regions, (snapshot->num_reg + 1) * sizeof(mc_mem_region_t));
36   snapshot->regions[snapshot->num_reg] = new_reg;
37   snapshot->num_reg++;
38   return;
39
40
41 void MC_take_snapshot(mc_snapshot_t snapshot)
42 {
43   unsigned int i;
44   s_map_region reg;
45   memory_map_t maps = get_memory_map();
46
47   /* Save all the writable mapped pages except the  and the stack */
48   for (i = 0; i < maps->mapsize; i++) {
49     reg = maps->regions[i];
50     if((reg.prot & PROT_WRITE)
51        && (reg.pathname == NULL
52            || (strncmp(reg.pathname, "/dev/zero", 9)
53                && strncmp(reg.pathname, "[stack]", 7)))){
54       MC_snapshot_add_region(snapshot, reg.start_addr,
55                              (char*)reg.end_addr - (char*)reg.start_addr);
56     }
57   }
58 }
59
60 void MC_restore_snapshot(mc_snapshot_t snapshot)
61 {
62   unsigned int i;
63   for(i=0; i < snapshot->num_reg; i++)
64     MC_region_restore(snapshot->regions[i]);
65 }
66
67 void MC_free_snapshot(mc_snapshot_t snapshot)
68 {
69   unsigned int i;
70   for(i=0; i < snapshot->num_reg; i++)
71     MC_region_destroy(snapshot->regions[i]);
72
73   xbt_free(snapshot);
74 }