Revert "Add thread-shared interpreter cache"
This reverts commit fa40e6e318b21d4a1885a6ffea6efc3c0b5cc1cd.
Reason for revert: Seeing several different failures that appear related, both test failures and b/214850618. And it appears a potentially significant unresolved comment was overlooked.
Change-Id: I2b5260ac7f2168831f0d1b0d7c76b70ecc1fb77d
diff --git a/runtime/interpreter/mterp/nterp.cc b/runtime/interpreter/mterp/nterp.cc
index d49260e..670ae1b 100644
--- a/runtime/interpreter/mterp/nterp.cc
+++ b/runtime/interpreter/mterp/nterp.cc
@@ -24,7 +24,6 @@
#include "dex/dex_instruction_utils.h"
#include "debugger.h"
#include "entrypoints/entrypoint_utils-inl.h"
-#include "interpreter/interpreter_cache-inl.h"
#include "interpreter/interpreter_common.h"
#include "interpreter/interpreter_intrinsics.h"
#include "interpreter/shadow_frame-inl.h"
@@ -94,7 +93,12 @@
template<typename T>
inline void UpdateCache(Thread* self, uint16_t* dex_pc_ptr, T value) {
DCHECK(kUseReadBarrier) << "Nterp only works with read barriers";
- self->GetInterpreterCache()->Set(self, dex_pc_ptr, value);
+ // For simplicity, only update the cache if weak ref accesses are enabled. If
+ // they are disabled, this means the GC is processing the cache, and is
+ // reading it concurrently.
+ if (self->GetWeakRefAccessEnabled()) {
+ self->GetInterpreterCache()->Set(dex_pc_ptr, value);
+ }
}
template<typename T>
@@ -248,7 +252,7 @@
}
FLATTEN
-extern "C" size_t NterpGetMethodSlowPath(Thread* self, ArtMethod* caller, uint16_t* dex_pc_ptr)
+extern "C" size_t NterpGetMethod(Thread* self, ArtMethod* caller, uint16_t* dex_pc_ptr)
REQUIRES_SHARED(Locks::mutator_lock_) {
UpdateHotness(caller);
const Instruction* inst = Instruction::At(dex_pc_ptr);
@@ -406,16 +410,6 @@
}
}
-extern "C" size_t NterpGetMethod(Thread* self, ArtMethod* caller, uint16_t* dex_pc_ptr)
- REQUIRES_SHARED(Locks::mutator_lock_) {
- InterpreterCache* cache = self->GetInterpreterCache();
- size_t cached_value;
- if (LIKELY(cache->Get</*kSkipThreadLocal=*/true>(self, dex_pc_ptr, &cached_value))) {
- return cached_value;
- }
- return NterpGetMethodSlowPath(self, caller, dex_pc_ptr); // Tail call.
-}
-
FLATTEN
static ArtField* ResolveFieldWithAccessChecks(Thread* self,
ClassLinker* class_linker,
@@ -465,10 +459,10 @@
return resolved_field;
}
-extern "C" size_t NterpGetStaticFieldSlowPath(Thread* self,
- ArtMethod* caller,
- uint16_t* dex_pc_ptr,
- size_t resolve_field_type) // Resolve if not zero
+extern "C" size_t NterpGetStaticField(Thread* self,
+ ArtMethod* caller,
+ uint16_t* dex_pc_ptr,
+ size_t resolve_field_type) // Resolve if not zero
REQUIRES_SHARED(Locks::mutator_lock_) {
UpdateHotness(caller);
const Instruction* inst = Instruction::At(dex_pc_ptr);
@@ -508,25 +502,10 @@
}
}
-extern "C" size_t NterpGetStaticField(Thread* self,
- ArtMethod* caller,
- uint16_t* dex_pc_ptr,
- size_t resolve_field_type) // Resolve if not zero
- REQUIRES_SHARED(Locks::mutator_lock_) {
- InterpreterCache* cache = self->GetInterpreterCache();
- size_t cached_value;
- if (LIKELY(cache->Get</*kSkipThreadLocal=*/true>(self, dex_pc_ptr, &cached_value))) {
- return cached_value;
- }
- return NterpGetStaticFieldSlowPath(self, caller, dex_pc_ptr, resolve_field_type);
-}
-
-
-extern "C" uint32_t NterpGetInstanceFieldOffsetSlowPath(
- Thread* self,
- ArtMethod* caller,
- uint16_t* dex_pc_ptr,
- size_t resolve_field_type) // Resolve if not zero
+extern "C" uint32_t NterpGetInstanceFieldOffset(Thread* self,
+ ArtMethod* caller,
+ uint16_t* dex_pc_ptr,
+ size_t resolve_field_type) // Resolve if not zero
REQUIRES_SHARED(Locks::mutator_lock_) {
UpdateHotness(caller);
const Instruction* inst = Instruction::At(dex_pc_ptr);
@@ -553,19 +532,6 @@
return resolved_field->GetOffset().Uint32Value();
}
-extern "C" uint32_t NterpGetInstanceFieldOffset(Thread* self,
- ArtMethod* caller,
- uint16_t* dex_pc_ptr,
- size_t resolve_field_type) // Resolve if not zero
- REQUIRES_SHARED(Locks::mutator_lock_) {
- InterpreterCache* cache = self->GetInterpreterCache();
- size_t cached_value;
- if (LIKELY(cache->Get</*kSkipThreadLocal=*/true>(self, dex_pc_ptr, &cached_value))) {
- return cached_value;
- }
- return NterpGetInstanceFieldOffsetSlowPath(self, caller, dex_pc_ptr, resolve_field_type);
-}
-
extern "C" mirror::Object* NterpGetClassOrAllocateObject(Thread* self,
ArtMethod* caller,
uint16_t* dex_pc_ptr)