From 020e1b6e862aeea217fb0ee3f755f76497e8318d Mon Sep 17 00:00:00 2001 From: Cody Pizzaia Date: Wed, 23 Oct 2024 19:44:14 -0700 Subject: [PATCH] Revert D64287526: batch sync events based on event beats Differential Revision: D64287526 Original commit changeset: a5dc3b643ef1 Original Phabricator Diff: D64287526 fbshipit-source-id: 9c967bd2573dc69bfbde69a7a79046e9d58fcb21 --- .../react/renderer/core/EventBeat.cpp | 14 +------------ .../react/renderer/core/EventBeat.h | 7 ------- .../react/renderer/core/EventDispatcher.cpp | 4 +++- .../react/renderer/core/EventDispatcher.h | 1 + .../react/renderer/core/EventQueue.cpp | 20 ++++++++++++++++--- .../react/renderer/core/EventQueue.h | 7 ++++++- .../react/renderer/scheduler/Scheduler.cpp | 1 + 7 files changed, 29 insertions(+), 25 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventBeat.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventBeat.cpp index ecd919898de..9a9fd5266d7 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventBeat.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventBeat.cpp @@ -21,11 +21,6 @@ void EventBeat::request() const { isRequested_ = true; } -void EventBeat::requestSynchronous() const { - isSynchronousRequested_ = true; - request(); -} - void EventBeat::setBeatCallback(BeatCallback beatCallback) { beatCallback_ = std::move(beatCallback); } @@ -38,7 +33,7 @@ void EventBeat::induce() const { isRequested_ = false; isBeatCallbackScheduled_ = true; - auto beat = std::function( + runtimeScheduler_.scheduleWork( [this, ownerBox = ownerBox_](jsi::Runtime& runtime) { auto owner = ownerBox->owner.lock(); if (!owner) { @@ -50,13 +45,6 @@ void EventBeat::induce() const { beatCallback_(runtime); } }); - - if (isSynchronousRequested_) { - isSynchronousRequested_ = false; - runtimeScheduler_.executeNowOnTheSameThread(std::move(beat)); - } else { - runtimeScheduler_.scheduleWork(std::move(beat)); - } } } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventBeat.h b/packages/react-native/ReactCommon/react/renderer/core/EventBeat.h index 59fd208e581..a03a9f7cb87 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventBeat.h +++ b/packages/react-native/ReactCommon/react/renderer/core/EventBeat.h @@ -74,12 +74,6 @@ class EventBeat { */ virtual void request() const; - /* - * Communicates to the Beat that a consumer is waiting synchronously for the - * coming beat. - */ - virtual void requestSynchronous() const; - /* * The callback is must be called on the proper thread. */ @@ -99,7 +93,6 @@ class EventBeat { private: RuntimeScheduler& runtimeScheduler_; mutable std::atomic isBeatCallbackScheduled_{false}; - mutable std::atomic isSynchronousRequested_{false}; }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventDispatcher.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventDispatcher.cpp index fb18eea2488..10d6d0b4659 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventDispatcher.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventDispatcher.cpp @@ -18,9 +18,11 @@ namespace facebook::react { EventDispatcher::EventDispatcher( const EventQueueProcessor& eventProcessor, std::unique_ptr eventBeat, + RuntimeScheduler& runtimeScheduler, StatePipe statePipe, std::weak_ptr eventLogger) - : eventQueue_(EventQueue(eventProcessor, std::move(eventBeat))), + : eventQueue_( + EventQueue(eventProcessor, std::move(eventBeat), runtimeScheduler)), statePipe_(std::move(statePipe)), eventLogger_(std::move(eventLogger)) {} diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventDispatcher.h b/packages/react-native/ReactCommon/react/renderer/core/EventDispatcher.h index c103e489822..79eab45e120 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventDispatcher.h +++ b/packages/react-native/ReactCommon/react/renderer/core/EventDispatcher.h @@ -33,6 +33,7 @@ class EventDispatcher { EventDispatcher( const EventQueueProcessor& eventProcessor, std::unique_ptr eventBeat, + RuntimeScheduler& runtimeScheduler, StatePipe statePipe, std::weak_ptr eventLogger); diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp index 9290bcc106c..4643e5dea27 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp @@ -15,9 +15,11 @@ namespace facebook::react { EventQueue::EventQueue( EventQueueProcessor eventProcessor, - std::unique_ptr eventBeat) + std::unique_ptr eventBeat, + RuntimeScheduler& runtimeScheduler) : eventProcessor_(std::move(eventProcessor)), - eventBeat_(std::move(eventBeat)) { + eventBeat_(std::move(eventBeat)), + runtimeScheduler_(&runtimeScheduler) { eventBeat_->setBeatCallback( [this](jsi::Runtime& runtime) { onBeat(runtime); }); } @@ -77,14 +79,26 @@ void EventQueue::enqueueStateUpdate(StateUpdate&& stateUpdate) const { } void EventQueue::onEnqueue() const { + if (synchronousAccessRequested_) { + // Sync flush has been scheduled, no need to request access to the runtime. + return; + } eventBeat_->request(); } void EventQueue::experimental_flushSync() const { - eventBeat_->requestSynchronous(); + synchronousAccessRequested_ = true; + runtimeScheduler_->executeNowOnTheSameThread([this](jsi::Runtime& runtime) { + synchronousAccessRequested_ = false; + onBeat(runtime); + }); } void EventQueue::onBeat(jsi::Runtime& runtime) const { + if (synchronousAccessRequested_) { + // Sync flush has been scheduled, let's yield to it. + return; + } flushStateUpdates(); flushEvents(runtime); } diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventQueue.h b/packages/react-native/ReactCommon/react/renderer/core/EventQueue.h index 3578473b766..f82940c431f 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventQueue.h +++ b/packages/react-native/ReactCommon/react/renderer/core/EventQueue.h @@ -29,7 +29,8 @@ class EventQueue { public: EventQueue( EventQueueProcessor eventProcessor, - std::unique_ptr eventBeat); + std::unique_ptr eventBeat, + RuntimeScheduler& runtimeScheduler); /* * Enqueues and (probably later) dispatch a given event. @@ -74,6 +75,10 @@ class EventQueue { mutable std::vector eventQueue_; mutable std::vector stateUpdateQueue_; mutable std::mutex queueMutex_; + + // TODO: T183075253 + RuntimeScheduler* runtimeScheduler_; + mutable std::atomic_bool synchronousAccessRequested_{false}; }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp index 3a956b52b7d..a80f53afcc1 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp @@ -101,6 +101,7 @@ Scheduler::Scheduler( EventQueueProcessor( eventPipe, eventPipeConclusion, statePipe, eventPerformanceLogger_), std::move(eventBeat), + *runtimeScheduler, statePipe, eventPerformanceLogger_);