Files
react-native/ReactCommon/react/renderer/core/EventQueueProcessor.cpp
T
Samuel Susla 285406103d Introduce EventQueueProcessor
Summary:
Changelog: [internal]

Pulling out event queue processing to its separate class. We will be adding more logic there so it makes sense to separate it for simplicity and testability purposes.

Alternative names that came to mind: `EventsProcessor`, `EventsDispatcher`.

Reviewed By: JoshuaGross

Differential Revision: D28572283

fbshipit-source-id: 1cb2459f616b9995f66da80d50c401e68002da7f
2021-05-25 01:16:04 -07:00

59 lines
1.5 KiB
C++

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "EventQueue.h"
#include "EventEmitter.h"
#include "ShadowNodeFamily.h"
namespace facebook {
namespace react {
EventQueueProcessor::EventQueueProcessor(
EventPipe eventPipe,
StatePipe statePipe)
: eventPipe_(std::move(eventPipe)), statePipe_(std::move(statePipe)) {}
void EventQueueProcessor::flushEvents(
jsi::Runtime &runtime,
std::vector<RawEvent> &&events) const {
{
std::lock_guard<std::mutex> lock(EventEmitter::DispatchMutex());
for (const auto &event : events) {
if (event.eventTarget) {
event.eventTarget->retain(runtime);
}
}
}
for (const auto &event : events) {
eventPipe_(
runtime, event.eventTarget.get(), event.type, event.payloadFactory);
}
// No need to lock `EventEmitter::DispatchMutex()` here.
// The mutex protects from a situation when the `instanceHandle` can be
// deallocated during accessing, but that's impossible at this point because
// we have a strong pointer to it.
for (const auto &event : events) {
if (event.eventTarget) {
event.eventTarget->release(runtime);
}
}
}
void EventQueueProcessor::flushStateUpdates(
std::vector<StateUpdate> &&states) const {
for (const auto &stateUpdate : states) {
statePipe_(stateUpdate);
}
}
} // namespace react
} // namespace facebook