| // Copyright 2016 The Fuchsia 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 "lib/tonic/dart_microtask_queue.h" |
| |
| #include <vector> |
| |
| #include "lib/tonic/logging/dart_invoke.h" |
| #include "lib/tonic/dart_persistent_value.h" |
| #include "lib/tonic/dart_state.h" |
| |
| namespace tonic { |
| namespace { |
| |
| typedef std::vector<DartPersistentValue> MicrotaskQueue; |
| |
| static MicrotaskQueue& GetQueue() { |
| static MicrotaskQueue* queue = new MicrotaskQueue(); |
| return *queue; |
| } |
| |
| } // namespace |
| |
| void DartMicrotaskQueue::ScheduleMicrotask(Dart_Handle callback) { |
| GetQueue().emplace_back(DartState::Current(), callback); |
| } |
| |
| void DartMicrotaskQueue::RunMicrotasks() { |
| MicrotaskQueue& queue = GetQueue(); |
| while (!queue.empty()) { |
| MicrotaskQueue local; |
| std::swap(queue, local); |
| for (const auto& callback : local) { |
| ftl::WeakPtr<DartState> dart_state = callback.dart_state(); |
| if (!dart_state.get()) |
| continue; |
| DartState::Scope dart_scope(dart_state.get()); |
| DartInvokeVoid(callback.value()); |
| } |
| } |
| } |
| } |