mirror of
https://github.com/dart-lang/sdk
synced 2024-11-02 12:24:24 +00:00
4a4eedd860
* Merge ClassTable and SharedClassTable back together; * Simplify handling of multiple arrays growing in sync; * Refactor how reload deals with ClassTable. The last change is the most important because it makes it much easier to reason about the code. We move away from copying bits and pieces of the class table and shared class table into reload contexts. Having two class table fields in the isolate group makes it easier to reason about. One field contains program class table (one modified by kernel loader and accessed by various program structure cid lookups) and heap walk class table (used by GC visitors). Normally these two fields point to the same class table, but during hot reload we temporary split them apart: original class table is kept as a heap walk class table, while program class table is replaced by a clone and updated by reload. If reload succeeds we drop original class table and set program class table as heap walk one. If reload fails we drop the program class table and restore original one from heap walk table. TEST=ci Cq-Include-Trybots: luci.dart.try:vm-kernel-reload-linux-release-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-reload-rollback-linux-release-x64-try,vm-kernel-linux-debug-x64-try,vm-kernel-precomp-tsan-linux-release-x64-try,vm-kernel-tsan-linux-release-x64-try,vm-kernel-precomp-asan-linux-release-x64-try,vm-kernel-asan-linux-release-x64-try Change-Id: I8b66259fcc474dea7dd2af063e4772df99be06c4 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/258361 Commit-Queue: Slava Egorov <vegorov@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com>
118 lines
3.6 KiB
C++
118 lines
3.6 KiB
C++
// Copyright (c) 2011, 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_VISITOR_H_
|
|
#define RUNTIME_VM_VISITOR_H_
|
|
|
|
#include "vm/allocation.h"
|
|
#include "vm/class_table.h"
|
|
#include "vm/globals.h"
|
|
#include "vm/growable_array.h"
|
|
|
|
namespace dart {
|
|
|
|
// Forward declarations.
|
|
class Isolate;
|
|
class IsolateGroup;
|
|
|
|
// An object pointer visitor interface.
|
|
class ObjectPointerVisitor {
|
|
public:
|
|
explicit ObjectPointerVisitor(IsolateGroup* isolate_group);
|
|
virtual ~ObjectPointerVisitor() {}
|
|
|
|
IsolateGroup* isolate_group() const { return isolate_group_; }
|
|
|
|
// Visit pointers inside the given typed data [view].
|
|
//
|
|
// Range of pointers to visit 'first' <= pointer <= 'last'.
|
|
virtual void VisitTypedDataViewPointers(TypedDataViewPtr view,
|
|
CompressedObjectPtr* first,
|
|
CompressedObjectPtr* last) {
|
|
VisitCompressedPointers(view->heap_base(), first, last);
|
|
}
|
|
|
|
// Range of pointers to visit 'first' <= pointer <= 'last'.
|
|
virtual void VisitPointers(ObjectPtr* first, ObjectPtr* last) = 0;
|
|
virtual void VisitCompressedPointers(uword heap_base,
|
|
CompressedObjectPtr* first,
|
|
CompressedObjectPtr* last) = 0;
|
|
|
|
// len argument is the number of pointers to visit starting from 'p'.
|
|
void VisitPointers(ObjectPtr* p, intptr_t len) {
|
|
VisitPointers(p, (p + len - 1));
|
|
}
|
|
|
|
void VisitPointer(ObjectPtr* p) { VisitPointers(p, p); }
|
|
|
|
const char* gc_root_type() const { return gc_root_type_; }
|
|
void set_gc_root_type(const char* gc_root_type) {
|
|
gc_root_type_ = gc_root_type;
|
|
}
|
|
|
|
void clear_gc_root_type() { gc_root_type_ = "unknown"; }
|
|
|
|
virtual bool visit_weak_persistent_handles() const { return false; }
|
|
|
|
// When visiting objects to build retaining paths, trace field values
|
|
// through fields.
|
|
// Otherwise trace field values through isolate's field_table.
|
|
virtual bool trace_values_through_fields() const { return false; }
|
|
|
|
const ClassTable* class_table() const { return class_table_; }
|
|
|
|
// Returns true if pointers of the given SuspendState object can be visited.
|
|
// Compactor overrides this method in order to postpone visiting SuspendState
|
|
// objects with evacuated frames, as visiting them may touch other Dart
|
|
// objects (array of InstructionsTables) which have inconsistent state
|
|
// until compaction is finished.
|
|
virtual bool CanVisitSuspendStatePointers(SuspendStatePtr suspend_state) {
|
|
return true;
|
|
}
|
|
|
|
private:
|
|
IsolateGroup* isolate_group_;
|
|
const char* gc_root_type_;
|
|
ClassTable* class_table_;
|
|
|
|
DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectPointerVisitor);
|
|
};
|
|
|
|
// An object visitor interface.
|
|
class ObjectVisitor {
|
|
public:
|
|
ObjectVisitor() {}
|
|
|
|
virtual ~ObjectVisitor() {}
|
|
|
|
// Invoked for each object.
|
|
virtual void VisitObject(ObjectPtr obj) = 0;
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(ObjectVisitor);
|
|
};
|
|
|
|
// An object finder visitor interface.
|
|
class FindObjectVisitor {
|
|
public:
|
|
FindObjectVisitor() {}
|
|
virtual ~FindObjectVisitor() {}
|
|
|
|
// Allow to specify a address filter.
|
|
virtual uword filter_addr() const { return 0; }
|
|
bool VisitRange(uword begin_addr, uword end_addr) const {
|
|
uword addr = filter_addr();
|
|
return (addr == 0) || ((begin_addr <= addr) && (addr < end_addr));
|
|
}
|
|
|
|
// Check if object matches find condition.
|
|
virtual bool FindObject(ObjectPtr obj) const = 0;
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(FindObjectVisitor);
|
|
};
|
|
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_VM_VISITOR_H_
|