Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix the detection of the raw_heap when snapshoting
[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 raw_heap and the stack */
48   for (i = 0; i < maps->mapsize; i++) {
49     reg = maps->regions[i];
50     if((reg.prot & PROT_WRITE) && reg.start_addr != raw_heap
51        && (reg.pathname == NULL || strncmp(reg.pathname, "[stack]", 7))){
52       MC_snapshot_add_region(snapshot, reg.start_addr,
53                              (char*)reg.end_addr - (char*)reg.start_addr);
54     }
55   }
56 }
57
58 void MC_restore_snapshot(mc_snapshot_t snapshot)
59 {
60   unsigned int i;
61   for(i=0; i < snapshot->num_reg; i++)
62     MC_region_restore(snapshot->regions[i]);
63 }
64
65 void MC_free_snapshot(mc_snapshot_t snapshot)
66 {
67   unsigned int i;
68   for(i=0; i < snapshot->num_reg; i++)
69     MC_region_destroy(snapshot->regions[i]);
70
71   xbt_free(snapshot);
72 }