Skip to content

Commit 85170c9

Browse files
EvertEtcortinico
authored andcommitted
Fix possible deadlock in dispatchViewUpdates (#43643)
Summary: In AppAndFlow/react-native-safe-area-context#448 it was noticed that from 0.72 (bc766ec #35889) it was possible to get a deadlock in dispatchViewUpdates. ([More details](AppAndFlow/react-native-safe-area-context#448 (comment))) This deadlock resulted in a laggy experience for all users using https://github.com/th3rdwave/react-native-safe-area-context/ on Android. To avoid this problem, the author of the original fix [proposed](AppAndFlow/react-native-safe-area-context#448 (comment)) this solution which was tested by Discord and many other users. It would be great to have this backported to 0.72 and 0.73 because of the large userbase using react-native-safe-area-context since it's recommended by expo and react-navigation. ## Changelog: <!-- Help reviewers and the release process by writing your own changelog entry. Pick one each for the category and type tags: [ANDROID] [FIXED] - Fixed possible deadlock in dispatchViewUpdates For more details, see: https://reactnative.dev/contributing/changelogs-in-pull-requests --> [ANDROID] [FIXED] - Fixed possible deadlock in dispatchViewUpdates Pull Request resolved: #43643 Test Plan: The original memory leak remains fixed, and can be verified in https://github.com/feiyin0719/RNMemoryLeakAndroid. To verify the deadlock is gone, every app using https://github.com/th3rdwave/react-native-safe-area-context will work smoothly and not log any excessive `Timed out waiting for layout` (https://github.com/17Amir17/SafeAreaContext) Reviewed By: arushikesarwani94 Differential Revision: D55339059 Pulled By: zeyap fbshipit-source-id: c067997364fbec734510ce99b9994e89d044384a
1 parent cbfa0a2 commit 85170c9

File tree

3 files changed

+8
-8
lines changed

3 files changed

+8
-8
lines changed

packages/react-native/ReactAndroid/api/ReactAndroid.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4897,6 +4897,7 @@ public class com/facebook/react/uimanager/UIImplementation {
48974897
public fun dispatchViewUpdates (I)V
48984898
public fun findSubviewIn (IFFLcom/facebook/react/bridge/Callback;)V
48994899
public fun getProfiledBatchPerfCounters ()Ljava/util/Map;
4900+
public fun getRootViewNum ()I
49004901
protected fun handleCreateView (Lcom/facebook/react/uimanager/ReactShadowNode;ILcom/facebook/react/uimanager/ReactStylesDiffMap;)V
49014902
protected fun handleUpdateView (Lcom/facebook/react/uimanager/ReactShadowNode;Ljava/lang/String;Lcom/facebook/react/uimanager/ReactStylesDiffMap;)V
49024903
public fun manageChildren (ILcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableArray;)V

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ public void removeRootView(int rootViewTag) {
177177
*
178178
* @return The num of root view
179179
*/
180-
private int getRootViewNum() {
180+
public int getRootViewNum() {
181181
return mOperationsQueue.getNativeViewHierarchyManager().getRootViewNum();
182182
}
183183

@@ -589,12 +589,6 @@ public void measureLayoutRelativeToParent(
589589

590590
/** Invoked at the end of the transaction to commit any updates to the node hierarchy. */
591591
public void dispatchViewUpdates(int batchId) {
592-
if (getRootViewNum() <= 0) {
593-
// If there are no RootViews registered, there will be no View updates to dispatch.
594-
// This is a hack to prevent this from being called when Fabric is used everywhere.
595-
// This should no longer be necessary in Bridgeless Mode.
596-
return;
597-
}
598592
SystraceMessage.beginSection(
599593
Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "UIImplementation.dispatchViewUpdates")
600594
.arg("batchId", batchId)

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -707,7 +707,12 @@ public void onBatchComplete() {
707707
listener.willDispatchViewUpdates(this);
708708
}
709709
try {
710-
mUIImplementation.dispatchViewUpdates(batchId);
710+
// If there are no RootViews registered, there will be no View updates to dispatch.
711+
// This is a hack to prevent this from being called when Fabric is used everywhere.
712+
// This should no longer be necessary in Bridgeless Mode.
713+
if (mUIImplementation.getRootViewNum() > 0) {
714+
mUIImplementation.dispatchViewUpdates(batchId);
715+
}
711716
} finally {
712717
Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE);
713718
}

0 commit comments

Comments
 (0)