| Index: runtime/vm/compiler_test.cc
|
| diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
|
| index aa5b8929c607cf53de5f41f2577444c4eff92bc3..c56ba377bebdbfd9c0e3ba6cb8f5375c1a686e82 100644
|
| --- a/runtime/vm/compiler_test.cc
|
| +++ b/runtime/vm/compiler_test.cc
|
| @@ -9,6 +9,7 @@
|
| #include "vm/dart_api_impl.h"
|
| #include "vm/object.h"
|
| #include "vm/symbols.h"
|
| +#include "vm/thread_pool.h"
|
| #include "vm/unit_test.h"
|
|
|
| namespace dart {
|
| @@ -28,7 +29,7 @@ TEST_CASE(CompileScript) {
|
| }
|
|
|
|
|
| -TEST_CASE(CompileFunction) {
|
| +static void CompileFunctionImpl() {
|
| const char* kScriptChars =
|
| "class A {\n"
|
| " static foo() { return 42; }\n"
|
| @@ -69,6 +70,70 @@ TEST_CASE(CompileFunction) {
|
| }
|
|
|
|
|
| +TEST_CASE(CompileFunction) {
|
| + CompileFunctionImpl();
|
| +}
|
| +
|
| +
|
| +// Runs 'CompileFunctionImpl' on a helper thread.
|
| +class CompileFunctionTask : public ThreadPool::Task {
|
| + public:
|
| + CompileFunctionTask(Isolate* isolate,
|
| + Monitor* done_monitor,
|
| + bool* done)
|
| + : isolate_(isolate),
|
| + done_monitor_(done_monitor),
|
| + done_(done) {
|
| + }
|
| +
|
| + virtual void Run() {
|
| + Thread::EnterIsolateAsHelper(isolate_);
|
| + {
|
| + Thread* thread = Thread::Current();
|
| + StackZone stack_zone(thread);
|
| + HANDLESCOPE(thread);
|
| + CompileFunctionImpl();
|
| + }
|
| + Thread::ExitIsolateAsHelper();
|
| + // Tell main thread that we are done.
|
| + {
|
| + MonitorLocker ml(done_monitor_);
|
| + ASSERT(!*done_);
|
| + *done_ = true;
|
| + ml.Notify();
|
| + }
|
| + }
|
| +
|
| + private:
|
| + Isolate* isolate_;
|
| + Monitor* done_monitor_;
|
| + bool* done_;
|
| +};
|
| +
|
| +
|
| +TEST_CASE(CompileFunctionOnHelperThread) {
|
| + Monitor done_monitor;
|
| + bool done = false;
|
| + Isolate* isolate = Thread::Current()->isolate();
|
| + // Flush store buffers, etc.
|
| + // TODO(koda): Currently, the GC only does this for the current thread, (i.e,
|
| + // the helper, in this test), but it should be done for all *threads*
|
| + // after/at safepointing.
|
| + Thread::PrepareForGC();
|
| + Dart::thread_pool()->Run(
|
| + new CompileFunctionTask(isolate, &done_monitor, &done));
|
| + {
|
| + // Manually wait.
|
| + // TODO(koda): Replace with execution of Dart and/or VM code when GC
|
| + // actually safepoints everything.
|
| + MonitorLocker ml(&done_monitor);
|
| + while (!done) {
|
| + ml.Wait();
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| TEST_CASE(RegenerateAllocStubs) {
|
| const char* kScriptChars =
|
| "class A {\n"
|
|
|