check in checkpoint code
[IRC.git] / Robust / src / Runtime / checkpoint.c
1 #include "checkpoint.h"
2 #include "runtime.h"
3 #include "structdefs.h"
4 #include <string.h>
5
6 void ** makecheckpoint(int numparams, void ** pointerarray, struct SimpleHash * forward, struct SimpleHash * reverse) {
7   void **newarray=RUNMALLOC(sizeof(void *)*numparams);
8   struct SimpleHash *todo=allocateSimpleHash(100);
9   int i;
10   for(i=0;i<numparams;i++) {
11     SimpleHashadd(todo, (int) pointerarray[i], (int) pointerarray[i]);
12   }
13   while(SimpleHashcountset(todo)!=0) {
14     void * ptr=(void *) SimpleHashfirstkey(todo);
15     int type=((int *)ptr)[0];
16     SimpleHashremove(todo, (int) ptr, (int) ptr);
17     {
18       void *cpy;
19       SimpleHashget(forward, (int) ptr, (int *) &cpy);
20       int * pointer=pointerarray[type];
21       if (pointer==0) {
22         /* Array of primitives */
23         /* Do nothing */
24       } else if (((int)pointer)==1) {
25         /* Array of pointers */
26         struct ArrayObject *ao=(struct ArrayObject *) ptr;
27         int length=ao->___length___;
28         int i;
29         for(i=0;i<length;i++) {
30           void *objptr=((void **)(((char *)& ao->___length___)+sizeof(int)))[i];
31           if (SimpleHashcontainskey(forward, (int) objptr))
32             SimpleHashget(forward,(int) objptr,(int *) &((void **)(((char *)& ao->___length___)+sizeof(int)))[i]);
33           else {
34             void * copy=createcopy(objptr);
35             SimpleHashadd(forward, (int) objptr, (int)copy);
36             SimpleHashadd(reverse, (int) copy, (int) objptr);
37             SimpleHashadd(todo, (int) objptr, (int) objptr);
38             ((void **)(((char *)& ao->___length___)+sizeof(int)))[i]=copy;
39           }
40         }
41       } else {
42         int size=pointer[0];
43         int i;
44         for(i=1;i<=size;i++) {
45           int offset=pointer[i];
46           void * objptr=*((void **)(((int)ptr)+offset));
47           if (SimpleHashcontainskey(forward, (int) objptr))
48             SimpleHashget(forward, (int) objptr, (int *) &(((char *)cpy)[offset]));
49           else {
50             void * copy=createcopy(objptr);
51             SimpleHashadd(forward, (int) objptr, (int) copy);
52             SimpleHashadd(reverse, (int) copy, (int) objptr);
53             SimpleHashadd(todo, (int) objptr, (int) objptr);
54             *((void **) ((int)cpy)+offset)=copy;
55           }
56         }
57       }
58     }
59   }
60 }
61
62 void * createcopy(void * orig) {
63   int type=((int *)orig)[0];
64   if (type<NUMCLASSES) {
65     /* We have a normal object */
66     int size=classsize[type];
67     void *newobj=RUNMALLOC(size);
68     memcpy(newobj, orig, size);
69     return newobj;
70   } else {
71     /* We have an array */
72     struct ArrayObject *ao=(struct ArrayObject *)orig;
73     int elementsize=classsize[type];
74     int length=ao->___length___;
75     int size=sizeof(struct ArrayObject)+length*elementsize;
76     void *newobj=RUNMALLOC(size);
77     memcpy(newobj, orig, size);
78     return newobj;
79   }
80 }
81
82 void restorecheckpoint(int numparams, void ** original, void ** checkpoint, struct SimpleHash *forward, struct SimpleHash * reverse) {
83   struct SimpleHash *todo=allocateSimpleHash(100);
84   int i;
85
86   for(i=0;i<numparams;i++) {
87     SimpleHashadd(todo, (int) checkpoint[i], (int) checkpoint[i]);
88   }
89
90   while(SimpleHashcountset(todo)!=0) {
91     void * ptr=(void *) SimpleHashfirstkey(todo);
92     int type=((int *)ptr)[0];
93     SimpleHashremove(todo, (int) ptr, (int) ptr);
94     {
95       void *cpy;
96       SimpleHashget(reverse, (int) ptr, (int *) &cpy);
97       int * pointer=pointerarray[type];
98       if (pointer==0) {
99         /* Array of primitives */
100         /* Do nothing */
101       } else if ((int)pointer==1) {
102         /* Array of pointers */
103         struct ArrayObject *ao=(struct ArrayObject *) ptr;
104         int length=ao->___length___;
105         int i;
106         for(i=0;i<length;i++) {
107           void *objptr=((void **)(((char *)& ao->___length___)+sizeof(int)))[i];
108           SimpleHashget(reverse, (int) objptr, (int *) &((void **)(((char *)& ao->___length___)+sizeof(int)))[i]);
109         }
110       } else {
111         int size=pointer[0];
112         int i;
113         for(i=1;i<=size;i++) {
114           int offset=pointer[i];
115           void * objptr=*((void **)(((int)ptr)+offset));
116           SimpleHashget(reverse, (int) objptr, (int *) &(((char *)cpy)[offset]));
117         }
118       }
119     }
120   }
121 }
122
123