@@ -43,6 +43,7 @@ class RuntimeSchedulerTest : public testing::Test {
4343
4444 runtimeScheduler_ =
4545 std::make_unique<RuntimeScheduler>(runtimeExecutor, stubNow);
46+ runtimeScheduler_->setEnableYielding (true );
4647 }
4748
4849 jsi::Function createHostFunctionFromLambda (
@@ -317,6 +318,7 @@ TEST_F(RuntimeSchedulerTest, getCurrentPriorityLevel) {
317318}
318319
319320TEST_F (RuntimeSchedulerTest, scheduleWork) {
321+ runtimeScheduler_->setEnableYielding (false );
320322 bool wasCalled = false ;
321323 runtimeScheduler_->scheduleWork (
322324 [&](jsi::Runtime const &) { wasCalled = true ; });
@@ -334,7 +336,6 @@ TEST_F(RuntimeSchedulerTest, scheduleWork) {
334336}
335337
336338TEST_F (RuntimeSchedulerTest, scheduleWorkWithYielding) {
337- runtimeScheduler_->setEnableYielding (true );
338339 bool wasCalled = false ;
339340 runtimeScheduler_->scheduleWork (
340341 [&](jsi::Runtime const &) { wasCalled = true ; });
@@ -353,8 +354,6 @@ TEST_F(RuntimeSchedulerTest, scheduleWorkWithYielding) {
353354}
354355
355356TEST_F (RuntimeSchedulerTest, normalTaskYieldsToPlatformEvent) {
356- runtimeScheduler_->setEnableYielding (true );
357-
358357 bool didRunJavaScriptTask = false ;
359358 bool didRunPlatformWork = false ;
360359
@@ -382,8 +381,6 @@ TEST_F(RuntimeSchedulerTest, normalTaskYieldsToPlatformEvent) {
382381}
383382
384383TEST_F (RuntimeSchedulerTest, expiredTaskDoesntYieldToPlatformEvent) {
385- runtimeScheduler_->setEnableYielding (true );
386-
387384 bool didRunJavaScriptTask = false ;
388385 bool didRunPlatformWork = false ;
389386
@@ -412,8 +409,6 @@ TEST_F(RuntimeSchedulerTest, expiredTaskDoesntYieldToPlatformEvent) {
412409}
413410
414411TEST_F (RuntimeSchedulerTest, immediateTaskDoesntYieldToPlatformEvent) {
415- runtimeScheduler_->setEnableYielding (true );
416-
417412 bool didRunJavaScriptTask = false ;
418413 bool didRunPlatformWork = false ;
419414
@@ -603,4 +598,42 @@ TEST_F(RuntimeSchedulerTest, sameThreadTaskCreatesLowPriorityTask) {
603598 EXPECT_EQ (stubQueue_->size (), 0 );
604599}
605600
601+ TEST_F (RuntimeSchedulerTest, twoThreadsRequestAccessToTheRuntime) {
602+ bool didRunSynchronousTask = false ;
603+ bool didRunWork = false ;
604+
605+ runtimeScheduler_->scheduleWork (
606+ [&didRunWork](jsi::Runtime &) { didRunWork = true ; });
607+
608+ std::thread t1 ([this , &didRunSynchronousTask]() {
609+ runtimeScheduler_->executeNowOnTheSameThread (
610+ [&didRunSynchronousTask](jsi::Runtime &runtime) {
611+ didRunSynchronousTask = true ;
612+ });
613+ });
614+
615+ auto hasTask = stubQueue_->waitForTasks (2 , 1ms);
616+
617+ EXPECT_TRUE (hasTask);
618+ EXPECT_FALSE (didRunWork);
619+ EXPECT_FALSE (didRunSynchronousTask);
620+ EXPECT_TRUE (runtimeScheduler_->getShouldYield ());
621+ EXPECT_EQ (stubQueue_->size (), 2 );
622+
623+ stubQueue_->tick ();
624+
625+ EXPECT_TRUE (didRunWork);
626+ EXPECT_FALSE (didRunSynchronousTask);
627+ EXPECT_TRUE (runtimeScheduler_->getShouldYield ());
628+ EXPECT_EQ (stubQueue_->size (), 1 );
629+
630+ stubQueue_->tick ();
631+
632+ t1.join ();
633+
634+ EXPECT_TRUE (didRunWork);
635+ EXPECT_TRUE (didRunSynchronousTask);
636+ EXPECT_FALSE (runtimeScheduler_->getShouldYield ());
637+ }
638+
606639} // namespace facebook::react
0 commit comments