| // Copyright (c) 2016, 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. |
| |
| #include "vm/dart_api_state.h" |
| |
| #include "platform/assert.h" |
| #include "platform/utils.h" |
| #include "vm/heap.h" |
| #include "vm/isolate.h" |
| #include "vm/lockers.h" |
| #include "vm/thread.h" |
| #include "vm/timeline.h" |
| |
| namespace dart { |
| |
| intptr_t ApiNativeScope::current_memory_usage_ = 0; |
| |
| BackgroundFinalizer::BackgroundFinalizer(Isolate* isolate, |
| FinalizationQueue* queue) |
| : isolate_(isolate), queue_(queue) { |
| ASSERT(FLAG_background_finalization); |
| PageSpace* old_space = isolate->heap()->old_space(); |
| MonitorLocker ml(old_space->tasks_lock()); |
| old_space->set_tasks(old_space->tasks() + 1); |
| } |
| |
| |
| void BackgroundFinalizer::Run() { |
| bool result = Thread::EnterIsolateAsHelper(isolate_, Thread::kFinalizerTask); |
| ASSERT(result); |
| |
| { |
| Thread* thread = Thread::Current(); |
| TIMELINE_FUNCTION_GC_DURATION(thread, "BackgroundFinalization"); |
| TransitionVMToNative transition(thread); |
| for (intptr_t i = 0; i < queue_->length(); i++) { |
| FinalizablePersistentHandle* handle = (*queue_)[i]; |
| FinalizablePersistentHandle::Finalize(isolate_, handle); |
| } |
| delete queue_; |
| } |
| |
| // Exit isolate cleanly *before* notifying it, to avoid shutdown race. |
| Thread::ExitIsolateAsHelper(); |
| |
| { |
| PageSpace* old_space = isolate_->heap()->old_space(); |
| MonitorLocker ml(old_space->tasks_lock()); |
| old_space->set_tasks(old_space->tasks() - 1); |
| ml.NotifyAll(); |
| } |
| } |
| |
| } // namespace dart |