summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Deutschmann <whissi@gentoo.org>2019-10-15 12:24:12 +0200
committerThomas Deutschmann <whissi@gentoo.org>2020-08-13 11:26:55 +0200
commite088156d5b620e5e639580dacf85c6dc13823c74 (patch)
tree57f5c025e203279944da512166c20bc0521d8ccd /psi/zvmem2.c
downloadghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.tar.gz
ghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.tar.bz2
ghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.zip
Import Ghostscript 9.50ghostscript-9.50
Signed-off-by: Thomas Deutschmann <whissi@gentoo.org>
Diffstat (limited to 'psi/zvmem2.c')
-rw-r--r--psi/zvmem2.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/psi/zvmem2.c b/psi/zvmem2.c
new file mode 100644
index 00000000..a24c99fb
--- /dev/null
+++ b/psi/zvmem2.c
@@ -0,0 +1,140 @@
+/* Copyright (C) 2001-2019 Artifex Software, Inc.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied,
+ modified or distributed except as expressly authorized under the terms
+ of the license contained in the file LICENSE in this distribution.
+
+ Refer to licensing information at http://www.artifex.com or contact
+ Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+ CA 94945, U.S.A., +1(415)492-9861, for further information.
+*/
+
+
+/* Level 2 "Virtual memory" operators */
+#include "ghost.h"
+#include "oper.h"
+#include "estack.h"
+#include "ialloc.h" /* for ivmspace.h */
+#include "ivmspace.h"
+#include "ivmem2.h"
+#include "store.h"
+
+/* Garbage collector control parameters. */
+#define DEFAULT_VM_THRESHOLD_SMALL 100000
+#define DEFAULT_VM_THRESHOLD_LARGE 8000000
+#define MIN_VM_THRESHOLD 1
+#define MAX_VM_THRESHOLD max_long
+
+/* ------ Local/global VM control ------ */
+
+/* <bool> .setglobal - */
+static int
+zsetglobal(i_ctx_t *i_ctx_p)
+{
+ os_ptr op = osp;
+ check_type(*op, t_boolean);
+ ialloc_set_space(idmemory,
+ (op->value.boolval ? avm_global : avm_local));
+ pop(1);
+ return 0;
+}
+
+/* - .currentglobal <bool> */
+static int
+zcurrentglobal(i_ctx_t *i_ctx_p)
+{
+ os_ptr op = osp;
+
+ push(1);
+ make_bool(op, ialloc_space(idmemory) != avm_local);
+ return 0;
+}
+
+/* <any> gcheck/scheck <bool> */
+static int
+zgcheck(i_ctx_t *i_ctx_p)
+{
+ os_ptr op = osp;
+
+ check_op(1);
+ make_bool(op, (r_is_local(op) ? false : true));
+ return 0;
+}
+
+/* ------ Garbage collector control ------ */
+
+/* These routines are exported for setuserparams. */
+
+/*
+ * <int> setvmthreshold -
+ *
+ * This is implemented as a PostScript procedure that calls setuserparams.
+ */
+int
+set_vm_threshold(i_ctx_t *i_ctx_p, long val)
+{
+ if (val < -1)
+ return_error(gs_error_rangecheck);
+ else if (val == -1)
+ val = (gs_debug_c('.') ? DEFAULT_VM_THRESHOLD_SMALL :
+ DEFAULT_VM_THRESHOLD_LARGE);
+ else if (val < MIN_VM_THRESHOLD)
+ val = MIN_VM_THRESHOLD;
+ else if (val > MAX_VM_THRESHOLD)
+ val = MAX_VM_THRESHOLD;
+ gs_memory_set_vm_threshold(idmemory->space_system, val);
+ gs_memory_set_vm_threshold(idmemory->space_global, val);
+ gs_memory_set_vm_threshold(idmemory->space_local, val);
+ return 0;
+}
+
+int
+set_vm_reclaim(i_ctx_t *i_ctx_p, long val)
+{
+ if (val >= -2 && val <= 0) {
+ gs_memory_set_vm_reclaim(idmemory->space_system, (val >= -1));
+ gs_memory_set_vm_reclaim(idmemory->space_global, (val >= -1));
+ gs_memory_set_vm_reclaim(idmemory->space_local, (val == 0));
+ return 0;
+ } else
+ return_error(gs_error_rangecheck);
+}
+
+/*
+ * <int> .vmreclaim -
+ *
+ * This implements only immediate garbage collection: enabling and
+ * disabling GC is implemented by calling setuserparams.
+ */
+static int
+zvmreclaim(i_ctx_t *i_ctx_p)
+{
+ os_ptr op = osp;
+
+ check_type(*op, t_integer);
+ if (op->value.intval == 1 || op->value.intval == 2) {
+ /* Force the interpreter to store its state and exit. */
+ /* The interpreter's caller will do the actual GC. */
+ return_error(gs_error_VMreclaim);
+ }
+ return_error(gs_error_rangecheck);
+}
+
+/* ------ Initialization procedure ------ */
+
+/* The VM operators are defined even if the initial language level is 1, */
+/* because we need them during initialization. */
+const op_def zvmem2_op_defs[] =
+{
+ {"0.currentglobal", zcurrentglobal},
+ {"1.gcheck", zgcheck},
+ {"1.setglobal", zsetglobal},
+ /* The rest of the operators are defined only in Level 2. */
+ op_def_begin_level2(),
+ {"1.vmreclaim", zvmreclaim},
+ op_def_end(0)
+};