393 auto isolate_group = thread->isolate_group();
395 const intptr_t kTaskCount = 6;
396 std::atomic<intptr_t> gc_only_checkins[kTaskCount];
397 std::atomic<intptr_t> deopt_checkins[kTaskCount];
398 std::atomic<intptr_t> reload_checkins[kTaskCount];
399 std::atomic<intptr_t> timeout_checkins[kTaskCount];
400 for (intptr_t i = 0; i < kTaskCount; ++i) {
401 gc_only_checkins[i] = 0;
402 deopt_checkins[i] = 0;
403 reload_checkins[i] = 0;
404 timeout_checkins[i] = 0;
423 auto wait_for_sync = [&](intptr_t syncs) {
426 for (intptr_t i = 0; i < kTaskCount; ++i) {
427 const intptr_t all = gc_only_checkins[i] + deopt_checkins[i] +
428 reload_checkins[i] + timeout_checkins[i];
441 std::vector<std::shared_ptr<CheckinTask::Data>> threads;
442 for (intptr_t i = 0; i < kTaskCount; ++i) {
443 const auto level = task_to_level(i);
445 isolate_group, level, &gc_only_checkins[i], &deopt_checkins[i],
446 &reload_checkins[i], &timeout_checkins[i]));
447 threads.push_back(std::move(
data));
454 for (intptr_t i = 0; i < kTaskCount; i++) {
457 for (intptr_t i = 0; i < kTaskCount; i++) {
460 for (intptr_t i = 0; i < kTaskCount; i++) {
476 for (intptr_t i = 0; i < kTaskCount; i++) {
479 for (intptr_t i = 0; i < kTaskCount; i++) {
482 for (intptr_t i = 0; i < kTaskCount; ++i) {
483 switch (task_to_level(i)) {
485 EXPECT_EQ(2, gc_only_checkins[i]);
486 EXPECT_EQ(0, deopt_checkins[i]);
487 EXPECT_EQ(0, reload_checkins[i]);
488 EXPECT_EQ(4, timeout_checkins[i]);
491 EXPECT_EQ(0, gc_only_checkins[i]);
492 EXPECT_EQ(4, deopt_checkins[i]);
493 EXPECT_EQ(0, reload_checkins[i]);
494 EXPECT_EQ(2, timeout_checkins[i]);
497 EXPECT_EQ(0, gc_only_checkins[i]);
498 EXPECT_EQ(0, deopt_checkins[i]);
499 EXPECT_EQ(6, reload_checkins[i]);
500 EXPECT_EQ(0, timeout_checkins[i]);
566 auto isolate_group = thread->isolate_group();
568 const intptr_t kTaskCount = 5;
570 std::vector<std::shared_ptr<StressTask::Data>> threads;
571 for (intptr_t i = 0; i < kTaskCount; ++i) {
573 threads.push_back(std::move(
data));
576 thread->EnterSafepoint();
581 for (intptr_t i = 0; i < kTaskCount; i++) {
584 for (intptr_t i = 0; i < kTaskCount; i++) {
587 for (intptr_t i = 0; i < kTaskCount; i++) {
591 for (intptr_t i = 0; i < kTaskCount; i++) {
594 for (intptr_t i = 0; i < kTaskCount; i++) {
598 thread->ExitSafepoint();
602 auto safepoint_handler = thread->isolate_group()->safepoint_handler();
605 EXPECT(safepoint_handler->InnermostSafepointOperation(thread) ==
608 EXPECT(safepoint_handler->InnermostSafepointOperation(thread) ==
611 EXPECT(safepoint_handler->InnermostSafepointOperation(thread) ==
614 EXPECT(safepoint_handler->InnermostSafepointOperation(thread) ==
619 EXPECT(safepoint_handler->InnermostSafepointOperation(thread) ==
622 EXPECT(safepoint_handler->InnermostSafepointOperation(thread) ==
627 EXPECT(safepoint_handler->InnermostSafepointOperation(thread) ==
630 EXPECT(safepoint_handler->InnermostSafepointOperation(thread) ==
751 auto isolate = thread->isolate();
752 auto messages = isolate->message_handler();
756 std::shared_ptr<ReloadTask::Data> task(
771 ASSERT(!thread->IsAtSafepoint());
772 while (!messages->HasOOBMessages()) {
778 std::unique_ptr<Message>
message = messages->StealOOBMessage();
784 thread->BlockForSafepoint();
792 auto isolate = thread->isolate();
793 auto messages = isolate->message_handler();
800 std::shared_ptr<ReloadTask::Data> task(
809 ASSERT(!thread->IsAtSafepoint());
812 thread->EnterSafepoint();
815 ASSERT(thread->IsAtSafepoint());
816 while (!messages->HasOOBMessages()) {
820 std::unique_ptr<Message>
message = messages->StealOOBMessage();
823 thread->ExitSafepoint();
825 EXPECT(!messages->HasOOBMessages());
831 EXPECT(messages->HasOOBMessages());
832 std::unique_ptr<Message>
message = messages->StealOOBMessage();
838 thread->BlockForSafepoint();
Data(IsolateGroup *isolate_group, SafepointLevel level, std::atomic< intptr_t > *gc_only_checkins, std::atomic< intptr_t > *deopt_checkin, std::atomic< intptr_t > *reload_checkin, std::atomic< intptr_t > *timeout_checkin)