| [1587] | 1 | Index: gs/psi/idosave.h | 
|---|
|  | 2 | =================================================================== | 
|---|
|  | 3 | --- gs/psi/idosave.h    (revision 11306) | 
|---|
|  | 4 | +++ gs/psi/idosave.h    (working copy) | 
|---|
|  | 5 | @@ -18,6 +18,22 @@ | 
|---|
|  | 6 | #  define idosave_INCLUDED | 
|---|
|  | 7 |  | 
|---|
|  | 8 | /* | 
|---|
|  | 9 | + * Structure for saved change chain for save/restore.  Because of the | 
|---|
|  | 10 | + * garbage collector, we need to distinguish the cases where the change | 
|---|
|  | 11 | + * is in a static object, a dynamic ref, or a dynamic struct. | 
|---|
|  | 12 | + */ | 
|---|
|  | 13 | +typedef struct alloc_change_s alloc_change_t; | 
|---|
|  | 14 | +struct alloc_change_s { | 
|---|
|  | 15 | +    alloc_change_t *next; | 
|---|
|  | 16 | +    ref_packed *where; | 
|---|
|  | 17 | +    ref contents; | 
|---|
|  | 18 | +#define AC_OFFSET_STATIC (-2)  /* static object */ | 
|---|
|  | 19 | +#define AC_OFFSET_REF (-1)     /* dynamic ref */ | 
|---|
|  | 20 | +#define AC_OFFSET_ALLOCATED (-3) /* a newly allocated ref array */ | 
|---|
|  | 21 | +    short offset;              /* if >= 0, offset within struct */ | 
|---|
|  | 22 | +}; | 
|---|
|  | 23 | + | 
|---|
|  | 24 | +/* | 
|---|
|  | 25 | * Save a change that must be undone by restore.  We have to pass the | 
|---|
|  | 26 | * pointer to the containing object to alloc_save_change for two reasons: | 
|---|
|  | 27 | * | 
|---|
|  | 28 | @@ -29,6 +45,7 @@ | 
|---|
|  | 29 | * relocate the pointer to it from the change record during garbage | 
|---|
|  | 30 | * collection. | 
|---|
|  | 31 | */ | 
|---|
|  | 32 | + | 
|---|
|  | 33 | int alloc_save_change(gs_dual_memory_t *dmem, const ref *pcont, | 
|---|
|  | 34 | ref_packed *ptr, client_name_t cname); | 
|---|
|  | 35 | int alloc_save_change_in(gs_ref_memory_t *mem, const ref *pcont, | 
|---|
|  | 36 | @@ -36,6 +53,6 @@ | 
|---|
|  | 37 | /* Remove an AC_OFFSET_ALLOCATED element. */ | 
|---|
|  | 38 | void alloc_save_remove(gs_ref_memory_t *mem, ref_packed *obj, client_name_t cname); | 
|---|
|  | 39 | /* Allocate a structure for recording an allocation event. */ | 
|---|
|  | 40 | -int alloc_save_change_alloc(gs_ref_memory_t *mem, client_name_t cname, ref_packed ***ppr); | 
|---|
|  | 41 | +int alloc_save_change_alloc(gs_ref_memory_t *mem, client_name_t cname, alloc_change_t **pcp); | 
|---|
|  | 42 |  | 
|---|
|  | 43 | #endif /* idosave_INCLUDED */ | 
|---|
|  | 44 | Index: gs/psi/isave.c | 
|---|
|  | 45 | =================================================================== | 
|---|
|  | 46 | --- gs/psi/isave.c      (revision 11306) | 
|---|
|  | 47 | +++ gs/psi/isave.c      (working copy) | 
|---|
|  | 48 | @@ -156,22 +156,6 @@ | 
|---|
|  | 49 | /* A link to igcref.c . */ | 
|---|
|  | 50 | ptr_proc_reloc(igc_reloc_ref_ptr_nocheck, ref_packed); | 
|---|
|  | 51 |  | 
|---|
|  | 52 | -/* | 
|---|
|  | 53 | - * Structure for saved change chain for save/restore.  Because of the | 
|---|
|  | 54 | - * garbage collector, we need to distinguish the cases where the change | 
|---|
|  | 55 | - * is in a static object, a dynamic ref, or a dynamic struct. | 
|---|
|  | 56 | - */ | 
|---|
|  | 57 | -typedef struct alloc_change_s alloc_change_t; | 
|---|
|  | 58 | -struct alloc_change_s { | 
|---|
|  | 59 | -    alloc_change_t *next; | 
|---|
|  | 60 | -    ref_packed *where; | 
|---|
|  | 61 | -    ref contents; | 
|---|
|  | 62 | -#define AC_OFFSET_STATIC (-2)  /* static object */ | 
|---|
|  | 63 | -#define AC_OFFSET_REF (-1)     /* dynamic ref */ | 
|---|
|  | 64 | -#define AC_OFFSET_ALLOCATED (-3) /* a newly allocated ref array */ | 
|---|
|  | 65 | -    short offset;              /* if >= 0, offset within struct */ | 
|---|
|  | 66 | -}; | 
|---|
|  | 67 | - | 
|---|
|  | 68 | static | 
|---|
|  | 69 | CLEAR_MARKS_PROC(change_clear_marks) | 
|---|
|  | 70 | { | 
|---|
|  | 71 | @@ -519,7 +503,7 @@ | 
|---|
|  | 72 |  | 
|---|
|  | 73 | /* Allocate a structure for recording an allocation event. */ | 
|---|
|  | 74 | int | 
|---|
|  | 75 | -alloc_save_change_alloc(gs_ref_memory_t *mem, client_name_t cname, ref_packed ***ppr) | 
|---|
|  | 76 | +alloc_save_change_alloc(gs_ref_memory_t *mem, client_name_t cname, alloc_change_t **pcp) | 
|---|
|  | 77 | { | 
|---|
|  | 78 | register alloc_change_t *cp; | 
|---|
|  | 79 |  | 
|---|
|  | 80 | @@ -533,8 +517,7 @@ | 
|---|
|  | 81 | cp->where = 0; | 
|---|
|  | 82 | cp->offset = AC_OFFSET_ALLOCATED; | 
|---|
|  | 83 | make_null(&cp->contents); | 
|---|
|  | 84 | -    mem->changes = cp; | 
|---|
|  | 85 | -    *ppr = &cp->where; | 
|---|
|  | 86 | +    *pcp = cp; | 
|---|
|  | 87 | return 1; | 
|---|
|  | 88 | } | 
|---|
|  | 89 |  | 
|---|
|  | 90 | Index: gs/psi/ialloc.c | 
|---|
|  | 91 | =================================================================== | 
|---|
|  | 92 | --- gs/psi/ialloc.c     (revision 11306) | 
|---|
|  | 93 | +++ gs/psi/ialloc.c     (working copy) | 
|---|
|  | 94 | @@ -185,7 +185,14 @@ | 
|---|
|  | 95 | */ | 
|---|
|  | 96 | chunk_t *pcc = mem->pcc; | 
|---|
|  | 97 | ref *end; | 
|---|
|  | 98 | +       alloc_change_t *cp = 0; | 
|---|
|  | 99 | +        int code = 0; | 
|---|
|  | 100 |  | 
|---|
|  | 101 | +       if ((gs_memory_t *)mem != mem->stable_memory) { | 
|---|
|  | 102 | +           code = alloc_save_change_alloc(mem, "gs_alloc_ref_array", &cp); | 
|---|
|  | 103 | +           if (code < 0) | 
|---|
|  | 104 | +               return code; | 
|---|
|  | 105 | +       } | 
|---|
|  | 106 | obj = gs_alloc_struct_array((gs_memory_t *) mem, num_refs + 1, | 
|---|
|  | 107 | ref, &st_refs, cname); | 
|---|
|  | 108 | if (obj == 0) | 
|---|
|  | 109 | @@ -210,14 +217,10 @@ | 
|---|
|  | 110 | chunk_locate_ptr(obj, &cl); | 
|---|
|  | 111 | cl.cp->has_refs = true; | 
|---|
|  | 112 | } | 
|---|
|  | 113 | -       if ((gs_memory_t *)mem != mem->stable_memory) { | 
|---|
|  | 114 | -           ref_packed **ppr = 0; | 
|---|
|  | 115 | -           int code = alloc_save_change_alloc(mem, "gs_alloc_ref_array", &ppr); | 
|---|
|  | 116 | -           if (code < 0) | 
|---|
|  | 117 | -               return code; | 
|---|
|  | 118 | -            if (ppr) | 
|---|
|  | 119 | -               *ppr = (ref_packed *)obj; | 
|---|
|  | 120 | -       } | 
|---|
|  | 121 | +       if (cp) { | 
|---|
|  | 122 | +            mem->changes = cp; | 
|---|
|  | 123 | +            cp->where = (ref_packed *)obj; | 
|---|
|  | 124 | +        } | 
|---|
|  | 125 | } | 
|---|
|  | 126 | make_array(parr, attrs | mem->space, num_refs, obj); | 
|---|
|  | 127 | return 0; | 
|---|