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