From b4775ebb395d4a8c8a3db614c0863d24a7da6dbb Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Wed, 19 Mar 2025 21:16:05 -0700 Subject: [PATCH] Make StatusBarManager use main queue setup (#50113) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/50113 ## Rationale Rendering can now include main -> js sync calls. If we allow js -> main sync calls during rendering, react native can deadlock. So, this diff moves the js -> main sync calls to "main queue module setup", which occurs before rendering. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D71348559 fbshipit-source-id: 918f145d817866a5d08087c1a4a0e151f783109e --- .../PlatformStubs/RCTStatusBarManager.mm | 11 +++----- .../React/CoreModules/RCTStatusBarManager.mm | 25 +++++++++++-------- packages/react-native/package.json | 3 +++ 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/packages/react-native/React/CoreModules/PlatformStubs/RCTStatusBarManager.mm b/packages/react-native/React/CoreModules/PlatformStubs/RCTStatusBarManager.mm index 39efae8d4fb..287128e83df 100644 --- a/packages/react-native/React/CoreModules/PlatformStubs/RCTStatusBarManager.mm +++ b/packages/react-native/React/CoreModules/PlatformStubs/RCTStatusBarManager.mm @@ -27,15 +27,10 @@ RCT_EXPORT_METHOD(setNetworkActivityIndicatorVisible : (BOOL)visible) {} - (facebook::react::ModuleConstants)getConstants { - __block facebook::react::ModuleConstants constants; - RCTUnsafeExecuteOnMainQueueSync(^{ - constants = facebook::react::typedConstants({ - .HEIGHT = 0, - .DEFAULT_BACKGROUND_COLOR = std::nullopt, - }); + return facebook::react::typedConstants({ + .HEIGHT = 0, + .DEFAULT_BACKGROUND_COLOR = std::nullopt, }); - - return constants; } - (facebook::react::ModuleConstants)constantsToExport diff --git a/packages/react-native/React/CoreModules/RCTStatusBarManager.mm b/packages/react-native/React/CoreModules/RCTStatusBarManager.mm index 5762334cecb..a7cd2cc9db5 100644 --- a/packages/react-native/React/CoreModules/RCTStatusBarManager.mm +++ b/packages/react-native/React/CoreModules/RCTStatusBarManager.mm @@ -9,6 +9,7 @@ #import "CoreModulesPlugins.h" #import +#import #import #import @@ -47,10 +48,12 @@ RCT_ENUM_CONVERTER( @end -@interface RCTStatusBarManager () +@interface RCTStatusBarManager () @end -@implementation RCTStatusBarManager +@implementation RCTStatusBarManager { + facebook::react::ModuleConstants _constants; +} static BOOL RCTViewControllerBasedStatusBarAppearance() { @@ -72,6 +75,14 @@ RCT_EXPORT_MODULE() return YES; } +- (void)initialize +{ + _constants = facebook::react::typedConstants({ + .HEIGHT = RCTUIStatusBarManager().statusBarFrame.size.height, + .DEFAULT_BACKGROUND_COLOR = std::nullopt, + }); +} + - (NSArray *)supportedEvents { return @[ kStatusBarFrameDidChange, kStatusBarFrameWillChange ]; @@ -177,15 +188,7 @@ RCT_EXPORT_METHOD(setNetworkActivityIndicatorVisible : (BOOL)visible) - (facebook::react::ModuleConstants)getConstants { - __block facebook::react::ModuleConstants constants; - RCTUnsafeExecuteOnMainQueueSync(^{ - constants = facebook::react::typedConstants({ - .HEIGHT = RCTUIStatusBarManager().statusBarFrame.size.height, - .DEFAULT_BACKGROUND_COLOR = std::nullopt, - }); - }); - - return constants; + return _constants; } - (facebook::react::ModuleConstants)constantsToExport diff --git a/packages/react-native/package.json b/packages/react-native/package.json index cd2387499eb..9cc59bc22f2 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -159,6 +159,9 @@ }, "PlatformConstants": { "unstableRequiresMainQueueSetup": true + }, + "StatusBarManager": { + "unstableRequiresMainQueueSetup": true } } },