Commit 76f6c276 authored by Michael Lippautz's avatar Michael Lippautz Committed by V8 LUCI CQ

cppgc: Fix data race ObjectSizeTrait

Fix benign race in
  https://clusterfuzz.com/testcase-detail/5203237072076800

Change-Id: I558b230e4905a48342d8e7cf70d39be5a1b7fdb8
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3306375
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Commit-Queue: Omer Katz <omerkatz@chromium.org>
Auto-Submit: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: 's avatarOmer Katz <omerkatz@chromium.org>
Cr-Commit-Position: refs/heads/main@{#78121}
parent d4c751cb
...@@ -36,7 +36,7 @@ class ObjectSizeCounter : private HeapVisitor<ObjectSizeCounter> { ...@@ -36,7 +36,7 @@ class ObjectSizeCounter : private HeapVisitor<ObjectSizeCounter> {
private: private:
static size_t ObjectSize(const HeapObjectHeader& header) { static size_t ObjectSize(const HeapObjectHeader& header) {
return ObjectView(header).Size(); return ObjectView<>(header).Size();
} }
bool VisitHeapObjectHeader(HeapObjectHeader& header) { bool VisitHeapObjectHeader(HeapObjectHeader& header) {
......
...@@ -124,7 +124,7 @@ bool MarkingVerifierBase::VisitHeapObjectHeader(HeapObjectHeader& header) { ...@@ -124,7 +124,7 @@ bool MarkingVerifierBase::VisitHeapObjectHeader(HeapObjectHeader& header) {
} }
verifier_found_marked_bytes_ += verifier_found_marked_bytes_ +=
ObjectView(header).Size() + sizeof(HeapObjectHeader); ObjectView<>(header).Size() + sizeof(HeapObjectHeader);
verification_state_.SetCurrentParent(nullptr); verification_state_.SetCurrentParent(nullptr);
......
...@@ -14,8 +14,8 @@ namespace internal { ...@@ -14,8 +14,8 @@ namespace internal {
// static // static
size_t BaseObjectSizeTrait::GetObjectSizeForGarbageCollected( size_t BaseObjectSizeTrait::GetObjectSizeForGarbageCollected(
const void* object) { const void* object) {
return ObjectView(HeapObjectHeader::FromObject(object)) return ObjectView<AccessMode::kAtomic>(HeapObjectHeader::FromObject(object))
.Size<AccessMode::kAtomic>(); .Size();
} }
// static // static
......
...@@ -15,13 +15,13 @@ namespace internal { ...@@ -15,13 +15,13 @@ namespace internal {
// ObjectView allows accessing a header within the bounds of the actual object. // ObjectView allows accessing a header within the bounds of the actual object.
// It is not exposed externally and does not keep the underlying object alive. // It is not exposed externally and does not keep the underlying object alive.
template <AccessMode = AccessMode::kNonAtomic>
class ObjectView final { class ObjectView final {
public: public:
V8_INLINE explicit ObjectView(const HeapObjectHeader& header); V8_INLINE explicit ObjectView(const HeapObjectHeader& header);
V8_INLINE Address Start() const; V8_INLINE Address Start() const;
V8_INLINE ConstAddress End() const; V8_INLINE ConstAddress End() const;
template <AccessMode = AccessMode::kNonAtomic>
V8_INLINE size_t Size() const; V8_INLINE size_t Size() const;
private: private:
...@@ -30,25 +30,30 @@ class ObjectView final { ...@@ -30,25 +30,30 @@ class ObjectView final {
const bool is_large_object_; const bool is_large_object_;
}; };
ObjectView::ObjectView(const HeapObjectHeader& header) template <AccessMode access_mode>
ObjectView<access_mode>::ObjectView(const HeapObjectHeader& header)
: header_(header), : header_(header),
base_page_( base_page_(
BasePage::FromPayload(const_cast<HeapObjectHeader*>(&header_))), BasePage::FromPayload(const_cast<HeapObjectHeader*>(&header_))),
is_large_object_(header_.IsLargeObject()) { is_large_object_(header_.IsLargeObject<access_mode>()) {
DCHECK_EQ(Start() + Size(), End()); DCHECK_EQ(Start() + Size(), End());
} }
Address ObjectView::Start() const { return header_.ObjectStart(); } template <AccessMode access_mode>
Address ObjectView<access_mode>::Start() const {
return header_.ObjectStart();
}
ConstAddress ObjectView::End() const { template <AccessMode access_mode>
ConstAddress ObjectView<access_mode>::End() const {
return is_large_object_ ? LargePage::From(base_page_)->PayloadEnd() return is_large_object_ ? LargePage::From(base_page_)->PayloadEnd()
: header_.ObjectEnd(); : header_.ObjectEnd();
} }
template <AccessMode mode> template <AccessMode access_mode>
size_t ObjectView::Size() const { size_t ObjectView<access_mode>::Size() const {
return is_large_object_ ? LargePage::From(base_page_)->ObjectSize() return is_large_object_ ? LargePage::From(base_page_)->ObjectSize()
: header_.ObjectSize<mode>(); : header_.ObjectSize<access_mode>();
} }
} // namespace internal } // namespace internal
......
...@@ -32,7 +32,7 @@ namespace { ...@@ -32,7 +32,7 @@ namespace {
void TraceConservatively(ConservativeTracingVisitor* conservative_visitor, void TraceConservatively(ConservativeTracingVisitor* conservative_visitor,
const HeapObjectHeader& header) { const HeapObjectHeader& header) {
const auto object_view = ObjectView(header); const auto object_view = ObjectView<>(header);
Address* object = reinterpret_cast<Address*>(object_view.Start()); Address* object = reinterpret_cast<Address*>(object_view.Start());
for (size_t i = 0; i < (object_view.Size() / sizeof(Address)); ++i) { for (size_t i = 0; i < (object_view.Size() / sizeof(Address)); ++i) {
Address maybe_ptr = object[i]; Address maybe_ptr = object[i];
......
...@@ -207,7 +207,7 @@ class ObjectSizeCounter final : private HeapVisitor<ObjectSizeCounter> { ...@@ -207,7 +207,7 @@ class ObjectSizeCounter final : private HeapVisitor<ObjectSizeCounter> {
private: private:
static size_t ObjectSize(const HeapObjectHeader& header) { static size_t ObjectSize(const HeapObjectHeader& header) {
return ObjectView(header).Size(); return ObjectView<>(header).Size();
} }
bool VisitHeapObjectHeader(HeapObjectHeader& header) { bool VisitHeapObjectHeader(HeapObjectHeader& header) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment