Use reader writer mutex for safe checkcast map.
Use a ReaderWriterMutex to protect MethodVerifier::safecast_map_ like
what's done for MethodVerifier::dex_gc_maps_ and MethodVerifier::devirt_maps_.
Change-Id: Id2ac9c290cc524eb992ea7cabe63766e88753747
(cherry picked from commit b9c37fb5746cc240e86677e56cb0d74d829e3504)
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc
index d10dc73..139f7ee 100644
--- a/runtime/verifier/method_verifier.cc
+++ b/runtime/verifier/method_verifier.cc
@@ -4061,20 +4061,19 @@
void MethodVerifier::SetSafeCastMap(MethodReference ref, const MethodSafeCastSet* cast_set) {
DCHECK(Runtime::Current()->IsCompiler());
- MutexLock mu(Thread::Current(), *safecast_map_lock_);
+ WriterMutexLock mu(Thread::Current(), *safecast_map_lock_);
SafeCastMap::iterator it = safecast_map_->find(ref);
if (it != safecast_map_->end()) {
delete it->second;
safecast_map_->erase(it);
}
-
safecast_map_->Put(ref, cast_set);
DCHECK(safecast_map_->find(ref) != safecast_map_->end());
}
bool MethodVerifier::IsSafeCast(MethodReference ref, uint32_t pc) {
DCHECK(Runtime::Current()->IsCompiler());
- MutexLock mu(Thread::Current(), *safecast_map_lock_);
+ ReaderMutexLock mu(Thread::Current(), *safecast_map_lock_);
SafeCastMap::const_iterator it = safecast_map_->find(ref);
if (it == safecast_map_->end()) {
return false;
@@ -4186,7 +4185,7 @@
ReaderWriterMutex* MethodVerifier::dex_gc_maps_lock_ = NULL;
MethodVerifier::DexGcMapTable* MethodVerifier::dex_gc_maps_ = NULL;
-Mutex* MethodVerifier::safecast_map_lock_ = NULL;
+ReaderWriterMutex* MethodVerifier::safecast_map_lock_ = NULL;
MethodVerifier::SafeCastMap* MethodVerifier::safecast_map_ = NULL;
ReaderWriterMutex* MethodVerifier::devirt_maps_lock_ = NULL;
@@ -4204,9 +4203,9 @@
dex_gc_maps_ = new MethodVerifier::DexGcMapTable;
}
- safecast_map_lock_ = new Mutex("verifier Cast Elision lock");
+ safecast_map_lock_ = new ReaderWriterMutex("verifier Cast Elision lock");
{
- MutexLock mu(self, *safecast_map_lock_);
+ WriterMutexLock mu(self, *safecast_map_lock_);
safecast_map_ = new MethodVerifier::SafeCastMap();
}
@@ -4239,7 +4238,7 @@
dex_gc_maps_lock_ = NULL;
{
- MutexLock mu(self, *safecast_map_lock_);
+ WriterMutexLock mu(self, *safecast_map_lock_);
STLDeleteValues(safecast_map_);
delete safecast_map_;
safecast_map_ = NULL;
diff --git a/runtime/verifier/method_verifier.h b/runtime/verifier/method_verifier.h
index 3f98a00..5c06cd5 100644
--- a/runtime/verifier/method_verifier.h
+++ b/runtime/verifier/method_verifier.h
@@ -640,7 +640,7 @@
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
static void SetSafeCastMap(MethodReference ref, const MethodSafeCastSet* mscs);
LOCKS_EXCLUDED(safecast_map_lock_);
- static Mutex* safecast_map_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
+ static ReaderWriterMutex* safecast_map_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
static SafeCastMap* safecast_map_ GUARDED_BY(safecast_map_lock_);
// Devirtualization map.