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