From 306a8adade432ae5c12f0a13130c4e599d64c642 Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Wed, 28 Oct 2020 19:46:00 -0700 Subject: [PATCH] Fabric: Using shared pointer for event counter in ViewEventEmitter Summary: The callback `dispatchEvent` is called asynchronously on the JavaScript thread, so all data it uses must be copied to the lambda. To work around this constraint we use a shared pointer for the counter. Changelog: [Internal] Fabric-specific internal change. Reviewed By: sammy-SC Differential Revision: D24598840 fbshipit-source-id: fb5581858d54dc806863caf0c7c4f612ed6046e2 --- .../renderer/components/view/ViewEventEmitter.cpp | 10 +++++----- .../react/renderer/components/view/ViewEventEmitter.h | 4 +++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/ReactCommon/react/renderer/components/view/ViewEventEmitter.cpp b/ReactCommon/react/renderer/components/view/ViewEventEmitter.cpp index e26f7c143a6..a81f85af595 100644 --- a/ReactCommon/react/renderer/components/view/ViewEventEmitter.cpp +++ b/ReactCommon/react/renderer/components/view/ViewEventEmitter.cpp @@ -46,17 +46,17 @@ void ViewEventEmitter::onLayout(const LayoutMetrics &layoutMetrics) const { lastLayoutMetrics_ = layoutMetrics; } - std::atomic_uint_fast8_t *eventCounter = &eventCounter_; - uint_fast8_t expectedEventCount = ++*eventCounter; + auto expectedEventCount = ++*eventCounter_; // dispatchUniqueEvent only drops consecutive onLayout events to the same // node. We want to drop *any* unprocessed onLayout events when there's a // newer one. dispatchEvent( "layout", - [frame = layoutMetrics.frame, expectedEventCount, eventCounter]( - jsi::Runtime &runtime) { - uint_fast8_t actualEventCount = eventCounter->load(); + [frame = layoutMetrics.frame, + expectedEventCount, + eventCounter = eventCounter_](jsi::Runtime &runtime) { + auto actualEventCount = eventCounter->load(); if (expectedEventCount != actualEventCount) { // Drop stale events return jsi::Value::null(); diff --git a/ReactCommon/react/renderer/components/view/ViewEventEmitter.h b/ReactCommon/react/renderer/components/view/ViewEventEmitter.h index 237c9a53b10..c00802431a1 100644 --- a/ReactCommon/react/renderer/components/view/ViewEventEmitter.h +++ b/ReactCommon/react/renderer/components/view/ViewEventEmitter.h @@ -40,7 +40,9 @@ class ViewEventEmitter : public TouchEventEmitter { private: mutable std::mutex layoutMetricsMutex_; mutable LayoutMetrics lastLayoutMetrics_; - mutable std::atomic_uint_fast8_t eventCounter_{0}; + + mutable std::shared_ptr eventCounter_{ + std::make_shared(0)}; }; } // namespace react