v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
prefinalizer-handler.cc
Go to the documentation of this file.
1
// Copyright 2020 the V8 project authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file.
4
5
#include "
src/heap/cppgc/prefinalizer-handler.h
"
6
7
#include <algorithm>
8
#include <memory>
9
10
#include "
src/base/platform/platform.h
"
11
#include "
src/heap/cppgc/heap-page.h
"
12
#include "
src/heap/cppgc/heap.h
"
13
#include "
src/heap/cppgc/liveness-broker.h
"
14
#include "
src/heap/cppgc/stats-collector.h
"
15
16
namespace
cppgc
{
17
namespace
internal
{
18
19
PrefinalizerRegistration::PrefinalizerRegistration
(
void
*
object
,
20
Callback
callback
) {
21
auto
* page =
BasePage::FromPayload
(
object
);
22
DCHECK
(!page->space().is_compactable());
23
page->heap().prefinalizer_handler()->RegisterPrefinalizer({object,
callback
});
24
}
25
26
bool
PreFinalizer::operator==
(
const
PreFinalizer
& other)
const
{
27
return
(
object
== other.object) && (
callback
== other.callback);
28
}
29
30
PreFinalizerHandler::PreFinalizerHandler
(
HeapBase
&
heap
)
31
: current_ordered_pre_finalizers_(&ordered_pre_finalizers_),
32
heap_
(
heap
)
33
{
34
DCHECK
(
CurrentThreadIsCreationThread
());
35
}
36
37
void
PreFinalizerHandler::RegisterPrefinalizer
(
PreFinalizer
pre_finalizer) {
38
DCHECK
(
CurrentThreadIsCreationThread
());
39
DCHECK_EQ
(
ordered_pre_finalizers_
.end(),
40
std::find(
ordered_pre_finalizers_
.begin(),
41
ordered_pre_finalizers_
.end(), pre_finalizer));
42
DCHECK_EQ
(
current_ordered_pre_finalizers_
->end(),
43
std::find(
current_ordered_pre_finalizers_
->begin(),
44
current_ordered_pre_finalizers_
->end(), pre_finalizer));
45
current_ordered_pre_finalizers_
->push_back(pre_finalizer);
46
}
47
48
void
PreFinalizerHandler::InvokePreFinalizers
() {
49
StatsCollector::EnabledScope
stats_scope(
heap_
.
stats_collector
(),
50
StatsCollector::kAtomicSweep);
51
StatsCollector::EnabledScope
nested_stats_scope(
52
heap_
.
stats_collector
(), StatsCollector::kSweepInvokePreFinalizers);
53
54
DCHECK
(
CurrentThreadIsCreationThread
());
55
LivenessBroker
liveness_broker =
LivenessBrokerFactory::Create
();
56
is_invoking_
=
true
;
57
DCHECK_EQ
(0u,
bytes_allocated_in_prefinalizers
);
58
// Reset all LABs to force allocations to the slow path for black allocation.
59
// This also ensures that a CHECK() hits in case prefinalizers allocate in the
60
// configuration that prohibits this.
61
heap_
.
object_allocator
().
ResetLinearAllocationBuffers
();
62
// Prefinalizers can allocate other objects with prefinalizers, which will
63
// modify ordered_pre_finalizers_ and break iterators.
64
std::vector<PreFinalizer> new_ordered_pre_finalizers;
65
current_ordered_pre_finalizers_
= &new_ordered_pre_finalizers;
66
ordered_pre_finalizers_
.erase(
67
ordered_pre_finalizers_
.begin(),
68
std::remove_if(
ordered_pre_finalizers_
.rbegin(),
69
ordered_pre_finalizers_
.rend(),
70
[liveness_broker](
const
PreFinalizer
& pf) {
71
return (pf.callback)(liveness_broker, pf.object);
72
})
73
.base());
74
#ifndef CPPGC_ALLOW_ALLOCATIONS_IN_PREFINALIZERS
75
CHECK
(new_ordered_pre_finalizers.empty());
76
#else
// CPPGC_ALLOW_ALLOCATIONS_IN_PREFINALIZERS
77
// Newly added objects with prefinalizers will always survive the current GC
78
// cycle, so it's safe to add them after clearing out the older prefinalizers.
79
ordered_pre_finalizers_
.insert(
ordered_pre_finalizers_
.end(),
80
new_ordered_pre_finalizers.begin(),
81
new_ordered_pre_finalizers.end());
82
#endif
// CPPGC_ALLOW_ALLOCATIONS_IN_PREFINALIZERS
83
current_ordered_pre_finalizers_
= &
ordered_pre_finalizers_
;
84
is_invoking_
=
false
;
85
ordered_pre_finalizers_
.shrink_to_fit();
86
}
87
88
bool
PreFinalizerHandler::CurrentThreadIsCreationThread
() {
89
#ifdef DEBUG
90
return
heap_
.
CurrentThreadIsHeapThread
();
91
#else
92
return
true
;
93
#endif
94
}
95
96
void
PreFinalizerHandler::NotifyAllocationInPrefinalizer
(
size_t
size) {
97
DCHECK_GT
(
bytes_allocated_in_prefinalizers
+ size,
98
bytes_allocated_in_prefinalizers
);
99
bytes_allocated_in_prefinalizers
+=
size
;
100
}
101
102
}
// namespace internal
103
}
// namespace cppgc
cppgc::LivenessBroker
Definition
liveness-broker.h:44
cppgc::internal::BasePage::FromPayload
static BasePage * FromPayload(void *)
Definition
heap-page.h:314
cppgc::internal::HeapBase
Definition
heap-base.h:82
cppgc::internal::HeapBase::CurrentThreadIsHeapThread
virtual bool CurrentThreadIsHeapThread() const
Definition
heap-base.cc:351
cppgc::internal::HeapBase::stats_collector
StatsCollector * stats_collector()
Definition
heap-base.h:118
cppgc::internal::HeapBase::object_allocator
ObjectAllocator & object_allocator()
Definition
heap-base.h:135
cppgc::internal::LivenessBrokerFactory::Create
static LivenessBroker Create()
Definition
liveness-broker.cc:18
cppgc::internal::ObjectAllocator::ResetLinearAllocationBuffers
void ResetLinearAllocationBuffers()
Definition
object-allocator.cc:331
cppgc::internal::PreFinalizerHandler::bytes_allocated_in_prefinalizers
size_t bytes_allocated_in_prefinalizers
Definition
prefinalizer-handler.h:57
cppgc::internal::PreFinalizerHandler::heap_
HeapBase & heap_
Definition
prefinalizer-handler.h:53
cppgc::internal::PreFinalizerHandler::PreFinalizerHandler
PreFinalizerHandler(HeapBase &heap)
Definition
prefinalizer-handler.cc:30
cppgc::internal::PreFinalizerHandler::CurrentThreadIsCreationThread
bool CurrentThreadIsCreationThread()
Definition
prefinalizer-handler.cc:88
cppgc::internal::PreFinalizerHandler::RegisterPrefinalizer
void RegisterPrefinalizer(PreFinalizer pre_finalizer)
Definition
prefinalizer-handler.cc:37
cppgc::internal::PreFinalizerHandler::is_invoking_
bool is_invoking_
Definition
prefinalizer-handler.h:54
cppgc::internal::PreFinalizerHandler::current_ordered_pre_finalizers_
std::vector< PreFinalizer > * current_ordered_pre_finalizers_
Definition
prefinalizer-handler.h:51
cppgc::internal::PreFinalizerHandler::ordered_pre_finalizers_
std::vector< PreFinalizer > ordered_pre_finalizers_
Definition
prefinalizer-handler.h:50
cppgc::internal::PreFinalizerHandler::NotifyAllocationInPrefinalizer
void NotifyAllocationInPrefinalizer(size_t)
Definition
prefinalizer-handler.cc:96
cppgc::internal::PreFinalizerHandler::InvokePreFinalizers
void InvokePreFinalizers()
Definition
prefinalizer-handler.cc:48
cppgc::internal::PrefinalizerRegistration::Callback
bool(*)(const cppgc::LivenessBroker &, void *) Callback
Definition
prefinalizer.h:17
cppgc::internal::PrefinalizerRegistration::PrefinalizerRegistration
PrefinalizerRegistration(void *, Callback)
Definition
prefinalizer-handler.cc:19
cppgc::internal::StatsCollector::InternalScope
Definition
stats-collector.h:175
heap-page.h
callback
TNode< Object > callback
Definition
js-call-reducer.cc:1499
cppgc
Definition
cross-heap-remembered-set.h:14
heap
Definition
platform.h:72
v8::internal::internal
internal
Definition
wasm-objects-inl.h:458
prefinalizer-handler.h
size
int size
Definition
setup-heap-internal.cc:131
CHECK
#define CHECK(condition)
Definition
logging.h:124
DCHECK
#define DCHECK(condition)
Definition
logging.h:482
DCHECK_EQ
#define DCHECK_EQ(v1, v2)
Definition
logging.h:485
DCHECK_GT
#define DCHECK_GT(v1, v2)
Definition
logging.h:487
platform.h
heap.h
liveness-broker.h
stats-collector.h
cppgc::internal::PreFinalizer
Definition
prefinalizer-handler.h:18
cppgc::internal::PreFinalizer::operator==
bool operator==(const PreFinalizer &other) const
Definition
prefinalizer-handler.cc:26
cppgc::internal::PreFinalizer::callback
Callback callback
Definition
prefinalizer-handler.h:22
heap_
Heap * heap_
Definition
traced-handles.cc:476
src
heap
cppgc
prefinalizer-handler.cc
Generated on Sun Apr 6 2025 21:08:54 for v8 by
1.12.0