Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: runtime/vm/compiler_test.cc

Issue 1410363005: Make ICData changes thread safe (first compute array, then set it). Install code in the main thread… (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Address comments Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/compiler.cc ('k') | runtime/vm/flow_graph_builder.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "platform/assert.h" 5 #include "platform/assert.h"
6 #include "vm/class_finalizer.h" 6 #include "vm/class_finalizer.h"
7 #include "vm/code_patcher.h" 7 #include "vm/code_patcher.h"
8 #include "vm/compiler.h" 8 #include "vm/compiler.h"
9 #include "vm/dart_api_impl.h" 9 #include "vm/dart_api_impl.h"
10 #include "vm/object.h" 10 #include "vm/object.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 EXPECT(!function_moo.IsNull()); 63 EXPECT(!function_moo.IsNull());
64 64
65 EXPECT(CompilerTest::TestCompileFunction(function_moo)); 65 EXPECT(CompilerTest::TestCompileFunction(function_moo));
66 EXPECT(function_moo.HasCode()); 66 EXPECT(function_moo.HasCode());
67 function_source = function_moo.GetSource(); 67 function_source = function_moo.GetSource();
68 EXPECT_STREQ("static moo() {\n // A.foo();\n }", 68 EXPECT_STREQ("static moo() {\n // A.foo();\n }",
69 function_source.ToCString()); 69 function_source.ToCString());
70 } 70 }
71 71
72 72
73 class CompileFunctionTask : public ThreadPool::Task {
74 public:
75 CompileFunctionTask(Isolate* isolate,
76 const Function& func,
77 Monitor* done_monitor,
78 bool* done)
79 : isolate_(isolate),
80 func_(func),
81 done_monitor_(done_monitor),
82 done_(done) {
83 }
84
85 virtual void Run() {
86 Thread::EnterIsolateAsHelper(isolate_);
87 {
88 Thread* thread = Thread::Current();
89 StackZone stack_zone(thread);
90 HANDLESCOPE(thread);
91 EXPECT(func_.HasCode());
92 EXPECT(!func_.HasOptimizedCode());
93 const Error& err =
94 Error::Handle(Compiler::CompileOptimizedFunction(thread, func_));
95 EXPECT(err.IsNull());
96 EXPECT(func_.HasOptimizedCode());
97 }
98 Thread::ExitIsolateAsHelper();
99 // Tell main thread that we are done.
100 {
101 MonitorLocker ml(done_monitor_);
102 ASSERT(!*done_);
103 *done_ = true;
104 ml.Notify();
105 }
106 }
107
108 private:
109 Isolate* isolate_;
110 const Function& func_;
111 Monitor* done_monitor_;
112 bool* done_;
113 };
114
115
116 TEST_CASE(CompileFunctionOnHelperThread) { 73 TEST_CASE(CompileFunctionOnHelperThread) {
117 Monitor done_monitor;
118 bool done = false;
119 Isolate* isolate = Thread::Current()->isolate();
120 // Flush store buffers, etc.
121 // TODO(koda): Currently, the GC only does this for the current thread, (i.e,
122 // the helper, in this test), but it should be done for all *threads*
123 // after/at safepointing.
124 Thread::PrepareForGC();
125
126 // Create a simple function and compile it without optimization. 74 // Create a simple function and compile it without optimization.
127 const char* kScriptChars = 75 const char* kScriptChars =
128 "class A {\n" 76 "class A {\n"
129 " static foo() { return 42; }\n" 77 " static foo() { return 42; }\n"
130 "}\n"; 78 "}\n";
131 String& url = 79 String& url =
132 String::Handle(String::New("dart-test:CompileFunctionOnHelperThread")); 80 String::Handle(String::New("dart-test:CompileFunctionOnHelperThread"));
133 String& source = String::Handle(String::New(kScriptChars)); 81 String& source = String::Handle(String::New(kScriptChars));
134 Script& script = Script::Handle(Script::New(url, 82 Script& script = Script::Handle(Script::New(url,
135 source, 83 source,
136 RawScript::kScriptTag)); 84 RawScript::kScriptTag));
137 Library& lib = Library::Handle(Library::CoreLibrary()); 85 Library& lib = Library::Handle(Library::CoreLibrary());
138 EXPECT(CompilerTest::TestCompileScript(lib, script)); 86 EXPECT(CompilerTest::TestCompileScript(lib, script));
139 EXPECT(ClassFinalizer::ProcessPendingClasses()); 87 EXPECT(ClassFinalizer::ProcessPendingClasses());
140 Class& cls = Class::Handle( 88 Class& cls = Class::Handle(
141 lib.LookupClass(String::Handle(Symbols::New("A")))); 89 lib.LookupClass(String::Handle(Symbols::New("A"))));
142 EXPECT(!cls.IsNull()); 90 EXPECT(!cls.IsNull());
143 String& function_foo_name = String::Handle(String::New("foo")); 91 String& function_foo_name = String::Handle(String::New("foo"));
144 Function& func = 92 Function& func =
145 Function::Handle(cls.LookupStaticFunction(function_foo_name)); 93 Function::Handle(cls.LookupStaticFunction(function_foo_name));
146 EXPECT(!func.HasCode()); 94 EXPECT(!func.HasCode());
147 CompilerTest::TestCompileFunction(func); 95 CompilerTest::TestCompileFunction(func);
148 EXPECT(func.HasCode()); 96 EXPECT(func.HasCode());
149 EXPECT(!func.HasOptimizedCode()); 97 EXPECT(!func.HasOptimizedCode());
150 98 BackgroundCompiler::EnsureInit(thread);
151 // Now optimize it on a helper thread. 99 Isolate* isolate = thread->isolate();
152 Dart::thread_pool()->Run( 100 ASSERT(isolate->background_compiler() != NULL);
153 new CompileFunctionTask(isolate, func, &done_monitor, &done)); 101 isolate->background_compiler()->CompileOptimized(func);
154 { 102 Monitor* m = new Monitor();
155 // Manually wait. 103 MonitorLocker ml(m);
156 // TODO(koda): Replace with execution of Dart and/or VM code when GC 104 while (!func.HasOptimizedCode()) {
157 // actually safepoints everything. 105 isolate->background_compiler()->InstallGeneratedCode();
158 MonitorLocker ml(&done_monitor); 106 ml.Wait(1);
159 while (!done) {
160 ml.Wait();
161 }
162 } 107 }
108 BackgroundCompiler::Stop(isolate->background_compiler());
163 } 109 }
164 110
165 111
166 TEST_CASE(RegenerateAllocStubs) { 112 TEST_CASE(RegenerateAllocStubs) {
167 const char* kScriptChars = 113 const char* kScriptChars =
168 "class A {\n" 114 "class A {\n"
169 "}\n" 115 "}\n"
170 "unOpt() => new A(); \n" 116 "unOpt() => new A(); \n"
171 "optIt() => new A(); \n" 117 "optIt() => new A(); \n"
172 "A main() {\n" 118 "A main() {\n"
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 EXPECT(val.IsInteger()); 217 EXPECT(val.IsInteger());
272 EXPECT_EQ(7, Integer::Cast(val).AsInt64Value()); 218 EXPECT_EQ(7, Integer::Cast(val).AsInt64Value());
273 219
274 intptr_t final_class_table_size = 220 intptr_t final_class_table_size =
275 Isolate::Current()->class_table()->NumCids(); 221 Isolate::Current()->class_table()->NumCids();
276 // Eval should not eat into this non-renewable resource. 222 // Eval should not eat into this non-renewable resource.
277 EXPECT_EQ(initial_class_table_size, final_class_table_size); 223 EXPECT_EQ(initial_class_table_size, final_class_table_size);
278 } 224 }
279 225
280 } // namespace dart 226 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/compiler.cc ('k') | runtime/vm/flow_graph_builder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698