xref: /plan9/sys/src/cmd/gs/src/gsgc.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
13ff48bf5SDavid du Colombier /* Copyright (C) 1996, 1999, 2001 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gsgc.h,v 1.6 2002/06/16 08:45:42 lpd Exp $ */
187dd7cddfSDavid du Colombier /* Library-level interface to garbage collector */
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier /*
217dd7cddfSDavid du Colombier  * This API is not strictly at the library level, since it references
227dd7cddfSDavid du Colombier  * gs_ref_memory_t and the 4 PostScript memory spaces; however, the former
237dd7cddfSDavid du Colombier  * concept already leaks into the library's standard allocator, and the
247dd7cddfSDavid du Colombier  * latter is relatively small and harmless.
257dd7cddfSDavid du Colombier  */
267dd7cddfSDavid du Colombier 
277dd7cddfSDavid du Colombier #ifndef gsgc_INCLUDED
287dd7cddfSDavid du Colombier #  define gsgc_INCLUDED
297dd7cddfSDavid du Colombier 
307dd7cddfSDavid du Colombier /*
317dd7cddfSDavid du Colombier  * Define the VM space numbers, in increasing order of dynamism.  Pointers
327dd7cddfSDavid du Colombier  * from a higher-numbered space to the same or a lower-numbered space are
337dd7cddfSDavid du Colombier  * always allowed, but not vice versa.  Foreign space (the most static) is
347dd7cddfSDavid du Colombier  * internal, the rest are visible to the programmer; the index of foreign
357dd7cddfSDavid du Colombier  * space must be 0, so that we don't have to set any space bits in scalar
367dd7cddfSDavid du Colombier  * refs (PostScript objects).
377dd7cddfSDavid du Colombier  */
387dd7cddfSDavid du Colombier typedef enum {
397dd7cddfSDavid du Colombier     i_vm_foreign = 0,		/* must be 0 */
407dd7cddfSDavid du Colombier     i_vm_system,
417dd7cddfSDavid du Colombier     i_vm_global,
427dd7cddfSDavid du Colombier     i_vm_local,
437dd7cddfSDavid du Colombier     i_vm_max = i_vm_local
447dd7cddfSDavid du Colombier } i_vm_space;
457dd7cddfSDavid du Colombier 
463ff48bf5SDavid du Colombier /*
473ff48bf5SDavid du Colombier  * Define an array of allocators indexed by space.  Note that the first
483ff48bf5SDavid du Colombier  * ("foreign") element of this array is always 0: foreign pointers, by
493ff48bf5SDavid du Colombier  * definition, point to objects that are not managed by a Ghostscript
503ff48bf5SDavid du Colombier  * allocator (typically, static const objects, or objects allocated with
513ff48bf5SDavid du Colombier  * malloc by some piece of code other than Ghostscript).
523ff48bf5SDavid du Colombier  */
537dd7cddfSDavid du Colombier #ifndef gs_ref_memory_DEFINED
547dd7cddfSDavid du Colombier #  define gs_ref_memory_DEFINED
557dd7cddfSDavid du Colombier typedef struct gs_ref_memory_s gs_ref_memory_t;
567dd7cddfSDavid du Colombier #endif
577dd7cddfSDavid du Colombier /*
587dd7cddfSDavid du Colombier  * r_space_bits is only defined in PostScript interpreters, but if it is
597dd7cddfSDavid du Colombier  * defined, we want to make sure it's 2.
607dd7cddfSDavid du Colombier  */
617dd7cddfSDavid du Colombier #ifdef r_space_bits
627dd7cddfSDavid du Colombier #  if r_space_bits != 2
637dd7cddfSDavid du Colombier Error_r_space_bits_is_not_2;
647dd7cddfSDavid du Colombier #  endif
657dd7cddfSDavid du Colombier #endif
667dd7cddfSDavid du Colombier typedef struct vm_spaces_s vm_spaces;
677dd7cddfSDavid du Colombier /*
687dd7cddfSDavid du Colombier  * The garbage collection procedure is named vm_reclaim so as not to
697dd7cddfSDavid du Colombier  * collide with the reclaim member of gs_dual_memory_t.
707dd7cddfSDavid du Colombier  */
717dd7cddfSDavid du Colombier #define vm_reclaim_proc(proc)\
72*593dc095SDavid du Colombier   void proc(vm_spaces *pspaces, bool global)
737dd7cddfSDavid du Colombier struct vm_spaces_s {
747dd7cddfSDavid du Colombier     vm_reclaim_proc((*vm_reclaim));
757dd7cddfSDavid du Colombier     union {
767dd7cddfSDavid du Colombier 	gs_ref_memory_t *indexed[4 /*1 << r_space_bits */ ];
777dd7cddfSDavid du Colombier 	struct _ssn {
787dd7cddfSDavid du Colombier 	    gs_ref_memory_t *foreign;
797dd7cddfSDavid du Colombier 	    gs_ref_memory_t *system;
807dd7cddfSDavid du Colombier 	    gs_ref_memory_t *global;
817dd7cddfSDavid du Colombier 	    gs_ref_memory_t *local;
827dd7cddfSDavid du Colombier 	} named;
837dd7cddfSDavid du Colombier     } memories;
847dd7cddfSDavid du Colombier };
857dd7cddfSDavid du Colombier 
867dd7cddfSDavid du Colombier /*
877dd7cddfSDavid du Colombier  * By convention, the vm_spaces member of structures, and local variables
887dd7cddfSDavid du Colombier  * of type vm_spaces, are named spaces.
897dd7cddfSDavid du Colombier  */
907dd7cddfSDavid du Colombier #define space_foreign spaces.memories.named.foreign
917dd7cddfSDavid du Colombier #define space_system spaces.memories.named.system
927dd7cddfSDavid du Colombier #define space_global spaces.memories.named.global
937dd7cddfSDavid du Colombier #define space_local spaces.memories.named.local
947dd7cddfSDavid du Colombier #define spaces_indexed spaces.memories.indexed
957dd7cddfSDavid du Colombier 
967dd7cddfSDavid du Colombier /*
977dd7cddfSDavid du Colombier  * Define the top-level entry to the garbage collectors.
987dd7cddfSDavid du Colombier  */
997dd7cddfSDavid du Colombier #define GS_RECLAIM(pspaces, global) ((pspaces)->vm_reclaim(pspaces, global))
1007dd7cddfSDavid du Colombier /* Backward compatibility */
1017dd7cddfSDavid du Colombier #define gs_reclaim(pspaces, global) GS_RECLAIM(pspaces, global)
1027dd7cddfSDavid du Colombier 
1037dd7cddfSDavid du Colombier #endif /* gsgc_INCLUDED */
104