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 1596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1607 prefix_invalidation_gen_ = queue->PopBackInteger(); | 1607 prefix_invalidation_gen_ = queue->PopBackInteger(); |
1608 field_invalidation_gen_ = queue->PopBackInteger(); | 1608 field_invalidation_gen_ = queue->PopBackInteger(); |
1609 cha_invalidation_gen_ = queue->PopBackInteger(); | 1609 cha_invalidation_gen_ = queue->PopBackInteger(); |
1610 result_code_ = queue->PopBackCode(); | 1610 result_code_ = queue->PopBackCode(); |
1611 } | 1611 } |
1612 | 1612 |
1613 | 1613 |
1614 BackgroundCompiler::BackgroundCompiler(Isolate* isolate) | 1614 BackgroundCompiler::BackgroundCompiler(Isolate* isolate) |
1615 : isolate_(isolate), running_(true), done_(new bool()), | 1615 : isolate_(isolate), running_(true), done_(new bool()), |
1616 queue_monitor_(new Monitor()), done_monitor_(new Monitor()), | 1616 queue_monitor_(new Monitor()), done_monitor_(new Monitor()), |
1617 function_queue_length_(0) { | 1617 function_queue_length_(0), |
| 1618 compilation_function_queue_(GrowableObjectArray::null()), |
| 1619 compilation_result_queue_(GrowableObjectArray::null()) { |
1618 *done_ = false; | 1620 *done_ = false; |
1619 } | 1621 } |
1620 | 1622 |
1621 | 1623 |
1622 void BackgroundCompiler::Run() { | 1624 void BackgroundCompiler::Run() { |
1623 while (running_) { | 1625 while (running_) { |
1624 // Maybe something is already in the queue, check first before waiting | 1626 // Maybe something is already in the queue, check first before waiting |
1625 // to be notified. | 1627 // to be notified. |
1626 Thread::EnterIsolateAsHelper(isolate_); | 1628 Thread::EnterIsolateAsHelper(isolate_); |
1627 { | 1629 { |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1695 } | 1697 } |
1696 if (function.usage_counter() < 0) { | 1698 if (function.usage_counter() < 0) { |
1697 // Reset to 0 so that it can be recompiled if needed. | 1699 // Reset to 0 so that it can be recompiled if needed. |
1698 function.set_usage_counter(0); | 1700 function.set_usage_counter(0); |
1699 } | 1701 } |
1700 } | 1702 } |
1701 } | 1703 } |
1702 | 1704 |
1703 | 1705 |
1704 GrowableObjectArray* BackgroundCompiler::FunctionsQueue() const { | 1706 GrowableObjectArray* BackgroundCompiler::FunctionsQueue() const { |
1705 return | 1707 return &GrowableObjectArray::ZoneHandle(compilation_function_queue_); |
1706 &GrowableObjectArray::ZoneHandle(isolate_->compilation_function_queue()); | |
1707 } | 1708 } |
1708 | 1709 |
1709 | 1710 |
1710 GrowableObjectArray* BackgroundCompiler::ResultQueue() const { | 1711 GrowableObjectArray* BackgroundCompiler::ResultQueue() const { |
1711 return &GrowableObjectArray::ZoneHandle(isolate_->compilation_result_queue()); | 1712 return &GrowableObjectArray::ZoneHandle(compilation_result_queue_); |
1712 } | 1713 } |
1713 | 1714 |
1714 | 1715 |
1715 void BackgroundCompiler::AddFunction(const Function& f) { | 1716 void BackgroundCompiler::AddFunction(const Function& f) { |
1716 MonitorLocker ml(queue_monitor_); | 1717 MonitorLocker ml(queue_monitor_); |
1717 CompilationWorkQueue queue(FunctionsQueue()); | 1718 CompilationWorkQueue queue(FunctionsQueue()); |
1718 queue.PushFrontFunction(f); | 1719 queue.PushFrontFunction(f); |
1719 set_function_queue_length(queue.Length()); | 1720 set_function_queue_length(queue.Length()); |
1720 // Notify waiting background compiler task. | 1721 // Notify waiting background compiler task. |
1721 ml.Notify(); | 1722 ml.Notify(); |
(...skipping 16 matching lines...) Expand all Loading... |
1738 } | 1739 } |
1739 | 1740 |
1740 | 1741 |
1741 void BackgroundCompiler::AddResult(const BackgroundCompilationResult& value) { | 1742 void BackgroundCompiler::AddResult(const BackgroundCompilationResult& value) { |
1742 MonitorLocker ml(queue_monitor_); | 1743 MonitorLocker ml(queue_monitor_); |
1743 CompilationWorkQueue queue(ResultQueue()); | 1744 CompilationWorkQueue queue(ResultQueue()); |
1744 value.PushOnQueue(&queue); | 1745 value.PushOnQueue(&queue); |
1745 } | 1746 } |
1746 | 1747 |
1747 | 1748 |
| 1749 void BackgroundCompiler::set_compilation_function_queue( |
| 1750 const GrowableObjectArray& value) { |
| 1751 compilation_function_queue_ = value.raw(); |
| 1752 } |
| 1753 |
| 1754 |
| 1755 void BackgroundCompiler::set_compilation_result_queue( |
| 1756 const GrowableObjectArray& value) { |
| 1757 compilation_result_queue_ = value.raw(); |
| 1758 } |
| 1759 |
| 1760 |
| 1761 void BackgroundCompiler::VisitPointers(ObjectPointerVisitor* visitor) { |
| 1762 visitor->VisitPointer(reinterpret_cast<RawObject**>( |
| 1763 &compilation_function_queue_)); |
| 1764 |
| 1765 visitor->VisitPointer(reinterpret_cast<RawObject**>( |
| 1766 &compilation_result_queue_)); |
| 1767 } |
| 1768 |
| 1769 |
1748 void BackgroundCompiler::Stop(BackgroundCompiler* task) { | 1770 void BackgroundCompiler::Stop(BackgroundCompiler* task) { |
1749 ASSERT(Isolate::Current()->background_compiler() == task); | 1771 ASSERT(Isolate::Current()->background_compiler() == task); |
1750 if (task == NULL) { | 1772 if (task == NULL) { |
1751 return; | 1773 return; |
1752 } | 1774 } |
1753 Monitor* monitor = task->queue_monitor_; | 1775 Monitor* monitor = task->queue_monitor_; |
1754 Monitor* done_monitor = task->done_monitor_; | 1776 Monitor* done_monitor = task->done_monitor_; |
1755 bool* task_done = task->done_; | 1777 bool* task_done = task->done_; |
1756 // Wake up compiler task and stop it. | 1778 // Wake up compiler task and stop it. |
1757 { | 1779 { |
(...skipping 18 matching lines...) Expand all Loading... |
1776 | 1798 |
1777 | 1799 |
1778 void BackgroundCompiler::EnsureInit(Thread* thread) { | 1800 void BackgroundCompiler::EnsureInit(Thread* thread) { |
1779 bool start_task = false; | 1801 bool start_task = false; |
1780 Isolate* isolate = thread->isolate(); | 1802 Isolate* isolate = thread->isolate(); |
1781 { | 1803 { |
1782 MutexLocker ml(isolate->mutex()); | 1804 MutexLocker ml(isolate->mutex()); |
1783 if (isolate->background_compiler() == NULL) { | 1805 if (isolate->background_compiler() == NULL) { |
1784 BackgroundCompiler* task = new BackgroundCompiler(isolate); | 1806 BackgroundCompiler* task = new BackgroundCompiler(isolate); |
1785 isolate->set_background_compiler(task); | 1807 isolate->set_background_compiler(task); |
1786 isolate->set_compilation_function_queue(GrowableObjectArray::Handle( | 1808 task->set_compilation_function_queue(GrowableObjectArray::Handle( |
1787 thread->zone(), GrowableObjectArray::New())); | 1809 thread->zone(), GrowableObjectArray::New())); |
1788 isolate->set_compilation_result_queue(GrowableObjectArray::Handle( | 1810 task->set_compilation_result_queue(GrowableObjectArray::Handle( |
1789 thread->zone(), GrowableObjectArray::New())); | 1811 thread->zone(), GrowableObjectArray::New())); |
1790 start_task = true; | 1812 start_task = true; |
1791 } | 1813 } |
1792 } | 1814 } |
1793 if (start_task) { | 1815 if (start_task) { |
1794 Dart::thread_pool()->Run(isolate->background_compiler()); | 1816 Dart::thread_pool()->Run(isolate->background_compiler()); |
1795 } | 1817 } |
1796 } | 1818 } |
1797 | 1819 |
1798 } // namespace dart | 1820 } // namespace dart |
OLD | NEW |