From aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4 Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Fri, 5 Sep 2014 14:01:17 +0100 Subject: Improve dex location canonicalization-related performance. Eagerly add canonical dex file locations to the OatFile's primary lookup map in Setup(). This moves the boot.oat work from every app startup to the zygote initialization. Since we always ended up initializing the canonical location map anyway due to the way that we're loading dex files, the lazy initialization didn't save anything. Clean up dex file name canonicalization to make sure we free() the memory returned by realpath() rather than using std::unique_ptr<> with the default deleter. Avoid some unnecessary duplicate OatDexFile lookups. Bug: 16828525 Bug: 17346103 Change-Id: Id8fbc8992f62996138eb2006a0046c6529747c09 --- runtime/oat_file.h | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) (limited to 'runtime/oat_file.h') diff --git a/runtime/oat_file.h b/runtime/oat_file.h index 8cb47e20b8..2fd4f4c98a 100644 --- a/runtime/oat_file.h +++ b/runtime/oat_file.h @@ -214,6 +214,10 @@ class OatFile { // Opens the DexFile referred to by this OatDexFile from within the containing OatFile. const DexFile* OpenDexFile(std::string* error_msg) const; + const OatFile* GetOatFile() const { + return oat_file_; + } + // Returns the size of the DexFile refered to by this OatDexFile. size_t FileSize() const; @@ -222,6 +226,11 @@ class OatFile { return dex_file_location_; } + // Returns the canonical location of DexFile that was the source of this OatDexFile. + const std::string& GetCanonicalDexFileLocation() const { + return canonical_dex_file_location_; + } + // Returns checksum of original DexFile that was the source of this OatDexFile; uint32_t GetDexFileLocationChecksum() const { return dex_file_location_checksum_; @@ -235,12 +244,14 @@ class OatFile { private: OatDexFile(const OatFile* oat_file, const std::string& dex_file_location, + const std::string& canonical_dex_file_location, uint32_t dex_file_checksum, const byte* dex_file_pointer, const uint32_t* oat_class_offsets_pointer); const OatFile* const oat_file_; const std::string dex_file_location_; + const std::string canonical_dex_file_location_; const uint32_t dex_file_location_checksum_; const byte* const dex_file_pointer_; const uint32_t* const oat_class_offsets_pointer_; @@ -254,7 +265,9 @@ class OatFile { bool exception_if_not_found = true) const LOCKS_EXCLUDED(secondary_lookup_lock_); - std::vector GetOatDexFiles() const; + const std::vector& GetOatDexFiles() const { + return oat_dex_files_storage_; + } size_t Size() const { return End() - Begin(); @@ -307,6 +320,9 @@ class OatFile { // dlopen handle during runtime. void* dlopen_handle_; + // Owning storage for the OatDexFile objects. + std::vector oat_dex_files_storage_; + // NOTE: We use a StringPiece as the key type to avoid a memory allocation on every // lookup with a const char* key. The StringPiece doesn't own its backing storage, // therefore we're using the OatDexFile::dex_file_location_ as the backing storage @@ -314,11 +330,11 @@ class OatFile { // of keys in secondary_oat_dex_files_ and oat_dex_files_by_canonical_location_. typedef AllocationTrackingSafeMap Table; - // Map each plain dex file location retrieved from the oat file to its OatDexFile. - // This map doesn't change after it's constructed in Setup() and therefore doesn't - // need any locking and provides the cheapest dex file lookup for GetOatDexFile() - // for a very frequent use case. Never contains a nullptr value. - Table oat_dex_files_; // Owns the OatDexFile* values. + // Map each location and canonical location (if different) retrieved from the + // oat file to its OatDexFile. This map doesn't change after it's constructed in Setup() + // and therefore doesn't need any locking and provides the cheapest dex file lookup + // for GetOatDexFile() for a very frequent use case. Never contains a nullptr value. + Table oat_dex_files_; // Lock guarding all members needed for secondary lookup in GetOatDexFile(). mutable Mutex secondary_lookup_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; @@ -329,10 +345,6 @@ class OatFile { // location and use oat_dex_files_by_canonical_location_. mutable Table secondary_oat_dex_files_ GUARDED_BY(secondary_lookup_lock_); - // Map the canonical location to an OatDexFile. This lazily constructed map is used - // when we're doing the secondary lookup for a given location for the first time. - mutable Table oat_dex_files_by_canonical_location_ GUARDED_BY(secondary_lookup_lock_); - // Cache of strings. Contains the backing storage for keys in the secondary_oat_dex_files_ // and the lazily initialized oat_dex_files_by_canonical_location_. // NOTE: We're keeping references to contained strings in form of StringPiece and adding -- cgit v1.2.3