summaryrefslogtreecommitdiff
path: root/runtime/linear_alloc.h
diff options
context:
space:
mode:
author Lokesh Gidra <lokeshgidra@google.com> 2023-09-27 18:16:31 +0000
committer Lokesh Gidra <lokeshgidra@google.com> 2023-09-28 00:34:45 +0000
commit5c5890106a8555a40b33c0a90fc7341a8bce0b8e (patch)
treee0372330231a13d4a076a3e020f317cee4b9b5da /runtime/linear_alloc.h
parent70d8890650b13d6f7022a722acf14031bb2dd280 (diff)
Correct handling ArtMethod array during class linking
In case of userfaultfd, we were setting declaring_class_ of all ArtMethods to nullptr. This could cause problem if a GC is taking place simultaneously and it is visiting the ArtMethod array at the same time. Instead, we should convert the array to a 'no gc-root array' so that compaction code skips it. The marking-phase will simply skips it as it will no longer be pointed by the class. Bug: 301880194 Test: test infra Change-Id: I72007dd94ad71aa9ccc6005eb6d99b5a8c1ad7ee
Diffstat (limited to 'runtime/linear_alloc.h')
-rw-r--r--runtime/linear_alloc.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/runtime/linear_alloc.h b/runtime/linear_alloc.h
index c40af8ad46..c81077abfc 100644
--- a/runtime/linear_alloc.h
+++ b/runtime/linear_alloc.h
@@ -56,9 +56,13 @@ class TrackingHeader final {
bool Is16Aligned() const { return size_ & kIs16Aligned; }
private:
+ void SetKind(LinearAllocKind kind) { kind_ = kind; }
+
LinearAllocKind kind_;
uint32_t size_;
+ friend class LinearAlloc; // For SetKind()
+
DISALLOW_IMPLICIT_CONSTRUCTORS(TrackingHeader);
};
@@ -93,6 +97,9 @@ class LinearAlloc {
// Force arena allocator to ask for a new arena on next allocation. This
// is to preserve private/shared clean pages across zygote fork.
void SetupForPostZygoteFork(Thread* self) REQUIRES(!lock_);
+ // Convert the given allocated object into a `no GC-root` so that compaction
+ // skips it. Currently only used during class linking for ArtMethod array.
+ void ConvertToNoGcRoots(void* ptr, LinearAllocKind orig_kind);
// Return true if the linear alloc contains an address.
bool Contains(void* ptr) const REQUIRES(!lock_);