diff options
author | Thomas G. Lane <tgl@netcom.com> | 1994-09-24 00:00:00 +0000 |
---|---|---|
committer | DRC <information@libjpeg-turbo.org> | 2015-07-29 15:28:00 -0500 |
commit | 36a4ccccd33f5cc9df62949554af87129ced7f84 (patch) | |
tree | b3540f7e10d8f1602c8a08611495f8b71b0c74c1 /jmemsys.h | |
parent | cc7150e281999ac2642e21f13e2c160f68b1d675 (diff) |
The Independent JPEG Group's JPEG software v5
Diffstat (limited to 'jmemsys.h')
-rw-r--r-- | jmemsys.h | 171 |
1 files changed, 113 insertions, 58 deletions
@@ -1,78 +1,107 @@ /* * jmemsys.h * - * Copyright (C) 1992, Thomas G. Lane. + * Copyright (C) 1992-1994, Thomas G. Lane. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This include file defines the interface between the system-independent - * and system-dependent portions of the JPEG memory manager. (The system- - * independent portion is jmemmgr.c; there are several different versions - * of the system-dependent portion, and of this file for that matter.) + * and system-dependent portions of the JPEG memory manager. No other + * modules need include it. (The system-independent portion is jmemmgr.c; + * there are several different versions of the system-dependent portion.) * - * This is a "generic" skeleton that may need to be modified for particular - * systems. It should be usable as-is on the majority of non-MSDOS machines. + * This file works as-is for the system-dependent memory managers supplied + * in the IJG distribution. You may need to modify it if you write a + * custom memory manager. If system-dependent changes are needed in + * this file, the best method is to #ifdef them based on a configuration + * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR. */ +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_get_small jGetSmall +#define jpeg_free_small jFreeSmall +#define jpeg_get_large jGetLarge +#define jpeg_free_large jFreeLarge +#define jpeg_mem_available jMemAvail +#define jpeg_open_backing_store jOpenBackStore +#define jpeg_mem_init jMemInit +#define jpeg_mem_term jMemTerm +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + /* * These two functions are used to allocate and release small chunks of - * memory (typically the total amount requested through jget_small is - * no more than 20Kb or so). Behavior should be the same as for the - * standard library functions malloc and free; in particular, jget_small - * returns NULL on failure. On most systems, these ARE malloc and free. + * memory. (Typically the total amount requested through jpeg_get_small is + * no more than 20K or so; this will be requested in chunks of a few K each.) + * Behavior should be the same as for the standard library functions malloc + * and free; in particular, jpeg_get_small must return NULL on failure. + * On most systems, these ARE malloc and free. jpeg_free_small is passed the + * size of the object being freed, just in case it's needed. * On an 80x86 machine using small-data memory model, these manage near heap. */ -EXTERN void * jget_small PP((size_t sizeofobject)); -EXTERN void jfree_small PP((void * object)); +EXTERN void * jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject)); +EXTERN void jpeg_free_small JPP((j_common_ptr cinfo, void * object, + size_t sizeofobject)); /* * These two functions are used to allocate and release large chunks of - * memory (up to the total free space designated by jmem_available). + * memory (up to the total free space designated by jpeg_mem_available). * The interface is the same as above, except that on an 80x86 machine, - * far pointers are used. On other systems these ARE the same as above. + * far pointers are used. On most other machines these are identical to + * the jpeg_get/free_small routines; but we keep them separate anyway, + * in case a different allocation strategy is desirable for large chunks. */ -#ifdef NEED_FAR_POINTERS /* typically not needed except on 80x86 */ -EXTERN void FAR * jget_large PP((size_t sizeofobject)); -EXTERN void jfree_large PP((void FAR * object)); -#else -#define jget_large(sizeofobject) jget_small(sizeofobject) -#define jfree_large(object) jfree_small(object) -#endif +EXTERN void FAR * jpeg_get_large JPP((j_common_ptr cinfo,size_t sizeofobject)); +EXTERN void jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object, + size_t sizeofobject)); /* * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may - * be requested in a single call on jget_large (and jget_small for that + * be requested in a single call to jpeg_get_large (and jpeg_get_small for that * matter, but that case should never come into play). This macro is needed * to model the 64Kb-segment-size limit of far addressing on 80x86 machines. - * On machines with flat address spaces, any large constant may be used here. + * On those machines, we expect that jconfig.h will provide a proper value. + * On machines with 32-bit flat address spaces, any large constant may be used. + * + * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type + * size_t and will be a multiple of sizeof(align_type). */ -#define MAX_ALLOC_CHUNK 1000000000L +#ifndef MAX_ALLOC_CHUNK /* may be overridden in jconfig.h */ +#define MAX_ALLOC_CHUNK 1000000000L +#endif /* - * This routine computes the total space available for allocation by - * jget_large. If more space than this is needed, backing store will be used. - * NOTE: any memory already allocated must not be counted. + * This routine computes the total space still available for allocation by + * jpeg_get_large. If more space than this is needed, backing store will be + * used. NOTE: any memory already allocated must not be counted. * * There is a minimum space requirement, corresponding to the minimum * feasible buffer sizes; jmemmgr.c will request that much space even if - * jmem_available returns zero. The maximum space needed, enough to hold + * jpeg_mem_available returns zero. The maximum space needed, enough to hold * all working storage in memory, is also passed in case it is useful. + * Finally, the total space already allocated is passed. If no better + * method is available, cinfo->mem->max_memory_to_use - already_allocated + * is often a suitable calculation. * - * It is OK for jmem_available to underestimate the space available (that'll - * just lead to more backing-store access than is really necessary). + * It is OK for jpeg_mem_available to underestimate the space available + * (that'll just lead to more backing-store access than is really necessary). * However, an overestimate will lead to failure. Hence it's wise to subtract - * a slop factor from the true available space, especially if jget_small space - * comes from the same pool. 5% should be enough. + * a slop factor from the true available space. 5% should be enough. * * On machines with lots of virtual memory, any large constant may be returned. * Conversely, zero may be returned to always use the minimum amount of memory. */ -EXTERN long jmem_available PP((long min_bytes_needed, long max_bytes_needed)); +EXTERN long jpeg_mem_available JPP((j_common_ptr cinfo, + long min_bytes_needed, + long max_bytes_needed, + long already_allocated)); /* @@ -84,44 +113,70 @@ EXTERN long jmem_available PP((long min_bytes_needed, long max_bytes_needed)); #define TEMP_NAME_LENGTH 64 /* max length of a temporary file's name */ +#ifdef USE_MSDOS_MEMMGR /* DOS-specific junk */ + +typedef unsigned short XMSH; /* type of extended-memory handles */ +typedef unsigned short EMSH; /* type of expanded-memory handles */ + +typedef union { + short file_handle; /* DOS file handle if it's a temp file */ + XMSH xms_handle; /* handle if it's a chunk of XMS */ + EMSH ems_handle; /* handle if it's a chunk of EMS */ +} handle_union; + +#endif /* USE_MSDOS_MEMMGR */ + typedef struct backing_store_struct * backing_store_ptr; typedef struct backing_store_struct { - /* Methods for reading/writing/closing this backing-store object */ - METHOD(void, read_backing_store, (backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count)); - METHOD(void, write_backing_store, (backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count)); - METHOD(void, close_backing_store, (backing_store_ptr info)); - /* Private fields for system-dependent backing-store management */ - /* For a typical implementation with temp files, we might need: */ - FILE * temp_file; /* stdio reference to temp file */ - char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */ - } backing_store_info; + /* Methods for reading/writing/closing this backing-store object */ + JMETHOD(void, read_backing_store, (j_common_ptr cinfo, + backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count)); + JMETHOD(void, write_backing_store, (j_common_ptr cinfo, + backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count)); + JMETHOD(void, close_backing_store, (j_common_ptr cinfo, + backing_store_ptr info)); + + /* Private fields for system-dependent backing-store management */ +#ifdef USE_MSDOS_MEMMGR + /* For the MS-DOS manager (jmemdos.c), we need: */ + handle_union handle; /* reference to backing-store storage object */ + char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ +#else + /* For a typical implementation with temp files, we need: */ + FILE * temp_file; /* stdio reference to temp file */ + char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */ +#endif +} backing_store_info; /* * Initial opening of a backing-store object. This must fill in the * read/write/close pointers in the object. The read/write routines * may take an error exit if the specified maximum file size is exceeded. - * (If jmem_available always returns a large value, this routine can just - * take an error exit.) + * (If jpeg_mem_available always returns a large value, this routine can + * just take an error exit.) */ -EXTERN void jopen_backing_store PP((backing_store_ptr info, - long total_bytes_needed)); +EXTERN void jpeg_open_backing_store JPP((j_common_ptr cinfo, + backing_store_ptr info, + long total_bytes_needed)); /* * These routines take care of any system-dependent initialization and - * cleanup required. The system methods struct address should be saved - * by jmem_init in case an error exit must be taken. jmem_term may assume - * that all requested memory has been freed and that all opened backing- - * store objects have been closed. - * NB: jmem_term may be called more than once, and must behave reasonably - * if that happens. + * cleanup required. jpeg_mem_init will be called before anything is + * allocated (and, therefore, nothing in cinfo is of use except the error + * manager pointer). It should return a suitable default value for + * max_memory_to_use; this may subsequently be overridden by the surrounding + * application. (Note that max_memory_to_use is only important if + * jpeg_mem_available chooses to consult it ... no one else will.) + * jpeg_mem_term may assume that all requested memory has been freed and that + * all opened backing-store objects have been closed. */ -EXTERN void jmem_init PP((external_methods_ptr emethods)); -EXTERN void jmem_term PP((void)); +EXTERN long jpeg_mem_init JPP((j_common_ptr cinfo)); +EXTERN void jpeg_mem_term JPP((j_common_ptr cinfo)); |