| # Make a reasonable guess about memory limits using sysconf(). |
| # includes 5% slop factor as suggested in documentation. |
| |
| --- jpeg-7/jmemansi.c |
| +++ jpeg-7/jmemansi.c |
| @@ -12,6 +12,15 @@ |
| * is shoved onto the user. |
| */ |
| |
| +#include <unistd.h> |
| + |
| +#ifdef __FreeBSD__ |
| +# include <sys/types.h> |
| +# include <sys/sysctl.h> |
| +# include <sys/vmmeter.h> |
| +# include <vm/vm_param.h> |
| +#endif |
| + |
| #define JPEG_INTERNALS |
| #include "jinclude.h" |
| #include "jpeglib.h" |
| @@ -157,7 +166,26 @@ |
| 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(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) |