diff options
| author | 2025-01-28 09:44:08 -0800 | |
|---|---|---|
| committer | 2025-01-28 09:44:08 -0800 | |
| commit | 3b9b007da909be40a25dbd06ae517eca4cfe561c (patch) | |
| tree | dc344fddb8ed2df09a3a0b0b98f8e98e2afef5ba | |
| parent | 5341b4ccb266021091cba068cbf7d32530048d9e (diff) | |
| parent | 5d9ac04ec75265c77c4346148f60a50bd1e36fc9 (diff) | |
Avoid deflating monitors in the zygote space. am: 6ddb3569b3 am: 5d9ac04ec7
Original change: https://android-review.googlesource.com/c/platform/art/+/3465074
Change-Id: I157c181f0ce8d99f91d8ad23fb78562f559f812f
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
| -rw-r--r-- | runtime/gc/heap.h | 5 | ||||
| -rw-r--r-- | runtime/monitor.cc | 10 |
2 files changed, 14 insertions, 1 deletions
diff --git a/runtime/gc/heap.h b/runtime/gc/heap.h index 28179811bd..5d9fb1b647 100644 --- a/runtime/gc/heap.h +++ b/runtime/gc/heap.h @@ -40,6 +40,7 @@ #include "gc/gc_cause.h" #include "gc/space/large_object_space.h" #include "gc/space/space.h" +#include "gc/space/zygote_space.h" #include "handle.h" #include "obj_ptr.h" #include "offsets.h" @@ -821,6 +822,10 @@ class Heap { return zygote_space_ != nullptr; } + bool IsInZygoteSpace(const mirror::Object* obj) const { + return zygote_space_ != nullptr && zygote_space_->Contains(obj); + } + // Returns the active concurrent copying collector. collector::ConcurrentCopying* ConcurrentCopyingCollector() { DCHECK(gUseReadBarrier); diff --git a/runtime/monitor.cc b/runtime/monitor.cc index e03b470805..7aba2a4504 100644 --- a/runtime/monitor.cc +++ b/runtime/monitor.cc @@ -1694,9 +1694,16 @@ size_t MonitorList::Size() { class MonitorDeflateVisitor : public IsMarkedVisitor { public: - MonitorDeflateVisitor() : self_(Thread::Current()), deflate_count_(0) {} + MonitorDeflateVisitor() + : self_(Thread::Current()), deflate_count_(0), heap_(Runtime::Current()->GetHeap()) {} mirror::Object* IsMarked(mirror::Object* object) override REQUIRES(Locks::mutator_lock_) { + // Avoid deflating monitors in zygote/image spaces because that could + // end up dirtying otherwise shared/clean memory. + if (heap_->IsInZygoteSpace(object) || heap_->ObjectIsInBootImageSpace(object)) { + return object; // Monitor was not deflated. + } + if (Monitor::Deflate(self_, object)) { DCHECK_NE(object->GetLockWord(true).GetState(), LockWord::kFatLocked); ++deflate_count_; @@ -1708,6 +1715,7 @@ class MonitorDeflateVisitor : public IsMarkedVisitor { Thread* const self_; size_t deflate_count_; + gc::Heap* heap_; }; size_t MonitorList::DeflateMonitors() { |