blob: 9ea87d4fa399af0b20452717e16a182f4499a0a9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
# 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)
|