source: trunk/third/firefox/jpeg/jmemsys.h @ 21695

Revision 21695, 8.0 KB checked in by rbasch, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r21694, which included commits to RCS files with non-trunk default branches.
Line 
1/*
2 * jmemsys.h
3 *
4 * Copyright (C) 1992-1997, Thomas G. Lane.
5 * This file is part of the Independent JPEG Group's software.
6 * For conditions of distribution and use, see the accompanying README file.
7 *
8 * This include file defines the interface between the system-independent
9 * and system-dependent portions of the JPEG memory manager.  No other
10 * modules need include it.  (The system-independent portion is jmemmgr.c;
11 * there are several different versions of the system-dependent portion.)
12 *
13 * This file works as-is for the system-dependent memory managers supplied
14 * in the IJG distribution.  You may need to modify it if you write a
15 * custom memory manager.  If system-dependent changes are needed in
16 * this file, the best method is to #ifdef them based on a configuration
17 * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR
18 * and USE_MAC_MEMMGR.
19 */
20
21
22/* Short forms of external names for systems with brain-damaged linkers. */
23
24#ifdef NEED_SHORT_EXTERNAL_NAMES
25#define jpeg_get_small          jGetSmall
26#define jpeg_free_small         jFreeSmall
27#define jpeg_get_large          jGetLarge
28#define jpeg_free_large         jFreeLarge
29#define jpeg_mem_available      jMemAvail
30#define jpeg_open_backing_store jOpenBackStore
31#define jpeg_mem_init           jMemInit
32#define jpeg_mem_term           jMemTerm
33#endif /* NEED_SHORT_EXTERNAL_NAMES */
34
35
36/*
37 * These two functions are used to allocate and release small chunks of
38 * memory.  (Typically the total amount requested through jpeg_get_small is
39 * no more than 20K or so; this will be requested in chunks of a few K each.)
40 * Behavior should be the same as for the standard library functions malloc
41 * and free; in particular, jpeg_get_small must return NULL on failure.
42 * On most systems, these ARE malloc and free.  jpeg_free_small is passed the
43 * size of the object being freed, just in case it's needed.
44 * On an 80x86 machine using small-data memory model, these manage near heap.
45 */
46
47EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject));
48EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object,
49                                  size_t sizeofobject));
50
51/*
52 * These two functions are used to allocate and release large chunks of
53 * memory (up to the total free space designated by jpeg_mem_available).
54 * The interface is the same as above, except that on an 80x86 machine,
55 * far pointers are used.  On most other machines these are identical to
56 * the jpeg_get/free_small routines; but we keep them separate anyway,
57 * in case a different allocation strategy is desirable for large chunks.
58 */
59
60EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo,
61                                       size_t sizeofobject));
62EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object,
63                                  size_t sizeofobject));
64
65/*
66 * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may
67 * be requested in a single call to jpeg_get_large (and jpeg_get_small for that
68 * matter, but that case should never come into play).  This macro is needed
69 * to model the 64Kb-segment-size limit of far addressing on 80x86 machines.
70 * On those machines, we expect that jconfig.h will provide a proper value.
71 * On machines with 32-bit flat address spaces, any large constant may be used.
72 *
73 * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type
74 * size_t and will be a multiple of sizeof(align_type).
75 */
76
77#ifndef MAX_ALLOC_CHUNK         /* may be overridden in jconfig.h */
78#define MAX_ALLOC_CHUNK  1000000000L
79#endif
80
81/*
82 * This routine computes the total space still available for allocation by
83 * jpeg_get_large.  If more space than this is needed, backing store will be
84 * used.  NOTE: any memory already allocated must not be counted.
85 *
86 * There is a minimum space requirement, corresponding to the minimum
87 * feasible buffer sizes; jmemmgr.c will request that much space even if
88 * jpeg_mem_available returns zero.  The maximum space needed, enough to hold
89 * all working storage in memory, is also passed in case it is useful.
90 * Finally, the total space already allocated is passed.  If no better
91 * method is available, cinfo->mem->max_memory_to_use - already_allocated
92 * is often a suitable calculation.
93 *
94 * It is OK for jpeg_mem_available to underestimate the space available
95 * (that'll just lead to more backing-store access than is really necessary).
96 * However, an overestimate will lead to failure.  Hence it's wise to subtract
97 * a slop factor from the true available space.  5% should be enough.
98 *
99 * On machines with lots of virtual memory, any large constant may be returned.
100 * Conversely, zero may be returned to always use the minimum amount of memory.
101 */
102
103EXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo,
104                                     long min_bytes_needed,
105                                     long max_bytes_needed,
106                                     long already_allocated));
107
108
109/*
110 * This structure holds whatever state is needed to access a single
111 * backing-store object.  The read/write/close method pointers are called
112 * by jmemmgr.c to manipulate the backing-store object; all other fields
113 * are private to the system-dependent backing store routines.
114 */
115
116#define TEMP_NAME_LENGTH   64   /* max length of a temporary file's name */
117
118
119#ifdef USE_MSDOS_MEMMGR         /* DOS-specific junk */
120
121typedef unsigned short XMSH;    /* type of extended-memory handles */
122typedef unsigned short EMSH;    /* type of expanded-memory handles */
123
124typedef union {
125  short file_handle;            /* DOS file handle if it's a temp file */
126  XMSH xms_handle;              /* handle if it's a chunk of XMS */
127  EMSH ems_handle;              /* handle if it's a chunk of EMS */
128} handle_union;
129
130#endif /* USE_MSDOS_MEMMGR */
131
132#ifdef USE_MAC_MEMMGR           /* Mac-specific junk */
133#include <Files.h>
134#endif /* USE_MAC_MEMMGR */
135
136
137typedef struct backing_store_struct * backing_store_ptr;
138
139typedef struct backing_store_struct {
140  /* Methods for reading/writing/closing this backing-store object */
141  JMETHOD(void, read_backing_store, (j_common_ptr cinfo,
142                                     backing_store_ptr info,
143                                     void FAR * buffer_address,
144                                     long file_offset, long byte_count));
145  JMETHOD(void, write_backing_store, (j_common_ptr cinfo,
146                                      backing_store_ptr info,
147                                      void FAR * buffer_address,
148                                      long file_offset, long byte_count));
149  JMETHOD(void, close_backing_store, (j_common_ptr cinfo,
150                                      backing_store_ptr info));
151
152  /* Private fields for system-dependent backing-store management */
153#ifdef USE_MSDOS_MEMMGR
154  /* For the MS-DOS manager (jmemdos.c), we need: */
155  handle_union handle;          /* reference to backing-store storage object */
156  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
157#else
158#ifdef USE_MAC_MEMMGR
159  /* For the Mac manager (jmemmac.c), we need: */
160  short temp_file;              /* file reference number to temp file */
161  FSSpec tempSpec;              /* the FSSpec for the temp file */
162  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
163#else
164  /* For a typical implementation with temp files, we need: */
165  FILE * temp_file;             /* stdio reference to temp file */
166  char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */
167#endif
168#endif
169} backing_store_info;
170
171
172/*
173 * Initial opening of a backing-store object.  This must fill in the
174 * read/write/close pointers in the object.  The read/write routines
175 * may take an error exit if the specified maximum file size is exceeded.
176 * (If jpeg_mem_available always returns a large value, this routine can
177 * just take an error exit.)
178 */
179
180EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo,
181                                          backing_store_ptr info,
182                                          long total_bytes_needed));
183
184
185/*
186 * These routines take care of any system-dependent initialization and
187 * cleanup required.  jpeg_mem_init will be called before anything is
188 * allocated (and, therefore, nothing in cinfo is of use except the error
189 * manager pointer).  It should return a suitable default value for
190 * max_memory_to_use; this may subsequently be overridden by the surrounding
191 * application.  (Note that max_memory_to_use is only important if
192 * jpeg_mem_available chooses to consult it ... no one else will.)
193 * jpeg_mem_term may assume that all requested memory has been freed and that
194 * all opened backing-store objects have been closed.
195 */
196
197EXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo));
198EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo));
Note: See TracBrowser for help on using the repository browser.