Revert dex2oat file locking
Effectively "git revert 234da578a2d91ed7f2ef47b2ec23fb0033e2746b"
Changed run-test to do dex2oat on the host to eliminate original motivation for dex2oat locking
Change-Id: I58d64f9b2ad7cf137df865945dd31361ca57f675
diff --git a/build/Android.oat.mk b/build/Android.oat.mk
index 9ea9e81..0995356 100644
--- a/build/Android.oat.mk
+++ b/build/Android.oat.mk
@@ -51,13 +51,11 @@
$(HOST_CORE_OAT): $(HOST_CORE_DEX) $(DEX2OAT_DEPENDENCY)
@echo "host dex2oat: $@ ($?)"
@mkdir -p $(dir $@)
- @rm -f $@
$(hide) $(DEX2OAT) --runtime-arg -Xms16m --runtime-arg -Xmx16m --image-classes=$(PRELOADED_CLASSES) $(addprefix --dex-file=,$(filter-out $(DEX2OAT),$^)) --oat=$@ --image=$(HOST_CORE_IMG) --base=$(IMG_HOST_BASE_ADDRESS)
$(TARGET_CORE_OAT): $(TARGET_CORE_DEX) $(DEX2OAT_DEPENDENCY)
@echo "target dex2oat: $@ ($?)"
@mkdir -p $(dir $@)
- @rm -f $@
$(hide) $(DEX2OAT) --runtime-arg -Xms16m --runtime-arg -Xmx16m --image-classes=$(PRELOADED_CLASSES) $(addprefix --dex-file=,$(filter-out $(DEX2OAT),$^)) --oat=$@ --image=$(TARGET_CORE_IMG) --base=$(IMG_TARGET_BASE_ADDRESS) --host-prefix=$(PRODUCT_OUT)
$(HOST_CORE_IMG): $(HOST_CORE_OAT)
@@ -74,7 +72,6 @@
$(TARGET_BOOT_OAT): $(TARGET_BOOT_DEX) $(DEX2OAT_DEPENDENCY)
@echo "target dex2oat: $@ ($?)"
@mkdir -p $(dir $@)
- @rm -f $@
$(hide) $(DEX2OAT) --runtime-arg -Xms256m --runtime-arg -Xmx256m --image-classes=$(PRELOADED_CLASSES) $(addprefix --dex-file=,$(filter-out $(DEX2OAT),$^)) --oat=$@ --image=$(TARGET_BOOT_IMG) --base=$(IMG_TARGET_BASE_ADDRESS) --host-prefix=$(PRODUCT_OUT)
$(TARGET_BOOT_IMG): $(TARGET_BOOT_OAT)
diff --git a/build/Android.oattest.mk b/build/Android.oattest.mk
index 7d467bc..bb6695e 100644
--- a/build/Android.oattest.mk
+++ b/build/Android.oattest.mk
@@ -40,7 +40,6 @@
define build-art-oat
$(2): $(1) $(3) $(DEX2OAT_DEPENDENCY)
@echo "target dex2oat: $$@ ($$?)"
- @rm -f $$@
$(hide) $(DEX2OAT) --runtime-arg -Xms64m --runtime-arg -Xmx64m --boot-image=$(3) $(addprefix --dex-file=,$$<) --oat=$$@ --host-prefix=$(PRODUCT_OUT)
endef
diff --git a/src/dex2oat.cc b/src/dex2oat.cc
index eb77c72..4f11add 100644
--- a/src/dex2oat.cc
+++ b/src/dex2oat.cc
@@ -2,7 +2,6 @@
#include <stdio.h>
#include <stdlib.h>
-#include <sys/file.h>
#include <iostream>
#include <fstream>
@@ -68,37 +67,6 @@
exit(EXIT_FAILURE);
}
-class FileJanitor {
-public:
- FileJanitor(const std::string& filename, int fd)
- : filename_(filename), fd_(fd), do_unlink_(true) {
- }
-
- void KeepFile() {
- do_unlink_ = false;
- }
-
- ~FileJanitor() {
- if (fd_ != -1) {
- int rc = TEMP_FAILURE_RETRY(flock(fd_, LOCK_UN));
- if (rc == -1) {
- PLOG(ERROR) << "Failed to unlock " << filename_;
- }
- }
- if (do_unlink_) {
- int rc = TEMP_FAILURE_RETRY(unlink(filename_.c_str()));
- if (rc == -1) {
- PLOG(ERROR) << "Failed to unlink " << filename_;
- }
- }
- }
-
-private:
- std::string filename_;
- int fd_;
- bool do_unlink_;
-};
-
class Dex2Oat {
public:
@@ -461,63 +429,13 @@
}
}
- // Create the output file if we can, or open it read-only if we weren't first.
- bool did_create = true;
- int fd = open(oat_filename.c_str(), O_EXCL | O_CREAT | O_TRUNC | O_RDWR, 0666);
- if (fd == -1) {
- if (errno != EEXIST) {
- PLOG(ERROR) << "Unable to create oat file " << oat_filename;
- return EXIT_FAILURE;
- }
- did_create = false;
- fd = open(oat_filename.c_str(), O_RDONLY);
- if (fd == -1) {
- PLOG(ERROR) << "Unable to open oat file for reading " << oat_filename;
- return EXIT_FAILURE;
- }
+ // Check early that the result of compilation can be written
+ UniquePtr<File> oat_file(OS::OpenFile(oat_filename.c_str(), true));
+ if (oat_file.get() == NULL) {
+ PLOG(ERROR) << "Unable to create oat file " << oat_filename;
+ return EXIT_FAILURE;
}
-
- // Handles removing the file on failure and unlocking on both failure and success.
- FileJanitor oat_file_janitor(oat_filename, fd);
-
- // If we won the creation race, block trying to take the lock (since we're going to be doing
- // the work, we need the lock). If we lost the creation race, spin trying to take the lock
- // non-blocking until we fail -- at which point we know the other guy has the lock -- and then
- // block trying to take the now-taken lock.
- if (did_create) {
- LOG(INFO) << "This process created " << oat_filename;
- while (TEMP_FAILURE_RETRY(flock(fd, LOCK_EX)) != 0) {
- // Try again.
- }
- LOG(INFO) << "This process created and locked " << oat_filename;
- } else {
- LOG(INFO) << "Another process has already created " << oat_filename;
- while (TEMP_FAILURE_RETRY(flock(fd, LOCK_EX | LOCK_NB)) == 0) {
- // Give up the lock and hope the creator has taken the lock next time round.
- int rc = TEMP_FAILURE_RETRY(flock(fd, LOCK_UN));
- if (rc == -1) {
- PLOG(FATAL) << "Failed to unlock " << oat_filename;
- }
- }
- // Now a non-blocking attempt to take the lock has failed, we know the other guy has the
- // lock, so block waiting to take it.
- LOG(INFO) << "Another process is already working on " << oat_filename;
- if (TEMP_FAILURE_RETRY(flock(fd, LOCK_EX)) != 0) {
- PLOG(ERROR) << "Waiter unable to wait for creator to finish " << oat_filename;
- return EXIT_FAILURE;
- }
- // We have the lock and the creator has finished.
- // TODO: check the creator did a good job by checking the header.
- LOG(INFO) << "Another process finished working on " << oat_filename;
- // Job done.
- oat_file_janitor.KeepFile();
- return EXIT_SUCCESS;
- }
-
- // If we get this far, we won the creation race and have locked the file.
- UniquePtr<File> oat_file(OS::FileFromFd(oat_filename.c_str(), fd));
-
- LOG(INFO) << "dex2oat: " << oat_file->name();
+ LOG(INFO) << "dex2oat: " << oat_filename;
Runtime::Options options;
options.push_back(std::make_pair("compiler", reinterpret_cast<void*>(NULL)));
@@ -563,7 +481,6 @@
}
if (!image) {
- oat_file_janitor.KeepFile();
LOG(INFO) << "Oat file written successfully " << oat_filename;
return EXIT_SUCCESS;
}
@@ -577,7 +494,6 @@
}
// We wrote the oat file successfully, and want to keep it.
- oat_file_janitor.KeepFile();
LOG(INFO) << "Oat file written successfully " << oat_filename;
LOG(INFO) << "Image written successfully " << image_filename;
return EXIT_SUCCESS;
diff --git a/test/003-omnibus-opcodes/build b/test/003-omnibus-opcodes/build
index d5aa786..d127429 100644
--- a/test/003-omnibus-opcodes/build
+++ b/test/003-omnibus-opcodes/build
@@ -24,3 +24,4 @@
dx -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex classes
zip ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar classes.dex
+dex2oat --dex-file=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar --oat=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.oat
diff --git a/test/023-many-interfaces/build b/test/023-many-interfaces/build
index ebe722e..a5814e6 100644
--- a/test/023-many-interfaces/build
+++ b/test/023-many-interfaces/build
@@ -26,3 +26,4 @@
dx --debug --dex --dump-to=classes.lst --output=classes.dex classes
zip ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar classes.dex
+dex2oat --dex-file=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar --oat=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.oat
diff --git a/test/056-const-string-jumbo/build b/test/056-const-string-jumbo/build
index a563cd0..5f23407 100644
--- a/test/056-const-string-jumbo/build
+++ b/test/056-const-string-jumbo/build
@@ -42,6 +42,6 @@
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 --dump-to=classes.lst --output=classes.dex classes
zip ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar classes.dex
+dex2oat --dex-file=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar --oat=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.oat
diff --git a/test/085-old-style-inner-class/build b/test/085-old-style-inner-class/build
index b7e12ae..acd6316 100644
--- a/test/085-old-style-inner-class/build
+++ b/test/085-old-style-inner-class/build
@@ -23,7 +23,7 @@
${JAVAC} -source 1.4 -target 1.4 -d classes `find src -name '*.java'`
# Suppress stderr to keep the inner class warnings out of the expected output.
-dx --debug --dex --dump-to=classes.lst --output=classes.dex \
- --dump-width=1000 classes 2>/dev/null
+dx --debug --dex --dump-to=classes.lst --output=classes.dex --dump-width=1000 classes 2>/dev/null
zip ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar classes.dex
+dex2oat --dex-file=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar --oat=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.oat 2>/dev/null
diff --git a/test/etc/default-build b/test/etc/default-build
index e71db2a..1ab43af 100755
--- a/test/etc/default-build
+++ b/test/etc/default-build
@@ -24,20 +24,20 @@
${JAVAC} -d classes `find src2 -name '*.java'`
fi
-dx -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex \
- --dump-width=1000 classes
+dx -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex --dump-width=1000 classes
zip ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar classes.dex
+dex2oat --dex-file=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar --oat=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.oat
if [ -r src-ex ]; then
mkdir classes-ex
${JAVAC} -d classes-ex -cp classes `find src-ex -name '*.java'`
- dx -JXmx256m --debug --dex --dump-to=classes-ex.lst \
- --output=classes-ex.dex --dump-width=1000 classes-ex
+ dx -JXmx256m --debug --dex --dump-to=classes-ex.lst --output=classes-ex.dex --dump-width=1000 classes-ex
# quick shuffle so that the stored name is "classes.dex"
mv classes.dex classes-1.dex
mv classes-ex.dex classes.dex
zip ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME-ex.jar classes.dex
+ dex2oat --dex-file=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME-ex.jar --oat=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME-ex.oat
mv classes.dex classes-ex.dex
mv classes-1.dex classes.dex
fi
diff --git a/test/etc/push-and-run-test-jar b/test/etc/push-and-run-test-jar
index 1d10e4d..99b8c12 100755
--- a/test/etc/push-and-run-test-jar
+++ b/test/etc/push-and-run-test-jar
@@ -91,10 +91,14 @@
if [ "$QUIET" = "n" ]; then
adb push ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar /system/framework
+ adb push ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.oat /system/framework
adb push ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME-ex.jar /data/art-test
+ adb push ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME-ex.oat /data/art-test
else
adb push ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar /data/art-test >/dev/null 2>&1
+ adb push ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.oat /data/art-test >/dev/null 2>&1
adb push ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME-ex.jar /data/art-test >/dev/null 2>&1
+ adb push ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME-ex.oat /data/art-test >/dev/null 2>&1
fi
if [ "$DEBUG" = "y" ]; then