summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Richard Uhler <ruhler@google.com> 2025-01-28 09:44:08 -0800
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2025-01-28 09:44:08 -0800
commit3b9b007da909be40a25dbd06ae517eca4cfe561c (patch)
treedc344fddb8ed2df09a3a0b0b98f8e98e2afef5ba
parent5341b4ccb266021091cba068cbf7d32530048d9e (diff)
parent5d9ac04ec75265c77c4346148f60a50bd1e36fc9 (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.h5
-rw-r--r--runtime/monitor.cc10
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() {