From 80685d52b8ef1e239329c137a45b567b0b65ef76 Mon Sep 17 00:00:00 2001 From: Xin Chen Date: Mon, 21 Aug 2023 13:25:31 -0700 Subject: [PATCH] Add systrace for event type when calling RCTDeviceEventEmitter (#39085) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/39085 Adding arguments in systrace for event emitter event types. This is helpful to understand why sometimes JS render is triggered from native side. Changelog: [Internal] - Add event type information from native to js event emitter calls Reviewed By: rshest Differential Revision: D48448904 fbshipit-source-id: cbb4b86e781384d56205fec23931cd773e4a58a8 --- .../EventEmitter/RCTDeviceEventEmitter.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.js b/packages/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.js index 25698329188..d53df915597 100644 --- a/packages/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.js +++ b/packages/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.js @@ -10,6 +10,7 @@ import type {IEventEmitter} from '../vendor/emitter/EventEmitter'; +import {beginEvent, endEvent} from '../Performance/Systrace'; import EventEmitter from '../vendor/emitter/EventEmitter'; // FIXME: use typed events @@ -21,12 +22,22 @@ type RCTDeviceEventDefinitions = $FlowFixMe; * * NativeModules that emit events should instead subclass `NativeEventEmitter`. */ -const RCTDeviceEventEmitter: IEventEmitter = - new EventEmitter(); +class RCTDeviceEventEmitter extends EventEmitter { + // Add systrace to RCTDeviceEventEmitter.emit method for debugging + emit>( + eventType: TEvent, + ...args: RCTDeviceEventDefinitions[TEvent] + ): void { + beginEvent(() => `RCTDeviceEventEmitter.emit#${eventType}`); + super.emit(eventType, ...args); + endEvent(); + } +} +const instance = new RCTDeviceEventEmitter(); Object.defineProperty(global, '__rctDeviceEventEmitter', { configurable: true, - value: RCTDeviceEventEmitter, + value: instance, }); -export default (RCTDeviceEventEmitter: IEventEmitter); +export default (instance: IEventEmitter);