Skip to content

Commit b2ca41e

Browse files
EvertEtfacebook-github-bot
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 bb02049 commit b2ca41e

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
@@ -4892,6 +4892,7 @@ public class com/facebook/react/uimanager/UIImplementation {
48924892
public fun dispatchViewUpdates (I)V
48934893
public fun findSubviewIn (IFFLcom/facebook/react/bridge/Callback;)V
48944894
public fun getProfiledBatchPerfCounters ()Ljava/util/Map;
4895+
public fun getRootViewNum ()I
48954896
protected fun handleCreateView (Lcom/facebook/react/uimanager/ReactShadowNode;ILcom/facebook/react/uimanager/ReactStylesDiffMap;)V
48964897
protected fun handleUpdateView (Lcom/facebook/react/uimanager/ReactShadowNode;Ljava/lang/String;Lcom/facebook/react/uimanager/ReactStylesDiffMap;)V
48974898
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)