1 /* Copyright (C) 2001-2006 Artifex Software, Inc. 2 All Rights Reserved. 3 4 This software is provided AS-IS with no warranty, either express or 5 implied. 6 7 This software is distributed under license and may not be copied, modified 8 or distributed except as expressly authorized under the terms of that 9 license. Refer to licensing information at http://www.artifex.com/ 10 or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, 11 San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. 12 */ 13 14 /* $Id: igc.h 9043 2008-08-28 22:48:19Z giles $ */ 15 /* Internal interfaces in Ghostscript GC */ 16 17 #ifndef igc_INCLUDED 18 # define igc_INCLUDED 19 20 #include "istruct.h" 21 22 /* Declare the vm_reclaim procedure for the real GC. */ 23 extern vm_reclaim_proc(gs_gc_reclaim); 24 25 /* Define the procedures shared among a "genus" of structures. */ 26 /* Currently there are only two genera: refs, and all other structures. */ 27 struct struct_shared_procs_s { 28 29 /* Clear the relocation information in an object. */ 30 31 #define gc_proc_clear_reloc(proc)\ 32 void proc(obj_header_t *pre, uint size) 33 gc_proc_clear_reloc((*clear_reloc)); 34 35 /* Compute any internal relocation for a marked object. */ 36 /* Return true if the object should be kept. */ 37 /* The reloc argument shouldn't be required, */ 38 /* but we need it for ref objects. */ 39 40 #define gc_proc_set_reloc(proc)\ 41 bool proc(obj_header_t *pre, uint reloc, uint size) 42 gc_proc_set_reloc((*set_reloc)); 43 44 /* Compact an object. */ 45 46 #define gc_proc_compact(proc)\ 47 void proc(const gs_memory_t *cmem, obj_header_t *pre, obj_header_t *dpre, uint size) 48 gc_proc_compact((*compact)); 49 50 }; 51 52 /* Define the structure for holding GC state. */ 53 /*typedef struct gc_state_s gc_state_t; *//* in gsstruct.h */ 54 #ifndef name_table_DEFINED 55 # define name_table_DEFINED 56 typedef struct name_table_s name_table; 57 #endif 58 struct gc_state_s { 59 const gc_procs_with_refs_t *procs; /* must be first */ 60 chunk_locator_t loc; 61 vm_spaces spaces; 62 int min_collect; /* avm_space */ 63 bool relocating_untraced; /* if true, we're relocating */ 64 /* pointers from untraced spaces */ 65 gs_memory_t *heap; /* for extending mark stack */ 66 name_table *ntable; /* (implicitly referenced by names) */ 67 #ifdef DEBUG 68 chunk_t *container; 69 #endif 70 }; 71 72 /* Exported by igcref.c for igc.c */ 73 ptr_proc_unmark(ptr_ref_unmark); 74 ptr_proc_mark(ptr_ref_mark); 75 /*ref_packed *gs_reloc_ref_ptr(const ref_packed *, gc_state_t *); */ 76 77 /* Exported by ilocate.c for igc.c */ 78 void ialloc_validate_memory(const gs_ref_memory_t *, gc_state_t *); 79 void ialloc_validate_chunk(const chunk_t *, gc_state_t *); 80 void ialloc_validate_object(const obj_header_t *, const chunk_t *, 81 gc_state_t *); 82 83 /* Exported by igc.c for ilocate.c */ 84 const gs_memory_t * gcst_get_memory_ptr(gc_state_t *gcst); 85 86 /* Macro for returning a relocated pointer */ 87 const void *print_reloc_proc(const void *obj, const char *cname, 88 const void *robj); 89 #ifdef DEBUG 90 # define print_reloc(obj, cname, nobj)\ 91 (gs_debug_c('9') ? print_reloc_proc(obj, cname, nobj) : nobj) 92 #else 93 # define print_reloc(obj, cname, nobj) (nobj) 94 #endif 95 96 #endif /* igc_INCLUDED */ 97