| 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 1032 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1043 compiler_timeline, | 1043 compiler_timeline, |
| 1044 "CompileGraph"); | 1044 "CompileGraph"); |
| 1045 graph_compiler.CompileGraph(); | 1045 graph_compiler.CompileGraph(); |
| 1046 pipeline->FinalizeCompilation(); | 1046 pipeline->FinalizeCompilation(); |
| 1047 } | 1047 } |
| 1048 { | 1048 { |
| 1049 TimelineDurationScope tds(thread(), | 1049 TimelineDurationScope tds(thread(), |
| 1050 compiler_timeline, | 1050 compiler_timeline, |
| 1051 "FinalizeCompilation"); | 1051 "FinalizeCompilation"); |
| 1052 // This part of compilation must be at a safepoint. | 1052 // This part of compilation must be at a safepoint. |
| 1053 if (!thread()->IsMutatorThread()) { | 1053 if (thread()->IsMutatorThread()) { |
| 1054 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); |
| 1055 } else { |
| 1054 // Stop mutator thread before creating the instruction object and | 1056 // Stop mutator thread before creating the instruction object and |
| 1055 // installing code. | 1057 // installing code. |
| 1056 // Mutator thread may not run code while we are creating the | 1058 // Mutator thread may not run code while we are creating the |
| 1057 // instruction object, since the creation of instruction object | 1059 // instruction object, since the creation of instruction object |
| 1058 // changes code page access permissions (makes them temporary not | 1060 // changes code page access permissions (makes them temporary not |
| 1059 // executable). | 1061 // executable). |
| 1060 isolate()->thread_registry()->SafepointThreads(); | 1062 SafepointOperationScope safepoint_scope(thread()); |
| 1061 } | 1063 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); |
| 1062 | |
| 1063 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); | |
| 1064 | |
| 1065 if (!thread()->IsMutatorThread()) { | |
| 1066 // Background compilation. | |
| 1067 isolate()->thread_registry()->ResumeAllThreads(); | |
| 1068 } | 1064 } |
| 1069 } | 1065 } |
| 1070 // Mark that this isolate now has compiled code. | 1066 // Mark that this isolate now has compiled code. |
| 1071 isolate()->set_has_compiled_code(true); | 1067 isolate()->set_has_compiled_code(true); |
| 1072 // Exit the loop and the function with the correct result value. | 1068 // Exit the loop and the function with the correct result value. |
| 1073 is_compiled = true; | 1069 is_compiled = true; |
| 1074 done = true; | 1070 done = true; |
| 1075 } else { | 1071 } else { |
| 1076 // We bailed out or we encountered an error. | 1072 // We bailed out or we encountered an error. |
| 1077 const Error& error = Error::Handle( | 1073 const Error& error = Error::Handle( |
| (...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1887 MonitorLocker ml(task->queue_monitor_); | 1883 MonitorLocker ml(task->queue_monitor_); |
| 1888 task->running_ = false; | 1884 task->running_ = false; |
| 1889 // 'task' will be deleted by thread pool. | 1885 // 'task' will be deleted by thread pool. |
| 1890 task = NULL; | 1886 task = NULL; |
| 1891 ml.Notify(); // Stop waiting for the queue. | 1887 ml.Notify(); // Stop waiting for the queue. |
| 1892 } | 1888 } |
| 1893 | 1889 |
| 1894 { | 1890 { |
| 1895 MonitorLocker ml_done(done_monitor); | 1891 MonitorLocker ml_done(done_monitor); |
| 1896 while (!(*task_done)) { | 1892 while (!(*task_done)) { |
| 1897 // In case that the compiler is waiting for safepoint. | 1893 ml_done.WaitWithSafepointCheck(Thread::Current()); |
| 1898 Isolate::Current()->thread_registry()->CheckSafepoint(); | |
| 1899 ml_done.Wait(1); | |
| 1900 } | 1894 } |
| 1901 } | 1895 } |
| 1902 delete task_done; | 1896 delete task_done; |
| 1903 delete done_monitor; | 1897 delete done_monitor; |
| 1904 delete queue_monitor; | 1898 delete queue_monitor; |
| 1905 delete function_queue; | 1899 delete function_queue; |
| 1906 Isolate::Current()->set_background_compiler(NULL); | 1900 Isolate::Current()->set_background_compiler(NULL); |
| 1907 } | 1901 } |
| 1908 | 1902 |
| 1909 | 1903 |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2037 } | 2031 } |
| 2038 | 2032 |
| 2039 | 2033 |
| 2040 void BackgroundCompiler::EnsureInit(Thread* thread) { | 2034 void BackgroundCompiler::EnsureInit(Thread* thread) { |
| 2041 UNREACHABLE(); | 2035 UNREACHABLE(); |
| 2042 } | 2036 } |
| 2043 | 2037 |
| 2044 #endif // DART_PRECOMPILED | 2038 #endif // DART_PRECOMPILED |
| 2045 | 2039 |
| 2046 } // namespace dart | 2040 } // namespace dart |
| OLD | NEW |