| 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 1040 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1051 if (thread()->IsMutatorThread()) { | 1051 if (thread()->IsMutatorThread()) { |
| 1052 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); | 1052 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); |
| 1053 } else { | 1053 } else { |
| 1054 // This part of compilation must be at a safepoint. | 1054 // This part of compilation must be at a safepoint. |
| 1055 // Stop mutator thread before creating the instruction object and | 1055 // Stop mutator thread before creating the instruction object and |
| 1056 // installing code. | 1056 // installing code. |
| 1057 // Mutator thread may not run code while we are creating the | 1057 // Mutator thread may not run code while we are creating the |
| 1058 // instruction object, since the creation of instruction object | 1058 // instruction object, since the creation of instruction object |
| 1059 // changes code page access permissions (makes them temporary not | 1059 // changes code page access permissions (makes them temporary not |
| 1060 // executable). | 1060 // executable). |
| 1061 isolate()->thread_registry()->SafepointThreads(); | |
| 1062 { | 1061 { |
| 1062 SafepointOperationScope safepoint_scope(thread()); |
| 1063 // Do not Garbage collect during this stage and instead allow the | 1063 // Do not Garbage collect during this stage and instead allow the |
| 1064 // heap to grow. | 1064 // heap to grow. |
| 1065 NoHeapGrowthControlScope no_growth_control; | 1065 NoHeapGrowthControlScope no_growth_control; |
| 1066 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); | 1066 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); |
| 1067 } | 1067 } |
| 1068 isolate()->thread_registry()->ResumeAllThreads(); | |
| 1069 if (isolate()->heap()->NeedsGarbageCollection()) { | 1068 if (isolate()->heap()->NeedsGarbageCollection()) { |
| 1070 isolate()->heap()->CollectAllGarbage(); | 1069 isolate()->heap()->CollectAllGarbage(); |
| 1071 } | 1070 } |
| 1072 } | 1071 } |
| 1073 } | 1072 } |
| 1074 // Mark that this isolate now has compiled code. | 1073 // Mark that this isolate now has compiled code. |
| 1075 isolate()->set_has_compiled_code(true); | 1074 isolate()->set_has_compiled_code(true); |
| 1076 // Exit the loop and the function with the correct result value. | 1075 // Exit the loop and the function with the correct result value. |
| 1077 is_compiled = true; | 1076 is_compiled = true; |
| 1078 done = true; | 1077 done = true; |
| (...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1892 MonitorLocker ml(task->queue_monitor_); | 1891 MonitorLocker ml(task->queue_monitor_); |
| 1893 task->running_ = false; | 1892 task->running_ = false; |
| 1894 // 'task' will be deleted by thread pool. | 1893 // 'task' will be deleted by thread pool. |
| 1895 task = NULL; | 1894 task = NULL; |
| 1896 ml.Notify(); // Stop waiting for the queue. | 1895 ml.Notify(); // Stop waiting for the queue. |
| 1897 } | 1896 } |
| 1898 | 1897 |
| 1899 { | 1898 { |
| 1900 MonitorLocker ml_done(done_monitor); | 1899 MonitorLocker ml_done(done_monitor); |
| 1901 while (!(*task_done)) { | 1900 while (!(*task_done)) { |
| 1902 // In case that the compiler is waiting for safepoint. | 1901 ml_done.WaitWithSafepointCheck(Thread::Current()); |
| 1903 Isolate::Current()->thread_registry()->CheckSafepoint(); | |
| 1904 ml_done.Wait(1); | |
| 1905 } | 1902 } |
| 1906 } | 1903 } |
| 1907 delete task_done; | 1904 delete task_done; |
| 1908 delete done_monitor; | 1905 delete done_monitor; |
| 1909 delete queue_monitor; | 1906 delete queue_monitor; |
| 1910 delete function_queue; | 1907 delete function_queue; |
| 1911 Isolate::Current()->set_background_compiler(NULL); | 1908 Isolate::Current()->set_background_compiler(NULL); |
| 1912 } | 1909 } |
| 1913 | 1910 |
| 1914 | 1911 |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2042 } | 2039 } |
| 2043 | 2040 |
| 2044 | 2041 |
| 2045 void BackgroundCompiler::EnsureInit(Thread* thread) { | 2042 void BackgroundCompiler::EnsureInit(Thread* thread) { |
| 2046 UNREACHABLE(); | 2043 UNREACHABLE(); |
| 2047 } | 2044 } |
| 2048 | 2045 |
| 2049 #endif // DART_PRECOMPILED_RUNTIME | 2046 #endif // DART_PRECOMPILED_RUNTIME |
| 2050 | 2047 |
| 2051 } // namespace dart | 2048 } // namespace dart |
| OLD | NEW |