# Make a reasonable guess about memory limits using sysconf(). # includes 5% slop factor as suggested in documentation. Index: jpeg-6b/jmemansi.c =================================================================== --- jpeg-6b.orig/jmemansi.c +++ jpeg-6b/jmemansi.c @@ -12,6 +12,15 @@ * is shoved onto the user. */ +#include + +#ifdef __FreeBSD__ +#include +#include +#include +#include +#endif + #define JPEG_INTERNALS #include "jinclude.h" #include "jpeglib.h" @@ -157,7 +166,26 @@ jpeg_open_backing_store (j_common_ptr ci GLOBAL(long) jpeg_mem_init (j_common_ptr cinfo) { - return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ +#ifdef _SC_AVPHYS_PAGES + long phys_size; + + if ((phys_size = sysconf(_SC_AVPHYS_PAGES)) == -1) + return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ + if ((phys_size *= sysconf(_SC_PAGESIZE)) < 0) + return DEFAULT_MAX_MEM; + return (long) (phys_size * 0.95); +#if HAVE_SYSCTL && defined HW_PHYSMEM + { /* This works on *bsd and darwin. */ + unsigned int physmem; + size_t len = sizeof physmem; + static int mib[2] = { CTL_HW, HW_PHYSMEM }; + + if (sysctl (mib, ARRAY_SIZE (mib), &physmem, &len, NULL, 0) == 0 + && len == sizeof (physmem)) + return (long) (physmem * 0.95 ); + } +#endif + + return DEFAULT_MAX_MEM; } GLOBAL(void)