summaryrefslogtreecommitdiff
path: root/base/gxclmem.h
diff options
context:
space:
mode:
Diffstat (limited to 'base/gxclmem.h')
-rw-r--r--base/gxclmem.h145
1 files changed, 145 insertions, 0 deletions
diff --git a/base/gxclmem.h b/base/gxclmem.h
new file mode 100644
index 000000000..0515ec467
--- /dev/null
+++ b/base/gxclmem.h
@@ -0,0 +1,145 @@
+/* Copyright (C) 2001-2012 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., 7 Mt. Lassen Drive - Suite A-134, San Rafael,
+ CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+
+/* Definitions and declarations for clist implementation in memory. */
+
+#ifndef gxclmem_INCLUDED
+# define gxclmem_INCLUDED
+
+#include "gxclio.h" /* defines interface */
+#include "strimpl.h" /* stream structures */
+
+/*
+ * The best values of MEMFILE_DATA_SIZE are slightly less than a power of 2,
+ * to allow typical malloc implementations to allocate in units of a power
+ * of 2 rather than having to go slightly over.
+ */
+#define MEMFILE_DATA_SIZE (16384 - 160)
+
+ /* ============================================================ */
+ /* */
+ /* Memfile structure definitions. */
+ /* */
+ /* The PHYS structures are the elements actually allocated in */
+ /* RAM, containing the compressed data (or optionally raw data) */
+ /* */
+ /* There can be several LOG (logical) elements per physical */
+ /* element, depending on the compression. The MEMFILE pdata */
+ /* item always points into a raw block of data. */
+ /* */
+ /* ============================================================ */
+
+typedef struct RAW_BUFFER {
+ struct RAW_BUFFER *fwd, *back;
+ struct LOG_MEMFILE_BLK *log_blk;
+ char data[MEMFILE_DATA_SIZE];
+} RAW_BUFFER;
+
+typedef struct PHYS_MEMFILE_BLK {
+ struct PHYS_MEMFILE_BLK *link;
+ char *data_limit; /* end of data when compressed */
+ /* data_limit is NULL if not compressed */
+ char data_spare[4]; /* used during de-compress */
+ char data[MEMFILE_DATA_SIZE];
+} PHYS_MEMFILE_BLK;
+
+typedef struct LOG_MEMFILE_BLK {
+ struct LOG_MEMFILE_BLK *link;
+ PHYS_MEMFILE_BLK *phys_blk;
+ char *phys_pdata;
+ RAW_BUFFER *raw_block; /* or NULL */
+} LOG_MEMFILE_BLK;
+
+struct MEMFILE_s {
+ gs_memory_t *memory; /* storage allocator */
+ gs_memory_t *data_memory; /* storage allocator for data */
+ bool ok_to_compress; /* if true, OK to compress this file */
+ bool is_open; /* track open/closed for each access struct */
+ /*
+ * We need to maintain a linked list of other structs that
+ * have beed opened on this 'file'. This allows for a writer
+ * to create a file, close it (but not unlink it), then other
+ * 'opens' of the same file, using the pseudo file-name that
+ * consists of a flag 0xff byte followed by the address as
+ * a 0x____ string.
+ *
+ * When the file is 'unlinked' it must check for other open
+ * 'readers' and set the 'READER INSTANCE' values of the
+ * cloned structures so that calls into 'read' and 'seek'
+ * etc., will be harmless.
+ */
+ struct MEMFILE_s *openlist;
+ struct MEMFILE_s *base_memfile; /* reader instances set this to the file that was written */
+ /*
+ * Reserve memory blocks: these are used to guarantee that a
+ * given-sized write (or sequence of writes) will always succeed.
+ * More specifically, the guarantee is that N bytes can successfully
+ * be written after a low-memory warning is first returned by
+ * fwrite. The reserve of N bytes for a given file is (re)allocated
+ * by a successful call to memfile_set_memory_warning(N). Fwrite
+ * allocates memory only from the reserve when its normal allocation
+ * attempts fail; in such cases, it allocates blocks from the
+ * reserve pool as needed and completes normally, but returns a
+ * low-memory warning status. Once a low-memory warning has been
+ * returned, fwrite will continue to attempt to allocate memory from
+ * the usual allocator on subsequent fwrites, but does *not* try to
+ * "top up" the reserve if becomes available -- only an explicit
+ * memfile_set_memory_warning does so.
+ */
+ PHYS_MEMFILE_BLK *reservePhysBlockChain; /* chain of reserve phys blks */
+ int reservePhysBlockCount; /* count of entries on reservePhysBlockChain */
+ LOG_MEMFILE_BLK *reserveLogBlockChain; /* chain of reserve log blks */
+ int reserveLogBlockCount; /* count of entries on reserveLogBlockChain */
+ /* logical file properties */
+ LOG_MEMFILE_BLK *log_head;
+ LOG_MEMFILE_BLK *log_curr_blk; /******* READER INSTANCE *******/
+ int64_t log_length; /* updated during write */
+ int64_t log_curr_pos; /* updated during seek, close, read */ /******* READER INSTANCE *******/
+ char *pdata; /* raw data */ /******* READER INSTANCE *******/
+ char *pdata_end; /******* READER INSTANCE *******/
+ /* physical file properties */
+ int64_t total_space; /* so we know when to start compress */
+ PHYS_MEMFILE_BLK *phys_curr; /* NULL if not compressing */ /******* READER INSTANCE *******/
+ RAW_BUFFER *raw_head, *raw_tail ; /******* READER INSTANCE *******/
+ int error_code; /* used by CLIST_ferror */ /******* READER INSTANCE *******/
+ stream_cursor_read rd; /* use .ptr, .limit */ /******* READER INSTANCE *******/
+ stream_cursor_write wt; /* use .ptr, .limit */ /******* READER INSTANCE *******/
+ bool compressor_initialized;
+ stream_state *compress_state;
+ stream_state *decompress_state; /******* READER INSTANCE *******/
+};
+#ifndef MEMFILE_DEFINED
+#define MEMFILE_DEFINED
+typedef struct MEMFILE_s MEMFILE;
+#endif
+
+/*
+ * Only the MEMFILE and stream_state structures are GC-compatible, so we
+ * allocate all the other structures on the C heap.
+ */
+
+#define private_st_MEMFILE() /* in gxclmem.c */\
+ gs_private_st_ptrs2(st_MEMFILE, MEMFILE, "MEMFILE",\
+ MEMFILE_enum_ptrs, MEMFILE_reloc_ptrs, compress_state, decompress_state)
+
+/* Declare the procedures for returning the prototype filter states */
+/* for compressing and decompressing the band list. */
+const stream_template *clist_compressor_template(void);
+const stream_template *clist_decompressor_template(void);
+void clist_compressor_init(stream_state *state);
+void clist_decompressor_init(stream_state *state);
+
+#endif /* gxclmem_INCLUDED */