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

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

Issue 1297663003: Test running compiler on a helper thread with mutator paused. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: indent Created 5 years, 4 months 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/tests/vm/vm.status ('k') | no next file » | 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"
11 #include "vm/symbols.h" 11 #include "vm/symbols.h"
12 #include "vm/thread_pool.h"
12 #include "vm/unit_test.h" 13 #include "vm/unit_test.h"
13 14
14 namespace dart { 15 namespace dart {
15 16
16 TEST_CASE(CompileScript) { 17 TEST_CASE(CompileScript) {
17 const char* kScriptChars = 18 const char* kScriptChars =
18 "class A {\n" 19 "class A {\n"
19 " static foo() { return 42; }\n" 20 " static foo() { return 42; }\n"
20 "}\n"; 21 "}\n";
21 String& url = String::Handle(String::New("dart-test:CompileScript")); 22 String& url = String::Handle(String::New("dart-test:CompileScript"));
22 String& source = String::Handle(String::New(kScriptChars)); 23 String& source = String::Handle(String::New(kScriptChars));
23 Script& script = Script::Handle(Script::New(url, 24 Script& script = Script::Handle(Script::New(url,
24 source, 25 source,
25 RawScript::kScriptTag)); 26 RawScript::kScriptTag));
26 Library& lib = Library::Handle(Library::CoreLibrary()); 27 Library& lib = Library::Handle(Library::CoreLibrary());
27 EXPECT(CompilerTest::TestCompileScript(lib, script)); 28 EXPECT(CompilerTest::TestCompileScript(lib, script));
28 } 29 }
29 30
30 31
31 TEST_CASE(CompileFunction) { 32 static void CompileFunctionImpl() {
32 const char* kScriptChars = 33 const char* kScriptChars =
33 "class A {\n" 34 "class A {\n"
34 " static foo() { return 42; }\n" 35 " static foo() { return 42; }\n"
35 " static moo() {\n" 36 " static moo() {\n"
36 " // A.foo();\n" 37 " // A.foo();\n"
37 " }\n" 38 " }\n"
38 "}\n"; 39 "}\n";
39 String& url = String::Handle(String::New("dart-test:CompileFunction")); 40 String& url = String::Handle(String::New("dart-test:CompileFunction"));
40 String& source = String::Handle(String::New(kScriptChars)); 41 String& source = String::Handle(String::New(kScriptChars));
41 Script& script = Script::Handle(Script::New(url, 42 Script& script = Script::Handle(Script::New(url,
(...skipping 20 matching lines...) Expand all
62 EXPECT(!function_moo.IsNull()); 63 EXPECT(!function_moo.IsNull());
63 64
64 EXPECT(CompilerTest::TestCompileFunction(function_moo)); 65 EXPECT(CompilerTest::TestCompileFunction(function_moo));
65 EXPECT(function_moo.HasCode()); 66 EXPECT(function_moo.HasCode());
66 function_source = function_moo.GetSource(); 67 function_source = function_moo.GetSource();
67 EXPECT_STREQ("static moo() {\n // A.foo();\n }", 68 EXPECT_STREQ("static moo() {\n // A.foo();\n }",
68 function_source.ToCString()); 69 function_source.ToCString());
69 } 70 }
70 71
71 72
73 TEST_CASE(CompileFunction) {
74 CompileFunctionImpl();
75 }
76
77
78 // Runs 'CompileFunctionImpl' on a helper thread.
79 class CompileFunctionTask : public ThreadPool::Task {
80 public:
81 CompileFunctionTask(Isolate* isolate,
82 Monitor* done_monitor,
83 bool* done)
84 : isolate_(isolate),
85 done_monitor_(done_monitor),
86 done_(done) {
87 }
88
89 virtual void Run() {
90 Thread::EnterIsolateAsHelper(isolate_);
91 {
92 Thread* thread = Thread::Current();
93 StackZone stack_zone(thread);
94 HANDLESCOPE(thread);
95 CompileFunctionImpl();
96 }
97 Thread::ExitIsolateAsHelper();
98 // Tell main thread that we are done.
99 {
100 MonitorLocker ml(done_monitor_);
101 ASSERT(!*done_);
102 *done_ = true;
103 ml.Notify();
104 }
105 }
106
107 private:
108 Isolate* isolate_;
109 Monitor* done_monitor_;
110 bool* done_;
111 };
112
113
114 TEST_CASE(CompileFunctionOnHelperThread) {
115 Monitor done_monitor;
116 bool done = false;
117 Isolate* isolate = Thread::Current()->isolate();
118 // Flush store buffers, etc.
119 // TODO(koda): Currently, the GC only does this for the current thread, (i.e,
120 // the helper, in this test), but it should be done for all *threads*
121 // after/at safepointing.
122 Thread::PrepareForGC();
123 Dart::thread_pool()->Run(
124 new CompileFunctionTask(isolate, &done_monitor, &done));
125 {
126 // Manually wait.
127 // TODO(koda): Replace with execution of Dart and/or VM code when GC
128 // actually safepoints everything.
129 MonitorLocker ml(&done_monitor);
130 while (!done) {
131 ml.Wait();
132 }
133 }
134 }
135
136
72 TEST_CASE(RegenerateAllocStubs) { 137 TEST_CASE(RegenerateAllocStubs) {
73 const char* kScriptChars = 138 const char* kScriptChars =
74 "class A {\n" 139 "class A {\n"
75 "}\n" 140 "}\n"
76 "unOpt() => new A(); \n" 141 "unOpt() => new A(); \n"
77 "optIt() => new A(); \n" 142 "optIt() => new A(); \n"
78 "A main() {\n" 143 "A main() {\n"
79 " return unOpt();\n" 144 " return unOpt();\n"
80 "}\n"; 145 "}\n";
81 146
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 EXPECT(val.IsInteger()); 242 EXPECT(val.IsInteger());
178 EXPECT_EQ(7, Integer::Cast(val).AsInt64Value()); 243 EXPECT_EQ(7, Integer::Cast(val).AsInt64Value());
179 244
180 intptr_t final_class_table_size = 245 intptr_t final_class_table_size =
181 Isolate::Current()->class_table()->NumCids(); 246 Isolate::Current()->class_table()->NumCids();
182 // Eval should not eat into this non-renewable resource. 247 // Eval should not eat into this non-renewable resource.
183 EXPECT_EQ(initial_class_table_size, final_class_table_size); 248 EXPECT_EQ(initial_class_table_size, final_class_table_size);
184 } 249 }
185 250
186 } // namespace dart 251 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/tests/vm/vm.status ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698