| Index: tonic/dart_gc_controller.cc
|
| diff --git a/tonic/dart_gc_controller.cc b/tonic/dart_gc_controller.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4b3505924641b1e6baa4f7271f9acfb7e7417556
|
| --- /dev/null
|
| +++ b/tonic/dart_gc_controller.cc
|
| @@ -0,0 +1,52 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "tonic/dart_gc_controller.h"
|
| +
|
| +#include "base/trace_event/trace_event.h"
|
| +#include "dart/runtime/include/dart_api.h"
|
| +#include "tonic/dart_gc_context.h"
|
| +#include "tonic/dart_gc_visitor.h"
|
| +#include "tonic/dart_wrappable.h"
|
| +
|
| +namespace blink {
|
| +namespace {
|
| +
|
| +DartGCContext* g_gc_context = nullptr;
|
| +
|
| +DartWrappable* GetWrappable(intptr_t* fields) {
|
| + return reinterpret_cast<DartWrappable*>(fields[DartWrappable::kPeerIndex]);
|
| +}
|
| +
|
| +void Visit(void* isolate_callback_data,
|
| + Dart_WeakPersistentHandle handle,
|
| + intptr_t native_field_count,
|
| + intptr_t* native_fields) {
|
| + if (!native_field_count)
|
| + return;
|
| + DCHECK(native_field_count == DartWrappable::kNumberOfNativeFields);
|
| + DartGCVisitor visitor(g_gc_context);
|
| + GetWrappable(native_fields)->AcceptDartGCVisitor(visitor);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +void DartGCPrologue() {
|
| + TRACE_EVENT_ASYNC_BEGIN0("sky", "DartGC", 0);
|
| +
|
| + Dart_EnterScope();
|
| + DCHECK(!g_gc_context);
|
| + g_gc_context = new DartGCContext();
|
| + Dart_VisitPrologueWeakHandles(Visit);
|
| +}
|
| +
|
| +void DartGCEpilogue() {
|
| + delete g_gc_context;
|
| + g_gc_context = nullptr;
|
| + Dart_ExitScope();
|
| +
|
| + TRACE_EVENT_ASYNC_END0("sky", "DartGC", 0);
|
| +}
|
| +
|
| +} // namespace blink
|
|
|