| diff -Naur cacao/cacao/src/vm/options.cpp cacao/cacao/src/vm/options.cpp |
| --- cacao/cacao/src/vm/options.cpp 2014-12-12 21:14:45.000000000 +0000 |
| +++ cacao/cacao/src/vm/options.cpp 2015-12-23 21:01:37.644275263 +0000 |
| @@ -26,6 +26,7 @@ |
| #include "config.h" |
| |
| #include <limits.h> |
| +#include <stddef.h> |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| @@ -60,9 +61,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.hpp cacao/cacao/src/vm/options.hpp |
| --- cacao/cacao/src/vm/options.hpp 2014-12-12 21:14:45.000000000 +0000 |
| +++ cacao/cacao/src/vm/options.hpp 2015-12-23 21:01:37.645275246 +0000 |
| @@ -26,6 +26,7 @@ |
| #ifndef OPTIONS_HPP_ |
| #define OPTIONS_HPP_ 1 |
| |
| +#include <stddef.h> // for size_t |
| #include <stdint.h> // for int64_t |
| #include <stdio.h> // for FILE |
| #include "config.h" // for ENABLE_DEBUG_FILTER, etc |
| @@ -77,9 +78,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 2014-12-12 21:14:45.000000000 +0000 |
| +++ cacao/cacao/src/vm/vm.cpp 2015-12-23 21:01:38.046268504 +0000 |
| @@ -29,9 +29,14 @@ |
| #include <cerrno> |
| #include <cstdlib> |
| #include <exception> |
| +#include <stddef.h> |
| #include <stdint.h> |
| #include <inttypes.h> |
| |
| +#if defined(__LINUX__) |
| +#include <unistd.h> |
| +#endif |
| + |
| #include "md-abi.hpp" |
| |
| #include "mm/codememory.hpp" |
| @@ -690,6 +695,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. |
| options_xx(vm_args); |
| |
| @@ -896,18 +914,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; |
| @@ -1498,9 +1531,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")); |