@@ -413,14 +413,15 @@ TEST(RasterThreadMerger, RunExpiredTasksWhileFirstTaskMergesThreads) {
413413 raster_thread_merger->MergeWithLease (1 );
414414 post_merge.CountDown ();
415415 });
416-
417- loop_raster->GetTaskRunner ()->PostTask ([&]() {
418- ASSERT_TRUE (raster_thread_merger->IsOnRasterizingThread ());
419- ASSERT_TRUE (raster_thread_merger->IsOnPlatformThread ());
420- ASSERT_EQ (fml::MessageLoop::GetCurrentTaskQueueId (), qid_platform);
421- raster_thread_merger->DecrementLease ();
422- post_merge.CountDown ();
423- });
416+ loop_raster->GetTaskRunner ()->PostDelayedTask (
417+ [&]() {
418+ ASSERT_TRUE (raster_thread_merger->IsOnRasterizingThread ());
419+ ASSERT_TRUE (raster_thread_merger->IsOnPlatformThread ());
420+ ASSERT_EQ (fml::MessageLoop::GetCurrentTaskQueueId (), qid_platform);
421+ raster_thread_merger->DecrementLease ();
422+ post_merge.CountDown ();
423+ },
424+ fml::TimeDelta::FromMilliseconds (100 ));
424425
425426 loop_raster->RunExpiredTasksNow ();
426427 post_merge.Wait ();
@@ -657,5 +658,77 @@ TEST(RasterThreadMerger,
657658 ASSERT_FALSE (merger_from_3_to_1->IsMerged ());
658659}
659660
661+ TEST (RasterThreadMerger, FlushAllExpiredTasksBeforeThreadMerging) {
662+ fml::MessageLoop* loop_platform = nullptr ;
663+ fml::AutoResetWaitableEvent latch1;
664+ std::thread thread_platform ([&loop_platform, &latch1]() {
665+ fml::MessageLoop::EnsureInitializedForCurrentThread ();
666+ loop_platform = &fml::MessageLoop::GetCurrent ();
667+ loop_platform->GetTaskRunner ()->PostTask ([&]() { latch1.Signal (); });
668+ loop_platform->Run ();
669+ });
670+
671+ fml::MessageLoop* loop_raster = nullptr ;
672+ fml::AutoResetWaitableEvent latch2;
673+ std::thread thread_raster ([&loop_raster, &loop_platform, &latch1, &latch2]() {
674+ latch1.Wait ();
675+
676+ fml::MessageLoop::EnsureInitializedForCurrentThread ();
677+ loop_raster = &fml::MessageLoop::GetCurrent ();
678+ fml::TaskQueueId qid_platform =
679+ loop_platform->GetTaskRunner ()->GetTaskQueueId ();
680+ fml::TaskQueueId qid_raster =
681+ loop_raster->GetTaskRunner ()->GetTaskQueueId ();
682+ fml::CountDownLatch post_merge (4 );
683+ const auto raster_thread_merger =
684+ fml::MakeRefCounted<fml::RasterThreadMerger>(qid_platform, qid_raster);
685+
686+ int order = 0 ;
687+ loop_raster->GetTaskRunner ()->PostTask ([&]() {
688+ ASSERT_TRUE (raster_thread_merger->IsOnRasterizingThread ());
689+ ASSERT_FALSE (raster_thread_merger->IsOnPlatformThread ());
690+ ASSERT_EQ (fml::MessageLoop::GetCurrentTaskQueueId (), qid_raster);
691+ raster_thread_merger->MergeWithLease (1 );
692+ ASSERT_EQ (3 , ++order);
693+ post_merge.CountDown ();
694+ });
695+
696+ loop_raster->GetTaskRunner ()->PostTask ([&]() {
697+ ASSERT_TRUE (raster_thread_merger->IsOnRasterizingThread ());
698+ ASSERT_FALSE (raster_thread_merger->IsOnPlatformThread ());
699+ ASSERT_EQ (1 , ++order);
700+ post_merge.CountDown ();
701+ });
702+
703+ loop_raster->GetTaskRunner ()->PostTask ([&]() {
704+ ASSERT_TRUE (raster_thread_merger->IsOnRasterizingThread ());
705+ ASSERT_FALSE (raster_thread_merger->IsOnPlatformThread ());
706+ ASSERT_EQ (2 , ++order);
707+ post_merge.CountDown ();
708+ });
709+
710+ loop_raster->GetTaskRunner ()->PostDelayedTask (
711+ [&]() {
712+ ASSERT_TRUE (raster_thread_merger->IsOnRasterizingThread ());
713+ ASSERT_TRUE (raster_thread_merger->IsOnPlatformThread ());
714+ ASSERT_EQ (fml::MessageLoop::GetCurrentTaskQueueId (), qid_platform);
715+ ASSERT_EQ (4 , ++order);
716+ raster_thread_merger->DecrementLease ();
717+ post_merge.CountDown ();
718+ },
719+ fml::TimeDelta::FromMilliseconds (100 ));
720+
721+ loop_raster->RunExpiredTasksNow ();
722+ post_merge.Wait ();
723+ latch2.Signal ();
724+ });
725+
726+ latch2.Wait ();
727+ loop_platform->GetTaskRunner ()->PostTask (
728+ [&]() { loop_platform->Terminate (); });
729+
730+ thread_platform.join ();
731+ thread_raster.join ();
732+ }
660733} // namespace testing
661734} // namespace fml
0 commit comments