diff options
author | Ian Rogers <irogers@google.com> | 2014-06-21 22:58:05 -0700 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2014-06-22 01:30:40 -0700 |
commit | 997f0f9e69ce7aee73cebd64be8dc40af9164257 (patch) | |
tree | 0d323cec5ae6359fb4dd775a5b539848c930507b | |
parent | 87523b6c4df4dd33d4c1e383403e14d6fe06362f (diff) | |
download | art-997f0f9e69ce7aee73cebd64be8dc40af9164257.tar.gz art-997f0f9e69ce7aee73cebd64be8dc40af9164257.tar.bz2 art-997f0f9e69ce7aee73cebd64be8dc40af9164257.zip |
Limit the size of files created by run-test to 2MB.
In MemMap::MapAnonymous on the host, avoid creating ashmem regions that are
backed by files, when the size of the file will be greater than the ulimit.
Change-Id: I7cbf2ac59bf5869ed85850bea8d71898f3b7e1c7
-rw-r--r-- | runtime/mem_map.cc | 39 | ||||
-rw-r--r-- | test/003-omnibus-opcodes/build | 2 | ||||
-rw-r--r-- | test/056-const-string-jumbo/build | 2 | ||||
-rw-r--r-- | test/303-verification-stress/build | 2 | ||||
-rwxr-xr-x | test/run-test | 13 |
5 files changed, 42 insertions, 16 deletions
diff --git a/runtime/mem_map.cc b/runtime/mem_map.cc index 81a86235ec..6c1c86765c 100644 --- a/runtime/mem_map.cc +++ b/runtime/mem_map.cc @@ -34,6 +34,9 @@ #ifdef USE_ASHMEM #include <cutils/ashmem.h> +#ifndef ANDROID_OS +#include <sys/resource.h> +#endif #endif namespace art { @@ -179,20 +182,32 @@ MemMap* MemMap::MapAnonymous(const char* name, byte* expected, size_t byte_count } size_t page_aligned_byte_count = RoundUp(byte_count, kPageSize); + int flags = MAP_PRIVATE | MAP_ANONYMOUS; + ScopedFd fd(-1); + #ifdef USE_ASHMEM - // android_os_Debug.cpp read_mapinfo assumes all ashmem regions associated with the VM are - // prefixed "dalvik-". - std::string debug_friendly_name("dalvik-"); - debug_friendly_name += name; - ScopedFd fd(ashmem_create_region(debug_friendly_name.c_str(), page_aligned_byte_count)); - if (fd.get() == -1) { - *error_msg = StringPrintf("ashmem_create_region failed for '%s': %s", name, strerror(errno)); - return nullptr; - } - int flags = MAP_PRIVATE; +#ifdef HAVE_ANDROID_OS + const bool use_ashmem = true; #else - ScopedFd fd(-1); - int flags = MAP_PRIVATE | MAP_ANONYMOUS; + // When not on Android ashmem is faked using files in /tmp. Ensure that such files won't + // fail due to ulimit restrictions. If they will then use a regular mmap. + struct rlimit rlimit_fsize; + CHECK_EQ(getrlimit(RLIMIT_FSIZE, &rlimit_fsize), 0); + const bool use_ashmem = (rlimit_fsize.rlim_cur == RLIM_INFINITY) || + (page_aligned_byte_count < rlimit_fsize.rlim_cur); +#endif + if (use_ashmem) { + // android_os_Debug.cpp read_mapinfo assumes all ashmem regions associated with the VM are + // prefixed "dalvik-". + std::string debug_friendly_name("dalvik-"); + debug_friendly_name += name; + fd.reset(ashmem_create_region(debug_friendly_name.c_str(), page_aligned_byte_count)); + if (fd.get() == -1) { + *error_msg = StringPrintf("ashmem_create_region failed for '%s': %s", name, strerror(errno)); + return nullptr; + } + flags = MAP_PRIVATE; + } #endif // We need to store and potentially set an error number for pretty printing of errors diff --git a/test/003-omnibus-opcodes/build b/test/003-omnibus-opcodes/build index 9dff837ab6..f909fb2219 100644 --- a/test/003-omnibus-opcodes/build +++ b/test/003-omnibus-opcodes/build @@ -22,5 +22,5 @@ ${JAVAC} -d classes `find src -name '*.java'` rm classes/UnresClass.class ${JAVAC} -d classes `find src2 -name '*.java'` -${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex classes +${DX} -JXmx256m --debug --dex --output=classes.dex classes zip $TEST_NAME.jar classes.dex diff --git a/test/056-const-string-jumbo/build b/test/056-const-string-jumbo/build index a12c9d32b5..ef286d140e 100644 --- a/test/056-const-string-jumbo/build +++ b/test/056-const-string-jumbo/build @@ -42,5 +42,5 @@ function writeFile(name, start, end) { mkdir classes ${JAVAC} -d classes src/*.java -${DX} -JXmx500m --debug --dex --no-optimize --positions=none --no-locals --dump-to=classes.lst --output=classes.dex classes +${DX} -JXmx500m --debug --dex --no-optimize --positions=none --no-locals --output=classes.dex classes zip $TEST_NAME.jar classes.dex diff --git a/test/303-verification-stress/build b/test/303-verification-stress/build index 2ef9beafd1..c1935d2e9b 100644 --- a/test/303-verification-stress/build +++ b/test/303-verification-stress/build @@ -24,5 +24,5 @@ gcc -o classes-gen classes-gen.c mkdir classes ${JAVAC} -d classes src/*.java -${DX} --debug --dex --dump-to=classes.lst --output=classes.dex classes +${DX} --debug --dex --output=classes.dex classes zip $TEST_NAME.jar classes.dex diff --git a/test/run-test b/test/run-test index 34b06cc3a1..d1c5bb2360 100755 --- a/test/run-test +++ b/test/run-test @@ -298,6 +298,17 @@ chmod 755 "$run" export TEST_NAME=`basename ${test_dir}` +# To cause tests to fail fast, limit the file sizes created by dx, dex2oat and ART output to 2MB. +file_size_limit=2048 +if echo "$test_dir" | grep 089; then + file_size_limit=5120 +elif echo "$test_dir" | grep 083; then + file_size_limit=5120 +fi +if ! ulimit "$file_size_limit"; then + echo "ulimit file size setting failed" +fi + good="no" if [ "$dev_mode" = "yes" ]; then "./${build}" 2>&1 @@ -376,7 +387,7 @@ fi echo '#################### info' cat "${td_info}" | sed 's/^/# /g' echo '#################### diffs' - diff --strip-trailing-cr -u "$expected" "$output" + diff --strip-trailing-cr -u "$expected" "$output" | tail -n 500 echo '####################' echo ' ' fi |