| diff -Naur cacao/cacao/src/vm/options.c cacao/cacao/src/vm/options.c |
| --- cacao/cacao/src/vm/options.c 2013-01-10 16:45:14.000000000 +0000 |
| +++ cacao/cacao/src/vm/options.c 2016-01-03 11:48:06.439004345 +0000 |
| @@ -26,6 +26,7 @@ |
| #include "config.h" |
| |
| #include <limits.h> |
| +#include <stddef.h> |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| @@ -56,9 +57,9 @@ |
| |
| bool opt_run = true; |
| |
| -s4 opt_heapmaxsize = 0; /* maximum heap size */ |
| -s4 opt_heapstartsize = 0; /* initial heap size */ |
| -s4 opt_stacksize = 0; /* thread stack size */ |
| +size_t opt_heapmaxsize = 0; /* maximum heap size */ |
| +size_t opt_heapstartsize = 0; /* initial heap size */ |
| +size_t opt_stacksize = 0; /* thread stack size */ |
| |
| bool opt_verbose = false; |
| bool opt_debugcolor = false; /* use ANSI terminal sequences */ |
| diff -Naur cacao/cacao/src/vm/options.h cacao/cacao/src/vm/options.h |
| --- cacao/cacao/src/vm/options.h 2013-01-10 16:45:14.000000000 +0000 |
| +++ cacao/cacao/src/vm/options.h 2016-01-03 11:48:55.397204706 +0000 |
| @@ -32,6 +32,7 @@ |
| extern "C" { |
| #endif |
| |
| +#include <stddef.h> |
| #include <stdint.h> |
| |
| #include "vm/types.h" |
| @@ -82,9 +83,9 @@ |
| extern bool opt_jar; |
| extern bool opt_run; |
| |
| -extern s4 opt_heapmaxsize; |
| -extern s4 opt_heapstartsize; |
| -extern s4 opt_stacksize; |
| +extern size_t opt_heapmaxsize; |
| +extern size_t opt_heapstartsize; |
| +extern size_t opt_stacksize; |
| |
| extern bool opt_verbose; |
| extern bool opt_debugcolor; |
| diff -Naur cacao/cacao/src/vm/vm.cpp cacao/cacao/src/vm/vm.cpp |
| --- cacao/cacao/src/vm/vm.cpp 2013-01-10 16:45:14.000000000 +0000 |
| +++ cacao/cacao/src/vm/vm.cpp 2016-01-03 11:50:15.779891441 +0000 |
| @@ -25,6 +25,7 @@ |
| |
| #include "config.h" |
| |
| +#include <stddef.h> |
| #include <stdint.h> |
| |
| #include <exception> |
| @@ -33,6 +34,10 @@ |
| #include <errno.h> |
| #include <stdlib.h> |
| |
| +#if defined(__LINUX__) |
| +#include <unistd.h> |
| +#endif |
| + |
| #include "vm/types.h" |
| |
| #include "arch.h" |
| @@ -699,6 +704,19 @@ |
| opt_heapstartsize = HEAP_STARTSIZE; |
| opt_stacksize = STACK_SIZE; |
| |
| +#if defined(__LINUX__) |
| + // Calculate 1/4 of the physical memory. |
| + size_t qmem = sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE) / 4; |
| + |
| + if (qmem > INT32_MAX) { |
| + // Allocate no more than 2GB. |
| + opt_heapmaxsize = INT32_MAX; |
| + } else if (qmem > HEAP_MAXSIZE) { |
| + // Otherwise use this if greater than default (128MB). |
| + opt_heapmaxsize = qmem; |
| + } |
| +#endif |
| + |
| // First of all, parse the -XX options. |
| |
| #if defined(ENABLE_VMLOG) |
| @@ -914,18 +932,33 @@ |
| case OPT_SS: |
| { |
| char c; |
| - int j; |
| + size_t j; |
| |
| + errno = 0; |
| c = opt_arg[strlen(opt_arg) - 1]; |
| + j = strtoul(opt_arg, NULL, 10); |
| + |
| + if (errno) |
| + break; // Invalid. |
| |
| if ((c == 'k') || (c == 'K')) { |
| - j = atoi(opt_arg) * 1024; |
| + if (j > SIZE_MAX / 1024) |
| + break; // Overflow. |
| + else |
| + j *= 1024; |
| |
| } else if ((c == 'm') || (c == 'M')) { |
| - j = atoi(opt_arg) * 1024 * 1024; |
| - |
| - } else |
| - j = atoi(opt_arg); |
| + if (j > SIZE_MAX / 1024 / 1024) |
| + break; // Overflow. |
| + else |
| + j *= 1024 * 1024; |
| + |
| + } else if ((c == 'g') || (c == 'G')) { |
| + if (j > SIZE_MAX / 1024 / 1024 / 1024) |
| + break; // Overflow. |
| + else |
| + j *= 1024 * 1024 * 1024; |
| + } |
| |
| if (opt == OPT_MX) |
| opt_heapmaxsize = j; |
| @@ -1525,9 +1558,9 @@ |
| void VM::print_run_time_config() |
| { |
| puts("Run-time variables:\n"); |
| - printf(" maximum heap size : %d\n", opt_heapmaxsize); |
| - printf(" initial heap size : %d\n", opt_heapstartsize); |
| - printf(" stack size : %d\n", opt_stacksize); |
| + printf(" maximum heap size : %lu\n", opt_heapmaxsize); |
| + printf(" initial heap size : %lu\n", opt_heapstartsize); |
| + printf(" stack size : %lu\n", opt_stacksize); |
| |
| #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH) |
| printf(" gnu.classpath.boot.library.path: %s\n", _properties.get("gnu.classpath.boot.library.path")); |