bug fixes checked in
[IRC.git] / Robust / src / Runtime / checkpoint.c
index f77a551d090f63f8c9af9aa95a20633eb6019966..64373652fac82c3c5820ad274d0ac8ecd8eb3cd4 100644 (file)
@@ -71,7 +71,19 @@ void ** makecheckpoint(int numparams, void ** srcpointer, struct RuntimeHash * f
     {
       void *cpy;
       RuntimeHashget(forward, (int) ptr, (int *) &cpy);
-      int * pointer=pointerarray[type];
+      unsigned int * pointer=pointerarray[type];
+#ifdef TASK
+      if (type==TAGTYPE) {
+       void *objptr=((struct ___TagDescriptor___*)ptr)->flagptr;
+       if (objptr!=NULL) {
+         void * copy=createcopy(objptr);
+         RuntimeHashadd(forward, (int) objptr, (int) copy);
+         RuntimeHashadd(reverse, (int) copy, (int) objptr);
+         RuntimeHashadd(todo, (int) objptr, (int) objptr);
+         ((struct ___TagDescriptor___*)cpy)->flagptr=copy;
+       }
+      } else
+#endif
       if (pointer==0) {
        /* Array of primitives */
        /* Do nothing */
@@ -171,12 +183,24 @@ void restorecheckpoint(int numparams, void ** original, void ** checkpoint, stru
 
     {
       void *cpy;
-      int *pointer;
+      unsigned int *pointer;
       int size;
       RuntimeHashget(reverse, (int) ptr, (int *) &cpy);
       pointer=pointerarray[type];
       size=classsize[type];
-
+#ifdef TASK
+      if (type==TAGTYPE) {
+       void *objptr=((struct ___TagDescriptor___*)ptr)->flagptr;
+       memcpy(cpy, ptr, size);
+       if (objptr!=NULL) {
+         if (!RuntimeHashcontainskey(visited, (int) objptr)) {
+           RuntimeHashadd(visited, (int) objptr, (int) objptr);
+           RuntimeHashadd(todo, (int) objptr, (int) objptr);
+         }
+         RuntimeHashget(reverse, (int) objptr, (int *) & (((struct ___TagDescriptor___ *)cpy)->flagptr));
+       }
+      } else
+#endif
       if (pointer==0) {
        /* Array of primitives */
        struct ArrayObject *ao=(struct ArrayObject *) ptr;