# 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,24 @@ 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); +#elif defined(__FreeBSD__)|| defined(__DragonFly__) + int mib[2] = { CTL_VM, VM_METER } + struct vmtotal memory; + size_t len = sizeof(memory); + + sysctl(mib, 2, &memory, &len, NULL, 0); + return (long) (memory->t_free * getpagesize() * 0.95); +#endif + + return DEFAULT_MAX_MEM; } GLOBAL(void)