From 7929551623d4e3fbd849500d795755d0c41fdbbd Mon Sep 17 00:00:00 2001 From: Lulu Wu Date: Mon, 26 Jul 2021 02:02:19 -0700 Subject: [PATCH] Make mHybridData thread safe for EventEmitterWrapper Summary: In T94154173, when calling ```EventEmitterWrapper->invoke()```, hybrid function ```invokeEvent``` is null, even if we checked that ```mHybridData``` is valid before calling ```invokeEvent```. **Theory:** ```invoke()``` is called from ```mqt_js``` thread, ```desotry()``` is called from ```main``` thread, which cause multi-thread access of```mHybridData```. So if ```desotry()``` is called after ```isValid()``` check and before calling ```invokeEvent()```, ```invokeEvent``` could be destroyed and is null. I can reproduce with above theory: {F633411001} **Fix:** Make functions synchronized so ```mHybridData``` can be thread safe. Changelog: [Android][Fixed] - Make mHybridData thread safe Reviewed By: RSNara Differential Revision: D29792453 fbshipit-source-id: 8b4c754d53ece933be7b2cf99c6cd026b39e24ad --- .../facebook/react/fabric/events/EventEmitterWrapper.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/events/EventEmitterWrapper.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/events/EventEmitterWrapper.java index 69d0e1c8a8aecd..e1652a4f2bdd45 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/events/EventEmitterWrapper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/events/EventEmitterWrapper.java @@ -47,7 +47,7 @@ private native void invokeUniqueEvent( * @param eventName {@link String} name of the event to execute. * @param params {@link WritableMap} payload of the event */ - public void invoke(@NonNull String eventName, @Nullable WritableMap params) { + public synchronized void invoke(@NonNull String eventName, @Nullable WritableMap params) { if (!isValid()) { return; } @@ -62,7 +62,7 @@ public void invoke(@NonNull String eventName, @Nullable WritableMap params) { * @param eventName {@link String} name of the event to execute. * @param params {@link WritableMap} payload of the event */ - public void invokeUnique( + public synchronized void invokeUnique( @NonNull String eventName, @Nullable WritableMap params, int customCoalesceKey) { if (!isValid()) { return; @@ -71,7 +71,7 @@ public void invokeUnique( invokeUniqueEvent(eventName, payload, customCoalesceKey); } - public void destroy() { + public synchronized void destroy() { if (mHybridData != null) { mHybridData.resetNative(); }