summaryrefslogtreecommitdiff
path: root/gs/src/imemory.h
diff options
context:
space:
mode:
Diffstat (limited to 'gs/src/imemory.h')
-rw-r--r--gs/src/imemory.h100
1 files changed, 100 insertions, 0 deletions
diff --git a/gs/src/imemory.h b/gs/src/imemory.h
new file mode 100644
index 000000000..c3ee19053
--- /dev/null
+++ b/gs/src/imemory.h
@@ -0,0 +1,100 @@
+/* Copyright (C) 1993, 1994 Aladdin Enterprises. All rights reserved.
+
+ This file is part of Aladdin Ghostscript.
+
+ Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND. No author
+ or distributor accepts any responsibility for the consequences of using it,
+ or for whether it serves any particular purpose or works at all, unless he
+ or she says so in writing. Refer to the Aladdin Ghostscript Free Public
+ License (the "License") for full details.
+
+ Every copy of Aladdin Ghostscript must include a copy of the License,
+ normally in a plain ASCII text file named PUBLIC. The License grants you
+ the right to copy, modify and redistribute Aladdin Ghostscript, but only
+ under certain conditions described in the License. Among other things, the
+ License requires that the copyright notice and this notice be preserved on
+ all copies.
+*/
+
+/* imemory.h */
+/* Ghostscript memory allocator extensions for interpreter level */
+
+#ifndef imemory_INCLUDED
+# define imemory_INCLUDED
+
+#include "ivmspace.h"
+
+/*
+ * The interpreter level of Ghostscript defines a "subclass" extension
+ * of the allocator interface in gsmemory.h, by adding the ability to
+ * allocate and free arrays of refs, and by adding the distinction
+ * between local, global, and system allocation.
+ */
+
+#ifndef gs_ref_memory_DEFINED
+# define gs_ref_memory_DEFINED
+typedef struct gs_ref_memory_s gs_ref_memory_t;
+#endif
+
+#include "gsalloc.h"
+
+ /* Allocate a ref array. */
+
+int gs_alloc_ref_array(P5(gs_ref_memory_t *mem, ref *paref,
+ uint attrs, uint num_refs, client_name_t cname));
+
+ /* Resize a ref array. */
+ /* Currently this is only implemented for shrinking, */
+ /* not growing. */
+
+int gs_resize_ref_array(P4(gs_ref_memory_t *mem, ref *paref,
+ uint new_num_refs, client_name_t cname));
+
+ /* Free a ref array. */
+
+void gs_free_ref_array(P3(gs_ref_memory_t *mem, ref *paref,
+ client_name_t cname));
+
+ /* Allocate a string ref. */
+
+int gs_alloc_string_ref(P5(gs_ref_memory_t *mem, ref *psref,
+ uint attrs, uint nbytes, client_name_t cname));
+
+/*
+ * Define the pointer type for refs. Note that if a structure contains refs,
+ * both its clear_marks and its reloc_ptrs procedure must unmark them,
+ * since the GC will never see the refs during the unmarking sweep.
+ */
+extern const gs_ptr_procs_t ptr_ref_procs;
+#define ptr_ref_type (&ptr_ref_procs)
+
+/* Register a ref root. */
+/* Note that ref roots are a little peculiar: they assume that */
+/* the ref * that they point to points to a *statically* allocated ref. */
+#define gs_register_ref_root(mem, root, rp, cname)\
+ gs_register_root(mem, root, ptr_ref_type, rp, cname)
+
+/*
+ * The interpreter allocator can allocate in either local or global VM,
+ * and can switch between the two dynamically. In Level 1 configurations,
+ * global VM is the same as local; however, this is *not* currently true in
+ * a Level 2 system running in Level 1 mode. In addition, there is a third
+ * VM space, system VM, that exists in both modes and is used for objects
+ * that must not be affected by even the outermost save/restore (stack
+ * segments and names).
+ */
+typedef struct gs_dual_memory_s gs_dual_memory_t;
+struct gs_dual_memory_s {
+ gs_ref_memory_t *current; /* = ...global or ...local */
+ vm_spaces spaces; /* system, global, local */
+ uint current_space; /* = current->space */
+ /* Save/restore machinery */
+ int save_level;
+ /* Garbage collection hook */
+ int (*reclaim)(P2(gs_dual_memory_t *, int));
+ /* Masks for store checking, see isave.h. */
+ uint test_mask;
+ uint new_mask;
+};
+
+#endif /* imemory_INCLUDED */