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