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