1 #include "checkpoint.h"
3 #include "structdefs.h"
9 #define MALLOCSIZE 20*1024
12 struct malloclist *next;
17 struct malloclist * top=NULL;
20 void * cpmalloc(int size) {
21 int endoffset=offset+size;
22 if (top==NULL||endoffset>top->size) {
23 int basesize=MALLOCSIZE;
24 struct malloclist *tmp;
27 tmp=RUNMALLOC(sizeof(struct malloclist)+basesize);
35 return &top->space[tmpoffset];
40 struct malloclist *next=top->next;
47 void ** makecheckpoint(int numparams, void ** srcpointer, struct RuntimeHash * forward, struct RuntimeHash * reverse) {
49 void **newarray=cpmalloc(sizeof(void *)*numparams);
51 void **newarray=RUNMALLOC(sizeof(void *)*numparams);
53 struct RuntimeHash *todo=allocateRuntimeHash(100);
55 for(i=0;i<numparams;i++) {
56 void * objptr=srcpointer[i];
57 if (RuntimeHashcontainskey(forward, (int) objptr))
58 RuntimeHashget(forward,(int) objptr,(int *) &newarray[i]);
60 void * copy=createcopy(objptr);
61 RuntimeHashadd(forward, (int) objptr, (int)copy);
62 RuntimeHashadd(reverse, (int) copy, (int) objptr);
63 RuntimeHashadd(todo, (int) objptr, (int) objptr);
67 while(RuntimeHashcountset(todo)!=0) {
68 void * ptr=(void *) RuntimeHashfirstkey(todo);
69 int type=((int *)ptr)[0];
70 RuntimeHashremove(todo, (int) ptr, (int) ptr);
73 RuntimeHashget(forward, (int) ptr, (int *) &cpy);
74 unsigned int * pointer=pointerarray[type];
77 void *objptr=((struct ___TagDescriptor___*)ptr)->flagptr;
79 void * copy=createcopy(objptr);
80 RuntimeHashadd(forward, (int) objptr, (int) copy);
81 RuntimeHashadd(reverse, (int) copy, (int) objptr);
82 RuntimeHashadd(todo, (int) objptr, (int) objptr);
83 ((struct ___TagDescriptor___*)cpy)->flagptr=copy;
88 /* Array of primitives */
90 } else if (((int)pointer)==1) {
91 /* Array of pointers */
92 struct ArrayObject *ao=(struct ArrayObject *) ptr;
93 struct ArrayObject *ao_cpy=(struct ArrayObject *) cpy;
94 int length=ao->___length___;
96 for(i=0;i<length;i++) {
97 void *objptr=((void **)(((char *)& ao->___length___)+sizeof(int)))[i];
99 ((void **)(((char *)& ao->___length___)+sizeof(int)))[i]=NULL;
100 } else if (RuntimeHashcontainskey(forward, (int) objptr))
101 RuntimeHashget(forward,(int) objptr,(int *) &((void **)(((char *)& ao_cpy->___length___)+sizeof(int)))[i]);
103 void * copy=createcopy(objptr);
104 RuntimeHashadd(forward, (int) objptr, (int)copy);
105 RuntimeHashadd(reverse, (int) copy, (int) objptr);
106 RuntimeHashadd(todo, (int) objptr, (int) objptr);
107 ((void **)(((char *)& ao_cpy->___length___)+sizeof(int)))[i]=copy;
113 for(i=1;i<=size;i++) {
114 int offset=pointer[i];
115 void * objptr=*((void **)(((int)ptr)+offset));
117 *((void **) (((int)cpy)+offset))=NULL;
118 } else if (RuntimeHashcontainskey(forward, (int) objptr))
119 RuntimeHashget(forward, (int) objptr, (int *) &(((char *)cpy)[offset]));
121 void * copy=createcopy(objptr);
122 RuntimeHashadd(forward, (int) objptr, (int) copy);
123 RuntimeHashadd(reverse, (int) copy, (int) objptr);
124 RuntimeHashadd(todo, (int) objptr, (int) objptr);
125 *((void **) (((int)cpy)+offset))=copy;
131 freeRuntimeHash(todo);
135 void * createcopy(void * orig) {
139 int type=((int *)orig)[0];
140 if (type<NUMCLASSES) {
141 /* We have a normal object */
142 int size=classsize[type];
144 void *newobj=cpmalloc(size);
146 void *newobj=RUNMALLOC(size);
148 memcpy(newobj, orig, size);
151 /* We have an array */
152 struct ArrayObject *ao=(struct ArrayObject *)orig;
153 int elementsize=classsize[type];
154 int length=ao->___length___;
155 int size=sizeof(struct ArrayObject)+length*elementsize;
157 void *newobj=cpmalloc(size);
159 void *newobj=RUNMALLOC(size);
161 memcpy(newobj, orig, size);
167 void restorecheckpoint(int numparams, void ** original, void ** checkpoint, struct RuntimeHash *forward, struct RuntimeHash * reverse) {
168 struct RuntimeHash *todo=allocateRuntimeHash(100);
169 struct RuntimeHash *visited=allocateRuntimeHash(100);
172 for(i=0;i<numparams;i++) {
173 if (checkpoint[i]!=NULL) {
174 RuntimeHashadd(todo, (int) checkpoint[i], (int) checkpoint[i]);
175 RuntimeHashadd(visited, (int) checkpoint[i], (int) checkpoint[i]);
179 while(RuntimeHashcountset(todo)!=0) {
180 void * ptr=(void *) RuntimeHashfirstkey(todo);
181 int type=((int *)ptr)[0];
182 RuntimeHashremove(todo, (int) ptr, (int) ptr);
186 unsigned int *pointer;
188 RuntimeHashget(reverse, (int) ptr, (int *) &cpy);
189 pointer=pointerarray[type];
190 size=classsize[type];
193 void *objptr=((struct ___TagDescriptor___*)ptr)->flagptr;
194 memcpy(cpy, ptr, size);
196 if (!RuntimeHashcontainskey(visited, (int) objptr)) {
197 RuntimeHashadd(visited, (int) objptr, (int) objptr);
198 RuntimeHashadd(todo, (int) objptr, (int) objptr);
200 RuntimeHashget(reverse, (int) objptr, (int *) & (((struct ___TagDescriptor___ *)cpy)->flagptr));
205 /* Array of primitives */
206 struct ArrayObject *ao=(struct ArrayObject *) ptr;
207 int length=ao->___length___;
208 int cpysize=sizeof(struct ArrayObject)+length*size;
209 memcpy(cpy, ptr, cpysize);
211 } else if ((int)pointer==1) {
212 /* Array of pointers */
213 struct ArrayObject *ao=(struct ArrayObject *) ptr;
214 struct ArrayObject *ao_cpy=(struct ArrayObject *) cpy;
215 int length=ao->___length___;
217 int cpysize=sizeof(struct ArrayObject)+length*size;
218 memcpy(ao_cpy, ao, cpysize);
220 for(i=0;i<length;i++) {
221 void *objptr=((void **)(((char *)& ao->___length___)+sizeof(int)))[i];
223 ((void **)(((char *)& ao_cpy->___length___)+sizeof(int)))[i]=NULL;
225 if (!RuntimeHashcontainskey(visited, (int) objptr)) {
226 RuntimeHashadd(visited, (int) objptr, (int) objptr);
227 RuntimeHashadd(todo, (int) objptr, (int) objptr);
229 RuntimeHashget(reverse, (int) objptr, (int *) &((void **)(((char *)& ao_cpy->___length___)+sizeof(int)))[i]);
233 int numptr=pointer[0];
236 if (hasflags[type]) {
237 flagptr=(void *) (((int *)cpy)[2]);
239 memcpy(cpy, ptr, size);
240 for(i=1;i<=numptr;i++) {
241 int offset=pointer[i];
242 void * objptr=*((void **)(((int)ptr)+offset));
244 *((void **) (((int)cpy)+offset))=NULL;
246 if (!RuntimeHashcontainskey(visited, (int) objptr)) {
247 RuntimeHashadd(visited, (int) objptr, (int) objptr);
248 RuntimeHashadd(todo, (int) objptr, (int) objptr);
250 RuntimeHashget(reverse, (int) objptr, (int *) &(((char *)cpy)[offset]));
253 if (hasflags[type]) {
254 (((void **)cpy)[2])=flagptr;
255 flagorandinit(cpy, 0, 0xFFFFFFFF);
260 freeRuntimeHash(todo);
261 freeRuntimeHash(visited);