Skip to content

Make DeviceInfo use main queue setup#50109

Closed
RSNara wants to merge 5 commits into
facebook:mainfrom
RSNara:export-D71347449
Closed

Make DeviceInfo use main queue setup#50109
RSNara wants to merge 5 commits into
facebook:mainfrom
RSNara:export-D71347449

Conversation

@RSNara
Copy link
Copy Markdown
Contributor

@RSNara RSNara commented Mar 18, 2025

Summary:

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: D71347449

@facebook-github-bot facebook-github-bot added CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. p: Facebook Partner: Facebook Partner labels Mar 18, 2025
@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D71347449

@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D71347449

@RSNara RSNara force-pushed the export-D71347449 branch from 3c38ca5 to 169b755 Compare March 18, 2025 22:22
@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D71347449

@RSNara RSNara force-pushed the export-D71347449 branch from 169b755 to 55b220d Compare March 18, 2025 22:59
@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D71347449

@RSNara RSNara force-pushed the export-D71347449 branch from 55b220d to 5215e2f Compare March 18, 2025 23:11
@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D71347449

@RSNara RSNara force-pushed the export-D71347449 branch from 5215e2f to be6cb6b Compare March 18, 2025 23:44
@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D71347449

@RSNara RSNara force-pushed the export-D71347449 branch from be6cb6b to f8dc4df Compare March 18, 2025 23:51
@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D71347449

@RSNara RSNara force-pushed the export-D71347449 branch from f8dc4df to f9b3c9b Compare March 18, 2025 23:57
@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D71347449

@RSNara RSNara force-pushed the export-D71347449 branch from f9b3c9b to 787f6fd Compare March 19, 2025 00:08
…#49957)

Summary:
Pull Request resolved: facebook#49957

## Changes
This diff introduces the api for "main queue modules" into turbo modules.

This will occur occurs before any rendering.

## Rationale

Rendering can now include main -> js sync calls. If we allow js -> main sync calls during rendering, react native can deadlock.

With this diff, we can move the js -> main sync calls to before any rendering happens.

## APIs
**Buck API:**
Plugin:
```
react_module_plugin_providers(
    name = "AccessibilityManager",
    native_class_func = "RCTAccessibilityManagerCls",
    unstable_requires_main_queue_setup = True,
)
```

**OSS API:**
[codegenConfig](https://reactnative.dev/docs/the-new-architecture/using-codegen) in package.json:
```
"codegenConfig": {
    "name": "<SpecName>",
    "type": "<types>",
    "jsSrcsDir": "<source_dir>",
    "android": {
      "javaPackageName": "<java.package.name>"
    },
    "ios": {
      "modules": {
        "AccessibilityManager": {
          "className": "RCTAccessibilityManager",
          "unstableRequiresMainQueueSetup": true
         }
      }
    }
  },
```

Changelog: [iOS][Added] Introduce unstableRequiresMainQueueSetup api to modules

Differential Revision: D70413478

Reviewed By: cipolleschi
RSNara added 2 commits March 19, 2025 09:35
…#50040)

Summary:
Pull Request resolved: facebook#50040

This diff implements main queue module setup.

Sometimes, people need to capture uikit things, and use them from javascript. In those cases, people can write main queue modules. These modules will be eagerly initialized on the main queue, during react native init.

## On Necessity
**Sync** dispatches to the main thread from the js thread can deadlock react native. And **async** dispatches to the main thread from the js thread sometimes might not be enough: it could lead to flickery rendering. So, we need to allow people to capture ui thread things, before any js executes.

## Caveat
This api is dangerous and discouraged. All react native surfaces will pay the cost of one surface introducing a main queue module. It could also slow down common/critical interactions in your app, if you're not careful.

We will introduce performance logging for this infrastructure. So that we can monitor and file tasks, when main queue module init starts taking "too long."

Changelog: [General][Breaking]: Introduce beforeload callback arg into ReactInstance::loadScript

Differential Revision: D71084243

Reviewed By: mdvacca
Summary:
We will use main queue setup of native modules to solve this problem instead.

Changelog: [Internal]

Differential Revision: D71341038

Reviewed By: mdvacca
@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D71347449

@RSNara RSNara force-pushed the export-D71347449 branch from 787f6fd to 89a764e Compare March 19, 2025 16:39
@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D71347449

@RSNara RSNara force-pushed the export-D71347449 branch from 89a764e to 0a63475 Compare March 19, 2025 16:48
Summary:
Pull Request resolved: facebook#50111

## 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: D71480047
@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D71347449

@RSNara RSNara force-pushed the export-D71347449 branch from 0a63475 to b21ea2e Compare March 19, 2025 17:04
RSNara added a commit to RSNara/react-native that referenced this pull request Mar 19, 2025
Summary:
Pull Request resolved: facebook#50109

## 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]

Differential Revision: D71347449

Reviewed By: mdvacca
Summary:
Pull Request resolved: facebook#50109

## 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: D71347449
@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D71347449

@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request has been merged in 6fa6387.

@facebook-github-bot facebook-github-bot added the Merged This PR has been merged. label Mar 20, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. fb-exported Merged This PR has been merged. p: Facebook Partner: Facebook Partner

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants