OLD | NEW |
| (Empty) |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 #include "vm/dart_api_state.h" | |
6 | |
7 #include "platform/assert.h" | |
8 #include "platform/utils.h" | |
9 #include "vm/heap.h" | |
10 #include "vm/isolate.h" | |
11 #include "vm/lockers.h" | |
12 #include "vm/thread.h" | |
13 #include "vm/timeline.h" | |
14 | |
15 namespace dart { | |
16 | |
17 BackgroundFinalizer::BackgroundFinalizer(Isolate* isolate, | |
18 FinalizationQueue* queue) : | |
19 isolate_(isolate), | |
20 queue_(queue) { | |
21 MonitorLocker ml(isolate->heap()->finalization_tasks_lock()); | |
22 isolate->heap()->set_finalization_tasks( | |
23 isolate->heap()->finalization_tasks() + 1); | |
24 ml.Notify(); | |
25 } | |
26 | |
27 | |
28 void BackgroundFinalizer::Run() { | |
29 bool result = Thread::EnterIsolateAsHelper(isolate_, | |
30 Thread::kFinalizerTask, | |
31 true /* bypass_safepoint */); | |
32 ASSERT(result); | |
33 | |
34 { | |
35 TIMELINE_FUNCTION_GC_DURATION(Thread::Current(), | |
36 "BackgroundFinalization"); | |
37 | |
38 for (intptr_t i = 0; i < queue_->length(); i++) { | |
39 FinalizablePersistentHandle* handle = (*queue_)[i]; | |
40 FinalizablePersistentHandle::Finalize(isolate_, handle); | |
41 } | |
42 delete queue_; | |
43 } | |
44 | |
45 // Exit isolate cleanly *before* notifying it, to avoid shutdown race. | |
46 Thread::ExitIsolateAsHelper(); | |
47 | |
48 { | |
49 Heap* heap = isolate_->heap(); | |
50 MonitorLocker ml(heap->finalization_tasks_lock()); | |
51 heap->set_finalization_tasks(heap->finalization_tasks() - 1); | |
52 ml.Notify(); | |
53 } | |
54 } | |
55 | |
56 } // namespace dart | |
OLD | NEW |