34 DCHECK(AllowGarbageCollection::IsAllowed());
118 std::make_unique<GlobalSafepointInterruptTask>(
heap_));
127 const bool is_initiator =
isolate() == initiator;
140 local_heap = local_heap->
next_) {
141 if (local_heap->is_main_thread() &&
147 local_heap->state_.SetSafepointRequested();
151 pthread_override_t qos_override =
nullptr;
153 if (
v8_flags.safepoint_bump_qos_class) {
156 qos_override = pthread_override_qos_class_start_np(
157 local_heap->thread_handle(), QOS_CLASS_USER_INTERACTIVE, 0);
161 running_local_heaps.
emplace_back(local_heap, qos_override);
167 local_heap->is_main_thread());
204 local_heap = local_heap->
next_) {
205 if (local_heap->is_main_thread() &&
211 local_heap->state_.ClearSafepointRequested();
216 local_heap->is_main_thread());
243 cv_resume_.NotifyAll();
250 size_t running_count = running_local_heaps.
size();
251 while (stopped_ < running_count) {
252 cv_stopped_.Wait(&
mutex_);
255 if (
v8_flags.safepoint_bump_qos_class) {
256 for (
auto& running_local_heap : running_local_heaps) {
258 pthread_override_qos_class_end_np(running_local_heap.qos_override),
270 cv_stopped_.NotifyOne();
274 const auto scoped_blocking_call =
279 cv_stopped_.NotifyOne();
287 const auto scoped_blocking_call =
299 current = current->
next_) {
300 current->handles()->Iterate(visitor);
316 : safepoint_(
heap->safepoint()) {
325 : shared_space_isolate_(isolate) {}
381 initiator->
counters()->gc_time_to_global_safepoint());
383 GCTracer::Scope::TIME_TO_GLOBAL_SAFEPOINT);
385 std::vector<PerClientSafepointData> clients;
390 clients.emplace_back(client);
392 initiator, &clients.back());
398 if (client.is_locked())
continue;
399 client.safepoint()->InitiateGlobalSafepointScope(initiator, &client);
411 DCHECK(client.is_locked());
412 client.safepoint()->WaitUntilRunningThreadsInSafepoint(&client);
437 : initiator_(initiator),
438 shared_space_isolate_(initiator->shared_space_isolate()) {
void PostTask(std::unique_ptr< Task > task, const SourceLocation &location=SourceLocation::Current())
bool TryLock() V8_WARN_UNUSED_RESULT
V8_INLINE void AssertHeld() const
void emplace_back(Args &&... args)
Isolate * isolate() const
GlobalSafepointInterruptTask & operator=(const GlobalSafepointInterruptTask &)=delete
~GlobalSafepointInterruptTask() override=default
GlobalSafepointInterruptTask(Heap *heap)
void RunInternal() override
GlobalSafepointInterruptTask(const GlobalSafepointInterruptTask &)=delete
V8_EXPORT_PRIVATE GlobalSafepointScope(Isolate *initiator)
Isolate *const shared_space_isolate_
V8_EXPORT_PRIVATE ~GlobalSafepointScope()
Isolate *const initiator_
void IterateSharedSpaceAndClientIsolates(Callback callback)
void RemoveClient(Isolate *client)
GlobalSafepoint(Isolate *isolate)
int active_safepoint_scopes_
base::RecursiveMutex clients_mutex_
void AssertNoClientsOnTearDown()
void AppendClient(Isolate *client)
V8_EXPORT_PRIVATE bool IsRequestedForTesting()
void LeaveGlobalSafepointScope(Isolate *initiator)
void EnterGlobalSafepointScope(Isolate *initiator)
Isolate *const shared_space_isolate_
HeapState gc_state() const
LocalHeap * main_thread_local_heap()
std::shared_ptr< v8::TaskRunner > GetForegroundTaskRunner(TaskPriority priority=TaskPriority::kUserBlocking) const
IsolateSafepoint * safepoint()
Isolate * isolate() const
V8_EXPORT_PRIVATE ~IsolateSafepointScope()
IsolateSafepoint * safepoint_
V8_EXPORT_PRIVATE IsolateSafepointScope(Heap *heap)
void WaitUntilRunningThreadsInSafepoint(const IsolateSafepoint::RunningLocalHeaps &running_threads)
Isolate * shared_space_isolate() const
IsolateSafepoint(Heap *heap)
IncludeMainThread ShouldIncludeMainThread(Isolate *initiator)
V8_EXPORT_PRIVATE void AssertMainThreadIsOnlyThread()
void ClearSafepointRequestedFlags(IncludeMainThread include_main_thread)
void InitiateGlobalSafepointScope(Isolate *initiator, PerClientSafepointData *client_data)
LocalHeap * local_heaps_head_
void TryInitiateGlobalSafepointScope(Isolate *initiator, PerClientSafepointData *client_data)
base::RecursiveMutex local_heaps_mutex_
int active_safepoint_scopes_
void LeaveGlobalSafepointScope(Isolate *initiator)
void InitiateGlobalSafepointScopeRaw(Isolate *initiator, PerClientSafepointData *client_data)
Isolate * isolate() const
void EnterLocalSafepointScope()
void WaitUntilRunningThreadsInSafepoint(const PerClientSafepointData *client_data)
void Iterate(RootVisitor *visitor)
void LeaveLocalSafepointScope()
void SetSafepointRequestedFlags(IncludeMainThread include_main_thread, IsolateSafepoint::RunningLocalHeaps &running_local_heaps)
void LockMutex(LocalHeap *local_heap)
bool is_shared_space_isolate() const
GlobalSafepoint * global_safepoint() const
Isolate * global_safepoint_next_client_isolate_
StackGuard * stack_guard()
Isolate * shared_space_isolate() const
LocalHeap * main_thread_local_heap()
Isolate * global_safepoint_prev_client_isolate_
constexpr bool IsRunning() const
constexpr bool IsCollectionRequested() const
constexpr bool IsParked() const
constexpr bool IsSafepointRequested() const
V8_INLINE void ExecuteWhileParked(Callback callback)
IsolateSafepoint * safepoint() const
IsolateSafepoint::RunningLocalHeaps running_
IsolateSafepoint::RunningLocalHeaps & running()
const IsolateSafepoint::RunningLocalHeaps & running() const
Isolate * isolate() const
PerClientSafepointData(Isolate *isolate)
std::optional< IsolateSafepointScope > isolate_safepoint_
V8_EXPORT_PRIVATE SafepointScope(Isolate *initiator, SafepointKind kind)
std::optional< GlobalSafepointScope > global_safepoint_
static ThreadId Current()
static V8_EXPORT_PRIVATE v8::Platform * GetCurrentPlatform()
#define TRACE_GC(tracer, scope_id)
V8_EXPORT_PRIVATE FlagValues v8_flags
#define CHECK_IMPLIES(lhs, rhs)
#define DCHECK_NOT_NULL(val)
#define CHECK_NOT_NULL(val)
#define DCHECK_NE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)