1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_WRITE_BARRIER_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_WRITE_BARRIER_H_
#include <type_traits>
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
#include "third_party/blink/renderer/platform/wtf/type_traits.h"
#include "v8/include/cppgc/heap-consistency.h"
#include "v8/include/cppgc/member.h"
namespace blink {
class WriteBarrier final {
STATIC_ONLY(WriteBarrier);
using HeapConsistency = cppgc::subtle::HeapConsistency;
public:
template <typename T>
ALWAYS_INLINE static void DispatchForObject(T* element) {
static_assert(!WTF::IsMemberOrWeakMemberType<std::decay_t<T>>::value,
"Member and WeakMember should use the other overload.");
HeapConsistency::WriteBarrierParams params;
switch (HeapConsistency::GetWriteBarrierType(element, *element, params)) {
case HeapConsistency::WriteBarrierType::kMarking:
HeapConsistency::DijkstraWriteBarrier(params, *element);
break;
case HeapConsistency::WriteBarrierType::kGenerational:
HeapConsistency::GenerationalBarrier(params, element);
break;
case HeapConsistency::WriteBarrierType::kNone:
break;
}
}
// Cannot refer to blink::Member and friends here due to cyclic includes.
template <typename T,
typename WeaknessTag,
typename StorageType,
typename WriteBarrierPolicy,
typename CheckingPolicy>
ALWAYS_INLINE static void DispatchForObject(
cppgc::internal::BasicMember<T,
WeaknessTag,
StorageType,
WriteBarrierPolicy,
CheckingPolicy>* element) {
HeapConsistency::WriteBarrierParams params;
switch (HeapConsistency::GetWriteBarrierType(*element, params)) {
case HeapConsistency::WriteBarrierType::kMarking:
HeapConsistency::DijkstraWriteBarrier(params, element->Get());
break;
case HeapConsistency::WriteBarrierType::kGenerational:
HeapConsistency::GenerationalBarrier(params, element);
break;
case HeapConsistency::WriteBarrierType::kNone:
break;
}
}
// Cannot refer to blink::Member and friends here due to cyclic includes.
template <typename T,
typename WeaknessTag,
typename StorageType,
typename WriteBarrierPolicy,
typename CheckingPolicy>
ALWAYS_INLINE static bool IsWriteBarrierNeeded(
cppgc::internal::BasicMember<T,
WeaknessTag,
StorageType,
WriteBarrierPolicy,
CheckingPolicy>* element) {
HeapConsistency::WriteBarrierParams params;
return HeapConsistency::GetWriteBarrierType(*element, params) !=
HeapConsistency::WriteBarrierType::kNone;
}
static void DispatchForUncompressedSlot(void* slot, void* value) {
HeapConsistency::WriteBarrierParams params;
switch (HeapConsistency::GetWriteBarrierType(slot, value, params)) {
case HeapConsistency::WriteBarrierType::kMarking:
HeapConsistency::DijkstraWriteBarrier(params, value);
break;
case HeapConsistency::WriteBarrierType::kGenerational:
HeapConsistency::GenerationalBarrierForUncompressedSlot(params, slot);
break;
case HeapConsistency::WriteBarrierType::kNone:
break;
}
}
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_WRITE_BARRIER_H_
|