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

Unified Diff: runtime/vm/thread_test.cc

Issue 1541073002: Implement safepointing of threads (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: fix-typo Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/thread_registry.cc ('k') | runtime/vm/timeline.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/thread_test.cc
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index f619d51e6ca87de76d8959f6ab8a36f9fb76ae05..95ea190c71d7a002aca2b87d04e6c9871f6b7ef6 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -7,8 +7,9 @@
#include "vm/lockers.h"
#include "vm/unit_test.h"
#include "vm/profiler.h"
+#include "vm/safepoint.h"
+#include "vm/stack_frame.h"
#include "vm/thread_pool.h"
-#include "vm/thread_registry.h"
namespace dart {
@@ -172,7 +173,7 @@ class TaskWithZoneAllocation : public ThreadPool::Task {
};
-TEST_CASE(ManyTasksWithZones) {
+VM_TEST_CASE(ManyTasksWithZones) {
const int kTaskCount = 100;
Monitor sync[kTaskCount];
bool done[kTaskCount];
@@ -208,7 +209,7 @@ TEST_CASE(ThreadRegistry) {
Isolate* orig = Thread::Current()->isolate();
Zone* orig_zone = Thread::Current()->zone();
char* orig_str = orig_zone->PrintToString("foo");
- Thread::ExitIsolate();
+ Dart_ExitIsolate();
// Create and enter a new isolate.
Dart_CreateIsolate(
NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, NULL);
@@ -226,7 +227,7 @@ TEST_CASE(ThreadRegistry) {
EXPECT(zone1 != orig_zone);
}
Dart_ShutdownIsolate();
- Thread::EnterIsolate(orig);
+ Dart_EnterIsolate(reinterpret_cast<Dart_Isolate>(orig));
// Original zone should be preserved.
EXPECT_EQ(orig_zone, Thread::Current()->zone());
EXPECT_STREQ("foo", orig_str);
@@ -244,12 +245,12 @@ class SafepointTestTask : public ThreadPool::Task {
static const intptr_t kTaskCount;
SafepointTestTask(Isolate* isolate,
- Mutex* mutex,
+ Monitor* monitor,
intptr_t* expected_count,
intptr_t* total_done,
intptr_t* exited)
: isolate_(isolate),
- mutex_(mutex),
+ monitor_(monitor),
expected_count_(expected_count),
total_done_(total_done),
exited_(exited),
@@ -258,11 +259,11 @@ class SafepointTestTask : public ThreadPool::Task {
virtual void Run() {
Thread::EnterIsolateAsHelper(isolate_);
{
- MutexLocker ml(mutex_);
+ MonitorLocker ml(monitor_);
++*expected_count_;
}
- for (int i = 0; ; ++i) {
- Thread* thread = Thread::Current();
+ Thread* thread = Thread::Current();
+ for (int i = reinterpret_cast<intptr_t>(thread); ; ++i) {
StackZone stack_zone(thread);
Zone* zone = thread->zone();
HANDLESCOPE(thread);
@@ -270,23 +271,23 @@ class SafepointTestTask : public ThreadPool::Task {
Smi& smi = Smi::Handle(zone, Smi::New(kUniqueSmi));
if ((i % 100) != 0) {
// Usually, we just cooperate.
- isolate_->thread_registry()->CheckSafepoint();
+ TransitionVMToBlocked transition(thread);
} else {
// But occasionally, organize a rendezvous.
- isolate_->thread_registry()->SafepointThreads();
+ SafepointOperationScope safepoint_scope(thread);
ObjectCounter counter(isolate_, &smi);
isolate_->IterateObjectPointers(
&counter,
StackFrameIterator::kValidateFrames);
{
- MutexLocker ml(mutex_);
+ MonitorLocker ml(monitor_);
EXPECT_EQ(*expected_count_, counter.count());
}
UserTag& tag = UserTag::Handle(zone, isolate_->current_tag());
if (tag.raw() != isolate_->default_tag()) {
String& label = String::Handle(zone, tag.label());
EXPECT(label.Equals("foo"));
- MutexLocker ml(mutex_);
+ MonitorLocker ml(monitor_);
if (*expected_count_ == kTaskCount && !local_done_) {
// Success for the first time! Remember that we are done, and
// update the total count.
@@ -294,11 +295,10 @@ class SafepointTestTask : public ThreadPool::Task {
++*total_done_;
}
}
- isolate_->thread_registry()->ResumeAllThreads();
}
// Check whether everyone is done.
{
- MutexLocker ml(mutex_);
+ MonitorLocker ml(monitor_);
if (*total_done_ == kTaskCount) {
// Another task might be at SafepointThreads when resuming. Ensure its
// expectation reflects reality, since we pop our handles here.
@@ -309,14 +309,15 @@ class SafepointTestTask : public ThreadPool::Task {
}
Thread::ExitIsolateAsHelper();
{
- MutexLocker ml(mutex_);
+ MonitorLocker ml(monitor_);
++*exited_;
+ ml.Notify();
}
}
private:
Isolate* isolate_;
- Mutex* mutex_;
+ Monitor* monitor_;
intptr_t* expected_count_; // # copies of kUniqueSmi we expect to visit.
intptr_t* total_done_; // # tasks that successfully safepointed once.
intptr_t* exited_; // # tasks that are no longer running.
@@ -334,13 +335,13 @@ const intptr_t SafepointTestTask::kTaskCount = 5;
// - helpers.
TEST_CASE(SafepointTestDart) {
Isolate* isolate = Thread::Current()->isolate();
- Mutex mutex;
+ Monitor monitor;
intptr_t expected_count = 0;
intptr_t total_done = 0;
intptr_t exited = 0;
for (int i = 0; i < SafepointTestTask::kTaskCount; i++) {
Dart::thread_pool()->Run(new SafepointTestTask(
- isolate, &mutex, &expected_count, &total_done, &exited));
+ isolate, &monitor, &expected_count, &total_done, &exited));
}
// Run Dart code on the main thread long enough to allow all helpers
// to get their verification done and exit. Use a specific UserTag
@@ -367,7 +368,10 @@ TEST_CASE(SafepointTestDart) {
EXPECT_VALID(result);
// Ensure we looped long enough to allow all helpers to succeed and exit.
{
- MutexLocker ml(&mutex);
+ MonitorLocker ml(&monitor);
+ while (exited != SafepointTestTask::kTaskCount) {
+ ml.Wait();
+ }
EXPECT_EQ(SafepointTestTask::kTaskCount, total_done);
EXPECT_EQ(SafepointTestTask::kTaskCount, exited);
}
@@ -379,30 +383,27 @@ TEST_CASE(SafepointTestDart) {
// - main thread in VM code,
// organized by
// - helpers.
-TEST_CASE(SafepointTestVM) {
+VM_TEST_CASE(SafepointTestVM) {
Isolate* isolate = thread->isolate();
- Mutex mutex;
+ Monitor monitor;
intptr_t expected_count = 0;
intptr_t total_done = 0;
intptr_t exited = 0;
for (int i = 0; i < SafepointTestTask::kTaskCount; i++) {
Dart::thread_pool()->Run(new SafepointTestTask(
- isolate, &mutex, &expected_count, &total_done, &exited));
+ isolate, &monitor, &expected_count, &total_done, &exited));
}
String& label = String::Handle(String::New("foo"));
UserTag& tag = UserTag::Handle(UserTag::New(label));
isolate->set_current_tag(tag);
- while (true) {
- isolate->thread_registry()->CheckSafepoint();
- MutexLocker ml(&mutex);
- if (exited == SafepointTestTask::kTaskCount) {
- break;
- }
+ MonitorLocker ml(&monitor);
+ while (exited != SafepointTestTask::kTaskCount) {
+ ml.WaitWithSafepointCheck(thread);
}
}
-TEST_CASE(ThreadIterator_Count) {
+VM_TEST_CASE(ThreadIterator_Count) {
intptr_t thread_count_0 = 0;
intptr_t thread_count_1 = 0;
@@ -430,7 +431,7 @@ TEST_CASE(ThreadIterator_Count) {
}
-TEST_CASE(ThreadIterator_FindSelf) {
+VM_TEST_CASE(ThreadIterator_FindSelf) {
OSThread* current = OSThread::Current();
EXPECT(OSThread::IsThreadInList(current->join_id()));
}
@@ -490,36 +491,32 @@ TEST_CASE(ThreadIterator_AddFindRemove) {
// organized by
// - main thread, and
// - helpers.
-TEST_CASE(SafepointTestVM2) {
+VM_TEST_CASE(SafepointTestVM2) {
Isolate* isolate = thread->isolate();
- Mutex mutex;
+ Monitor monitor;
intptr_t expected_count = 0;
intptr_t total_done = 0;
intptr_t exited = 0;
for (int i = 0; i < SafepointTestTask::kTaskCount; i++) {
Dart::thread_pool()->Run(new SafepointTestTask(
- isolate, &mutex, &expected_count, &total_done, &exited));
+ isolate, &monitor, &expected_count, &total_done, &exited));
}
bool all_helpers = false;
do {
- isolate->thread_registry()->SafepointThreads();
+ SafepointOperationScope safepoint_scope(thread);
{
- MutexLocker ml(&mutex);
+ MonitorLocker ml(&monitor);
if (expected_count == SafepointTestTask::kTaskCount) {
all_helpers = true;
}
}
- isolate->thread_registry()->ResumeAllThreads();
} while (!all_helpers);
String& label = String::Handle(String::New("foo"));
UserTag& tag = UserTag::Handle(UserTag::New(label));
isolate->set_current_tag(tag);
- while (true) {
- isolate->thread_registry()->CheckSafepoint();
- MutexLocker ml(&mutex);
- if (exited == SafepointTestTask::kTaskCount) {
- break;
- }
+ MonitorLocker ml(&monitor);
+ while (exited != SafepointTestTask::kTaskCount) {
+ ml.WaitWithSafepointCheck(thread);
}
}
@@ -562,14 +559,14 @@ class AllocAndGCTask : public ThreadPool::Task {
};
-TEST_CASE(HelperAllocAndGC) {
+VM_TEST_CASE(HelperAllocAndGC) {
Monitor done_monitor;
bool done = false;
- Isolate* isolate = Thread::Current()->isolate();
+ Isolate* isolate = thread->isolate();
Dart::thread_pool()->Run(new AllocAndGCTask(isolate, &done_monitor, &done));
{
while (true) {
- isolate->thread_registry()->CheckSafepoint();
+ TransitionVMToBlocked transition(thread);
MonitorLocker ml(&done_monitor);
if (done) {
break;
« no previous file with comments | « runtime/vm/thread_registry.cc ('k') | runtime/vm/timeline.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698