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: ialloc.h 9043 2008-08-28 22:48:19Z giles $ */
15 /* Interface to Ghostscript interpreter memory allocator */
16 
17 #ifndef ialloc_INCLUDED
18 #  define ialloc_INCLUDED
19 
20 #include "imemory.h"
21 
22 /*
23  * Define the interpreter memory manager instance.
24  */
25 #define gs_imemory (i_ctx_p->memory)
26 #define idmemory (&gs_imemory)
27 #define iimemory (gs_imemory.current)
28 #define imemory ((gs_memory_t *)iimemory)
29 #define iimemory_local (gs_imemory.space_local)
30 #define imemory_local ((gs_memory_t *)iimemory_local)
31 #define iimemory_global (gs_imemory.space_global)
32 #define imemory_global ((gs_memory_t *)iimemory_global)
33 #define iimemory_system (gs_imemory.space_system)
34 #define imemory_system ((gs_memory_t *)iimemory_system)
35 
36 /*
37  * Aliases for invoking the standard allocator interface.
38  */
39 #define ialloc_bytes(nbytes, cname)\
40   gs_alloc_bytes(imemory, nbytes, cname)
41 #define ialloc_struct(typ, pstype, cname)\
42   gs_alloc_struct(imemory, typ, pstype, cname)
43 #define ialloc_byte_array(nelts, esize, cname)\
44   gs_alloc_byte_array(imemory, nelts, esize, cname)
45 #define ialloc_struct_array(nelts, typ, pstype, cname)\
46   gs_alloc_struct_array(imemory, nelts, typ, pstype, cname)
47 #define ifree_object(data, cname)\
48   gs_free_object(imemory, data, cname)
49 #define ifree_const_object(data, cname)\
50   gs_free_const_object(imemory, data, cname)
51 #define ialloc_string(nbytes, cname)\
52   gs_alloc_string(imemory, nbytes, cname)
53 #define iresize_string(data, oldn, newn, cname)\
54   gs_resize_string(imemory, data, oldn, newn, cname)
55 #define ifree_string(data, nbytes, cname)\
56   gs_free_string(imemory, data, nbytes, cname)
57 #define ifree_const_string(data, nbytes, cname)\
58   gs_free_const_string(imemory, data, nbytes, cname)
59 
60 /* Initialize the interpreter's allocator. */
61 int ialloc_init(gs_dual_memory_t *, gs_memory_t *, uint, bool);
62 
63 /* ------ Internal routines ------ */
64 
65 /* Reset the request values that identify the cause of a GC. */
66 void ialloc_reset_requested(gs_dual_memory_t *);
67 
68 /* Validate the contents of memory. */
69 void ialloc_validate_spaces(const gs_dual_memory_t *);
70 
71 #define ivalidate_spaces() ialloc_validate_spaces(idmemory)
72 
73 /*
74  * Local/global VM management.
75  */
76 
77 /* Get the space attribute of the current allocator. */
78 #define ialloc_space(dmem) ((dmem)->current_space)
79 #define icurrent_space ialloc_space(idmemory)
80 uint imemory_space(const gs_ref_memory_t *);
81 
82 /* Select the allocation space. */
83 void ialloc_set_space(gs_dual_memory_t *, uint);
84 
85 /* Get the l_new attribute of an allocator. */
86 uint imemory_new_mask(const gs_ref_memory_t *);
87 
88 /* Get the save level of an allocator. */
89 int imemory_save_level(const gs_ref_memory_t *);
90 
91 /*
92  * Ref-related facilities.
93  */
94 
95 #ifdef r_type			/* i.e., we know about refs */
96 
97 /* Allocate and free ref arrays. */
98 #define ialloc_ref_array(paref, attrs, nrefs, cname)\
99   gs_alloc_ref_array(iimemory, paref, attrs, nrefs, cname)
100 #define iresize_ref_array(paref, nrefs, cname)\
101   gs_resize_ref_array(iimemory, paref, nrefs, cname)
102 #define ifree_ref_array(paref, cname)\
103   gs_free_ref_array(iimemory, paref, cname)
104 
105 /* Allocate a string ref. */
106 #define ialloc_string_ref(psref, attrs, nbytes, cname)\
107   gs_alloc_string_ref(iimemory, psref, attrs, nbytes, cname)
108 
109 /* Make a ref for a newly allocated structure. */
110 #define make_istruct(pref,attrs,ptr)\
111   make_struct(pref, (attrs) | icurrent_space, ptr)
112 #define make_istruct_new(pref,attrs,ptr)\
113   make_struct_new(pref, (attrs) | icurrent_space, ptr)
114 #define make_iastruct(pref,attrs,ptr)\
115   make_astruct(pref, (attrs) | icurrent_space, ptr)
116 #define make_iastruct_new(pref,attrs,ptr)\
117   make_astruct_new(pref, (attrs) | icurrent_space, ptr)
118 
119 #endif /* ifdef r_type */
120 
121 #endif /* ialloc_INCLUDED */
122