dart-sdk/runtime/vm/thread_registry.h
Martin Kustermann d604461fc5 [vm/concurrency] Avoid relying on Isolate::Current() when deoptimizing code.
The background compiler can cause finalization of classes which can
cause deoptimization of code.

Any deoptimization will iterate over all mutator threads and marks
frames on the stack to be deoptimized. This requires saving old
(fp, pc) state. This state is currently saved on the current isolate's
pending deopt array (via `Thread::Current()->isolate()->AddPendingDeopt()`)
instead of the isolate whose stack got walked.

As part of making the compiler independent of `Isolate::Current()` we
pass the isolate explicitly.

Issue https://github.com/dart-lang/sdk/issues/36097

TEST=Refactoring of existing code.

Change-Id: I9327f3b76981fc16c1879a873edf37df1cbdd8bf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/182380
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Alexander Aprelev <aam@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2021-02-04 11:45:22 +00:00

67 lines
2 KiB
C++

// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#ifndef RUNTIME_VM_THREAD_REGISTRY_H_
#define RUNTIME_VM_THREAD_REGISTRY_H_
#include "vm/globals.h"
#include "vm/growable_array.h"
#include "vm/isolate.h"
#include "vm/lockers.h"
#include "vm/stack_frame.h"
#include "vm/thread.h"
namespace dart {
#ifndef PRODUCT
class JSONStream;
class JSONArray;
#endif
// Unordered collection of threads relating to a particular isolate.
class ThreadRegistry {
public:
ThreadRegistry() : threads_lock_(), active_list_(NULL), free_list_(NULL) {}
~ThreadRegistry();
void VisitObjectPointers(IsolateGroup* isolate_group_of_interest,
ObjectPointerVisitor* visitor,
ValidationPolicy validate_frames);
void ReleaseStoreBuffers();
void AcquireMarkingStacks();
void ReleaseMarkingStacks();
#ifndef PRODUCT
void PrintJSON(JSONStream* stream) const;
#endif
private:
Thread* active_list() const { return active_list_; }
Monitor* threads_lock() const { return &threads_lock_; }
Thread* GetFreeThreadLocked(bool is_vm_isolate);
void ReturnThreadLocked(Thread* thread);
void AddToActiveListLocked(Thread* thread);
void RemoveFromActiveListLocked(Thread* thread);
Thread* GetFromFreelistLocked(bool is_vm_isolate);
void ReturnToFreelistLocked(Thread* thread);
// This monitor protects the threads list for an isolate, it is used whenever
// we need to iterate over threads (both active and free) in an isolate.
mutable Monitor threads_lock_;
Thread* active_list_; // List of active threads in the isolate.
Thread* free_list_; // Free list of Thread objects that can be reused.
friend class Isolate;
friend class IsolateGroup;
friend class SafepointHandler;
friend class Scavenger;
DISALLOW_COPY_AND_ASSIGN(ThreadRegistry);
};
} // namespace dart
#endif // RUNTIME_VM_THREAD_REGISTRY_H_