summaryrefslogtreecommitdiff
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)