OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/compiler.h" | 5 #include "vm/compiler.h" |
6 | 6 |
7 #include "vm/assembler.h" | 7 #include "vm/assembler.h" |
8 | 8 |
9 #include "vm/ast_printer.h" | 9 #include "vm/ast_printer.h" |
10 #include "vm/block_scheduler.h" | 10 #include "vm/block_scheduler.h" |
(...skipping 1479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1490 private: | 1490 private: |
1491 // Adds to the queue only if 'function' is not already in there. | 1491 // Adds to the queue only if 'function' is not already in there. |
1492 void PushFront(const Object& value) { | 1492 void PushFront(const Object& value) { |
1493 for (intptr_t i = 0; i < data_->Length(); i++) { | 1493 for (intptr_t i = 0; i < data_->Length(); i++) { |
1494 if (data_->At(i) == value.raw()) { | 1494 if (data_->At(i) == value.raw()) { |
1495 return; | 1495 return; |
1496 } | 1496 } |
1497 } | 1497 } |
1498 // Insert new element in front. | 1498 // Insert new element in front. |
1499 Object& f = Object::Handle(); | 1499 Object& f = Object::Handle(); |
1500 data_->Add(f); | 1500 data_->Add(f, Heap::kOld); |
1501 for (intptr_t i = data_->Length() - 1; i > 0; i--) { | 1501 for (intptr_t i = data_->Length() - 1; i > 0; i--) { |
1502 f = data_->At(i - 1); | 1502 f = data_->At(i - 1); |
1503 data_->SetAt(i, f); | 1503 data_->SetAt(i, f); |
1504 } | 1504 } |
1505 data_->SetAt(0, value); | 1505 data_->SetAt(0, value); |
1506 } | 1506 } |
1507 | 1507 |
1508 | 1508 |
1509 void PushBack(const Object& value) { | 1509 void PushBack(const Object& value) { |
1510 data_->Add(value, Heap::kOld); | 1510 data_->Add(value, Heap::kOld); |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1622 | 1622 |
1623 | 1623 |
1624 void BackgroundCompiler::Run() { | 1624 void BackgroundCompiler::Run() { |
1625 while (running_) { | 1625 while (running_) { |
1626 // Maybe something is already in the queue, check first before waiting | 1626 // Maybe something is already in the queue, check first before waiting |
1627 // to be notified. | 1627 // to be notified. |
1628 Thread::EnterIsolateAsHelper(isolate_); | 1628 Thread::EnterIsolateAsHelper(isolate_); |
1629 { | 1629 { |
1630 Thread* thread = Thread::Current(); | 1630 Thread* thread = Thread::Current(); |
1631 StackZone stack_zone(thread); | 1631 StackZone stack_zone(thread); |
| 1632 Zone* zone = stack_zone.GetZone(); |
1632 HANDLESCOPE(thread); | 1633 HANDLESCOPE(thread); |
1633 Zone* zone = stack_zone.GetZone(); | |
1634 Function& function = Function::Handle(zone); | 1634 Function& function = Function::Handle(zone); |
1635 Function& temp_function = Function::Handle(zone); | 1635 Function& temp_function = Function::Handle(zone); |
1636 function = LastFunctionOrNull(); | 1636 function = LastFunctionOrNull(); |
1637 BackgroundCompilationResult result; | 1637 BackgroundCompilationResult result; |
1638 // Finish all compilation before exiting (even if running_ is changed to | 1638 // Finish all compilation before exiting (even if running_ is changed to |
1639 // false). | 1639 // false). |
1640 while (!function.IsNull()) { | 1640 while (!function.IsNull()) { |
1641 result.Init(); | 1641 result.Init(); |
1642 const Error& error = Error::Handle(zone, | 1642 const Error& error = Error::Handle(zone, |
1643 Compiler::CompileOptimizedFunction(thread, | 1643 Compiler::CompileOptimizedFunction(thread, |
(...skipping 13 matching lines...) Expand all Loading... |
1657 } | 1657 } |
1658 } | 1658 } |
1659 Thread::ExitIsolateAsHelper(); | 1659 Thread::ExitIsolateAsHelper(); |
1660 { | 1660 { |
1661 // Wait to be notified when the work queue is not empty. | 1661 // Wait to be notified when the work queue is not empty. |
1662 MonitorLocker ml(queue_monitor_); | 1662 MonitorLocker ml(queue_monitor_); |
1663 while ((function_queue_length() == 0) && running_) { | 1663 while ((function_queue_length() == 0) && running_) { |
1664 ml.Wait(); | 1664 ml.Wait(); |
1665 } | 1665 } |
1666 } | 1666 } |
1667 } | 1667 } // while running |
| 1668 |
| 1669 compilation_function_queue_ = GrowableObjectArray::null(); |
| 1670 compilation_result_queue_ = GrowableObjectArray::null(); |
1668 { | 1671 { |
1669 // Notify that the thread is done. | 1672 // Notify that the thread is done. |
1670 MonitorLocker ml_done(done_monitor_); | 1673 MonitorLocker ml_done(done_monitor_); |
1671 *done_ = true; | 1674 *done_ = true; |
1672 ml_done.Notify(); | 1675 ml_done.Notify(); |
1673 } | 1676 } |
1674 } | 1677 } |
1675 | 1678 |
1676 | 1679 |
1677 void BackgroundCompiler::CompileOptimized(const Function& function) { | 1680 void BackgroundCompiler::CompileOptimized(const Function& function) { |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1765 visitor->VisitPointer(reinterpret_cast<RawObject**>( | 1768 visitor->VisitPointer(reinterpret_cast<RawObject**>( |
1766 &compilation_result_queue_)); | 1769 &compilation_result_queue_)); |
1767 } | 1770 } |
1768 | 1771 |
1769 | 1772 |
1770 void BackgroundCompiler::Stop(BackgroundCompiler* task) { | 1773 void BackgroundCompiler::Stop(BackgroundCompiler* task) { |
1771 ASSERT(Isolate::Current()->background_compiler() == task); | 1774 ASSERT(Isolate::Current()->background_compiler() == task); |
1772 if (task == NULL) { | 1775 if (task == NULL) { |
1773 return; | 1776 return; |
1774 } | 1777 } |
1775 Monitor* monitor = task->queue_monitor_; | 1778 Monitor* queue_monitor = task->queue_monitor_; |
1776 Monitor* done_monitor = task->done_monitor_; | 1779 Monitor* done_monitor = task->done_monitor_; |
1777 bool* task_done = task->done_; | 1780 bool* task_done = task->done_; |
1778 // Wake up compiler task and stop it. | 1781 // Wake up compiler task and stop it. |
1779 { | 1782 { |
1780 MonitorLocker ml(task->queue_monitor_); | 1783 MonitorLocker ml(task->queue_monitor_); |
1781 task->running_ = false; | 1784 task->running_ = false; |
1782 // 'task' will be deleted by thread pool. | 1785 // 'task' will be deleted by thread pool. |
1783 task = NULL; | 1786 task = NULL; |
1784 ml.Notify(); // Stop waiting for the queue. | 1787 ml.Notify(); // Stop waiting for the queue. |
1785 } | 1788 } |
1786 | 1789 |
1787 { | 1790 { |
1788 MonitorLocker ml_done(done_monitor); | 1791 MonitorLocker ml_done(done_monitor); |
1789 while (!(*task_done)) { | 1792 while (!(*task_done)) { |
1790 ml_done.Wait(); | 1793 ml_done.Wait(); |
1791 } | 1794 } |
1792 } | 1795 } |
1793 delete task_done; | 1796 delete task_done; |
1794 delete done_monitor; | 1797 delete done_monitor; |
1795 delete monitor; | 1798 delete queue_monitor; |
1796 Isolate::Current()->set_background_compiler(NULL); | 1799 Isolate::Current()->set_background_compiler(NULL); |
1797 } | 1800 } |
1798 | 1801 |
1799 | 1802 |
1800 void BackgroundCompiler::EnsureInit(Thread* thread) { | 1803 void BackgroundCompiler::EnsureInit(Thread* thread) { |
1801 bool start_task = false; | 1804 bool start_task = false; |
1802 Isolate* isolate = thread->isolate(); | 1805 Isolate* isolate = thread->isolate(); |
1803 { | 1806 { |
1804 MutexLocker ml(isolate->mutex()); | 1807 MutexLocker ml(isolate->mutex()); |
1805 if (isolate->background_compiler() == NULL) { | 1808 if (isolate->background_compiler() == NULL) { |
1806 BackgroundCompiler* task = new BackgroundCompiler(isolate); | 1809 BackgroundCompiler* task = new BackgroundCompiler(isolate); |
1807 isolate->set_background_compiler(task); | 1810 isolate->set_background_compiler(task); |
1808 task->set_compilation_function_queue(GrowableObjectArray::Handle( | 1811 // TODO(srdjan): Temporary fix to prevent growing (and thus GC-ing) of |
1809 thread->zone(), GrowableObjectArray::New())); | 1812 // queues while inside a MonitorLocker. Will replace GrowableObjectArray |
1810 task->set_compilation_result_queue(GrowableObjectArray::Handle( | 1813 // with C heap allocated linked list. |
1811 thread->zone(), GrowableObjectArray::New())); | 1814 GrowableObjectArray& a = GrowableObjectArray::Handle( |
| 1815 thread->zone(), GrowableObjectArray::New(Heap::kOld)); |
| 1816 a.Grow(1000, Heap::kOld); |
| 1817 task->set_compilation_function_queue(a); |
| 1818 |
| 1819 a = GrowableObjectArray::New(Heap::kOld); |
| 1820 a.Grow(1000, Heap::kOld); |
| 1821 task->set_compilation_result_queue(a); |
1812 start_task = true; | 1822 start_task = true; |
1813 } | 1823 } |
1814 } | 1824 } |
1815 if (start_task) { | 1825 if (start_task) { |
1816 Dart::thread_pool()->Run(isolate->background_compiler()); | 1826 Dart::thread_pool()->Run(isolate->background_compiler()); |
1817 } | 1827 } |
1818 } | 1828 } |
1819 | 1829 |
1820 } // namespace dart | 1830 } // namespace dart |
OLD | NEW |