1 #include "checkpoint.h"
3 #include "structdefs.h"
6 #define MALLOCSIZE 20*1024
9 struct malloclist *next;
14 struct malloclist * top=NULL;
17 void * cpmalloc(int size) {
18 int endoffset=offset+size;
19 if (top==NULL||endoffset>top->size) {
20 int basesize=MALLOCSIZE;
21 struct malloclist *tmp;
24 tmp=RUNMALLOC(sizeof(struct malloclist)+basesize);
32 return &top->space[tmpoffset];
37 struct malloclist *next=top->next;
44 void ** makecheckpoint(int numparams, void ** srcpointer, struct RuntimeHash * forward, struct RuntimeHash * reverse) {
46 void **newarray=cpmalloc(sizeof(void *)*numparams);
48 void **newarray=RUNMALLOC(sizeof(void *)*numparams);
50 struct RuntimeHash *todo=allocateRuntimeHash(100);
52 for(i=0;i<numparams;i++) {
53 void * objptr=srcpointer[i];
54 if (RuntimeHashcontainskey(forward, (int) objptr))
55 RuntimeHashget(forward,(int) objptr,(int *) &newarray[i]);
57 void * copy=createcopy(objptr);
58 RuntimeHashadd(forward, (int) objptr, (int)copy);
59 RuntimeHashadd(reverse, (int) copy, (int) objptr);
60 RuntimeHashadd(todo, (int) objptr, (int) objptr);
64 while(RuntimeHashcountset(todo)!=0) {
65 void * ptr=(void *) RuntimeHashfirstkey(todo);
66 int type=((int *)ptr)[0];
67 RuntimeHashremove(todo, (int) ptr, (int) ptr);
70 RuntimeHashget(forward, (int) ptr, (int *) &cpy);
71 int * pointer=pointerarray[type];
73 /* Array of primitives */
75 } else if (((int)pointer)==1) {
76 /* Array of pointers */
77 struct ArrayObject *ao=(struct ArrayObject *) ptr;
78 struct ArrayObject *ao_cpy=(struct ArrayObject *) cpy;
79 int length=ao->___length___;
81 for(i=0;i<length;i++) {
82 void *objptr=((void **)(((char *)& ao->___length___)+sizeof(int)))[i];
84 ((void **)(((char *)& ao->___length___)+sizeof(int)))[i]=NULL;
85 } else if (RuntimeHashcontainskey(forward, (int) objptr))
86 RuntimeHashget(forward,(int) objptr,(int *) &((void **)(((char *)& ao_cpy->___length___)+sizeof(int)))[i]);
88 void * copy=createcopy(objptr);
89 RuntimeHashadd(forward, (int) objptr, (int)copy);
90 RuntimeHashadd(reverse, (int) copy, (int) objptr);
91 RuntimeHashadd(todo, (int) objptr, (int) objptr);
92 ((void **)(((char *)& ao_cpy->___length___)+sizeof(int)))[i]=copy;
98 for(i=1;i<=size;i++) {
99 int offset=pointer[i];
100 void * objptr=*((void **)(((int)ptr)+offset));
102 *((void **) (((int)cpy)+offset))=NULL;
103 } else if (RuntimeHashcontainskey(forward, (int) objptr))
104 RuntimeHashget(forward, (int) objptr, (int *) &(((char *)cpy)[offset]));
106 void * copy=createcopy(objptr);
107 RuntimeHashadd(forward, (int) objptr, (int) copy);
108 RuntimeHashadd(reverse, (int) copy, (int) objptr);
109 RuntimeHashadd(todo, (int) objptr, (int) objptr);
110 *((void **) (((int)cpy)+offset))=copy;
119 void * createcopy(void * orig) {
123 int type=((int *)orig)[0];
124 if (type<NUMCLASSES) {
125 /* We have a normal object */
126 int size=classsize[type];
128 void *newobj=cpmalloc(size);
130 void *newobj=RUNMALLOC(size);
132 memcpy(newobj, orig, size);
135 /* We have an array */
136 struct ArrayObject *ao=(struct ArrayObject *)orig;
137 int elementsize=classsize[type];
138 int length=ao->___length___;
139 int size=sizeof(struct ArrayObject)+length*elementsize;
141 void *newobj=cpmalloc(size);
143 void *newobj=RUNMALLOC(size);
145 memcpy(newobj, orig, size);
151 void restorecheckpoint(int numparams, void ** original, void ** checkpoint, struct RuntimeHash *forward, struct RuntimeHash * reverse) {
152 struct RuntimeHash *todo=allocateRuntimeHash(100);
155 for(i=0;i<numparams;i++) {
156 RuntimeHashadd(todo, (int) checkpoint[i], (int) checkpoint[i]);
159 while(RuntimeHashcountset(todo)!=0) {
160 void * ptr=(void *) RuntimeHashfirstkey(todo);
161 int type=((int *)ptr)[0];
162 RuntimeHashremove(todo, (int) ptr, (int) ptr);
167 RuntimeHashget(reverse, (int) ptr, (int *) &cpy);
168 pointer=pointerarray[type];
169 size=classsize[type];
172 /* Array of primitives */
173 struct ArrayObject *ao=(struct ArrayObject *) ptr;
174 int length=ao->___length___;
175 int cpysize=sizeof(struct ArrayObject)+length*size;
176 memcpy(cpy, ptr, cpysize);
178 } else if ((int)pointer==1) {
179 /* Array of pointers */
180 struct ArrayObject *ao=(struct ArrayObject *) ptr;
181 struct ArrayObject *ao_cpy=(struct ArrayObject *) cpy;
182 int length=ao->___length___;
184 int cpysize=sizeof(struct ArrayObject)+length*size;
185 memcpy(ao_cpy, ao, cpysize);
187 for(i=0;i<length;i++) {
188 void *objptr=((void **)(((char *)& ao->___length___)+sizeof(int)))[i];
190 ((void **)(((char *)& ao_cpy->___length___)+sizeof(int)))[i]=NULL;
192 RuntimeHashget(reverse, (int) objptr, (int *) &((void **)(((char *)& ao_cpy->___length___)+sizeof(int)))[i]);
195 int numptr=pointer[0];
198 if (hasflags[type]) {
199 flagptr=(void *) (((int *)cpy)[2]);
201 memcpy(cpy, ptr, size);
202 for(i=1;i<=numptr;i++) {
203 int offset=pointer[i];
204 void * objptr=*((void **)(((int)ptr)+offset));
206 *((void **) (((int)cpy)+offset))=NULL;
208 RuntimeHashget(reverse, (int) objptr, (int *) &(((char *)cpy)[offset]));
210 if (hasflags[type]) {
211 (((void **)cpy)[2])=flagptr;
212 flagorand(cpy, 1, 0xFFFFFFFF);