summaryrefslogtreecommitdiff
path: root/gs/src/icontext.c
diff options
context:
space:
mode:
Diffstat (limited to 'gs/src/icontext.c')
-rw-r--r--gs/src/icontext.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/gs/src/icontext.c b/gs/src/icontext.c
new file mode 100644
index 000000000..97da9777d
--- /dev/null
+++ b/gs/src/icontext.c
@@ -0,0 +1,117 @@
+/* Copyright (C) 1997 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.
+*/
+
+/* icontext.c */
+/* Context state operations */
+#include "ghost.h"
+#include "gsstruct.h" /* for gxalloc.h */
+#include "gxalloc.h"
+#include "errors.h"
+#include "igstate.h"
+#include "icontext.h"
+#include "interp.h"
+#include "dstack.h"
+#include "estack.h"
+#include "ostack.h"
+#include "store.h"
+
+/* Define the initial stack sizes. */
+#define DSTACK_INITIAL 20
+#define ESTACK_INITIAL 250
+#define OSTACK_INITIAL 200
+
+/* Per-context state stored in statics */
+extern ref ref_array_packing;
+extern ref ref_binary_object_format;
+extern ref user_names;
+extern long zrand_state;
+
+/* Initialization procedures */
+void zrand_state_init(P1(long *));
+
+/* Allocate the state of a context. */
+/* The client is responsible for the 'memory' member. */
+int
+context_state_alloc(gs_context_state_t *pcst, gs_ref_memory_t *mem)
+{ int code = gs_interp_create_stacks(mem, &pcst->dstack, &pcst->estack,
+ &pcst->ostack);
+
+ if ( code < 0 )
+ return code;
+ pcst->pgs = int_gstate_alloc(mem);
+ if ( pcst->pgs == 0 )
+ return_error(e_VMerror);
+ make_false(&pcst->array_packing);
+ make_int(&pcst->binary_object_format, 0);
+ zrand_state_init(&pcst->rand_state);
+ pcst->usertime_total = 0;
+ pcst->keep_usertime = false;
+ /****** user parameters ******/
+ /****** %stdin, %stdout ******/
+ return 0;
+}
+
+/* Load the interpreter state from a context. */
+void
+context_state_load(const gs_context_state_t *pcst)
+{ d_stack = *r_ptr(&pcst->dstack, ref_stack);
+ e_stack = *r_ptr(&pcst->estack, ref_stack);
+ o_stack = *r_ptr(&pcst->ostack, ref_stack);
+ igs = pcst->pgs;
+ gs_imemory = pcst->memory;
+ ref_array_packing = pcst->array_packing;
+ ref_binary_object_format = pcst->binary_object_format;
+ zrand_state = pcst->rand_state;
+ /****** user parameters ******/
+ /****** %stdin, %stdout ******/
+}
+
+/* Store the interpreter state in a context. */
+void
+context_state_store(gs_context_state_t *pcst)
+{ *r_ptr(&pcst->dstack, ref_stack) = d_stack;
+ *r_ptr(&pcst->estack, ref_stack) = e_stack;
+ *r_ptr(&pcst->ostack, ref_stack) = o_stack;
+ pcst->pgs = igs;
+ pcst->memory = gs_imemory;
+ pcst->array_packing = ref_array_packing;
+ pcst->binary_object_format = ref_binary_object_format;
+ pcst->rand_state = zrand_state;
+ /****** user parameters ******/
+ /****** %stdin, %stdout ******/
+}
+
+/* Free the state of a context. */
+void
+context_state_free(gs_context_state_t *pcst, gs_ref_memory_t *mem)
+{ /****** SEE alloc ABOVE ******/
+ int i;
+
+ /*
+ * If this context is the last one referencing a particular VM
+ * (local, or local and global), free the entire VM space;
+ * otherwise, just free the context-related structures.
+ */
+ for ( i = countof(pcst->memory.spaces.indexed); --i >= 0; ) {
+ if ( pcst->memory.spaces.indexed[i] != 0 &&
+ !--(pcst->memory.spaces.indexed[i]->num_contexts)
+ ) {
+ /****** FREE THE ENTIRE SPACE ******/
+ }
+ }
+}