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 "platform/assert.h" | 5 #include "platform/assert.h" |
6 #include "vm/isolate.h" | 6 #include "vm/isolate.h" |
7 #include "vm/lockers.h" | 7 #include "vm/lockers.h" |
8 #include "vm/unit_test.h" | 8 #include "vm/unit_test.h" |
9 #include "vm/profiler.h" | 9 #include "vm/profiler.h" |
10 #include "vm/thread_pool.h" | 10 #include "vm/thread_pool.h" |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
441 isolate->set_current_tag(tag); | 441 isolate->set_current_tag(tag); |
442 while (true) { | 442 while (true) { |
443 isolate->thread_registry()->CheckSafepoint(); | 443 isolate->thread_registry()->CheckSafepoint(); |
444 MutexLocker ml(&mutex); | 444 MutexLocker ml(&mutex); |
445 if (exited == SafepointTestTask::kTaskCount) { | 445 if (exited == SafepointTestTask::kTaskCount) { |
446 break; | 446 break; |
447 } | 447 } |
448 } | 448 } |
449 } | 449 } |
450 | 450 |
451 | |
452 class AllocAndGCTask : public ThreadPool::Task { | |
453 public: | |
454 AllocAndGCTask(Isolate* isolate, | |
455 Monitor* done_monitor, | |
456 bool* done) | |
457 : isolate_(isolate), | |
458 done_monitor_(done_monitor), | |
459 done_(done) { | |
460 } | |
461 | |
462 virtual void Run() { | |
463 Thread::EnterIsolateAsHelper(isolate_); | |
464 { | |
465 Thread* thread = Thread::Current(); | |
466 StackZone stack_zone(thread); | |
467 Zone* zone = stack_zone.GetZone(); | |
468 HANDLESCOPE(thread); | |
469 String& old_str = String::Handle(zone, String::New("old", Heap::kOld)); | |
470 isolate_->heap()->CollectAllGarbage(); | |
471 EXPECT(old_str.Equals("old")); | |
472 } | |
473 Thread::ExitIsolateAsHelper(); | |
474 // Tell main thread that we are ready. | |
475 { | |
476 MonitorLocker ml(done_monitor_); | |
477 ASSERT(!*done_); | |
478 *done_ = true; | |
479 ml.Notify(); | |
480 } | |
481 } | |
482 | |
483 private: | |
484 Isolate* isolate_; | |
485 Monitor* done_monitor_; | |
486 bool* done_; | |
487 }; | |
488 | |
489 | |
490 TEST_CASE(HelperAllocAndGC) { | |
491 Monitor done_monitor; | |
492 bool done = false; | |
493 Isolate* isolate = Thread::Current()->isolate(); | |
494 // Flush store buffers, etc. | |
495 // TODO(koda): Currently, the GC only does this for the current thread, (i.e, | |
496 // the helper, in this test), but it should be done for all *threads* | |
497 // after/at safepointing. | |
Ivan Posva
2015/08/14 22:15:29
// while reaching a safepoint.
koda
2015/08/17 15:51:07
Done.
| |
498 Thread::PrepareForGC(); | |
499 Dart::thread_pool()->Run(new AllocAndGCTask(isolate, &done_monitor, &done)); | |
500 { | |
501 // Manually wait. | |
502 // TODO(koda): Replace with execution of Dart and/or VM code when GC | |
503 // actually safepoints everything. | |
504 MonitorLocker ml(&done_monitor); | |
505 while (!done) { | |
506 ml.Wait(); | |
507 } | |
508 } | |
509 } | |
510 | |
451 } // namespace dart | 511 } // namespace dart |
OLD | NEW |