Skip to content

Make AppState use main queue setup#50115

Closed
RSNara wants to merge 8 commits into
facebook:mainfrom
RSNara:export-D71348561
Closed

Make AppState use main queue setup#50115
RSNara wants to merge 8 commits into
facebook:mainfrom
RSNara:export-D71348561

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

@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: D71348561

@facebook-github-bot
Copy link
Copy Markdown
Contributor

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

@RSNara RSNara force-pushed the export-D71348561 branch from 24593eb to da904a9 Compare March 18, 2025 22:20
@facebook-github-bot
Copy link
Copy Markdown
Contributor

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

@RSNara RSNara force-pushed the export-D71348561 branch from da904a9 to 293a0eb Compare March 18, 2025 22:58
@facebook-github-bot
Copy link
Copy Markdown
Contributor

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

@RSNara RSNara force-pushed the export-D71348561 branch from 293a0eb to 309da7b Compare March 18, 2025 23:12
@facebook-github-bot
Copy link
Copy Markdown
Contributor

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

@RSNara RSNara force-pushed the export-D71348561 branch from 309da7b to 8dac8cf Compare March 18, 2025 23:46
@facebook-github-bot
Copy link
Copy Markdown
Contributor

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

@RSNara RSNara force-pushed the export-D71348561 branch from 8dac8cf to 44c2e57 Compare March 18, 2025 23:50
@facebook-github-bot
Copy link
Copy Markdown
Contributor

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

@RSNara RSNara force-pushed the export-D71348561 branch from 44c2e57 to 2662b58 Compare March 18, 2025 23:58
@facebook-github-bot
Copy link
Copy Markdown
Contributor

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

@RSNara RSNara force-pushed the export-D71348561 branch from 2662b58 to 37fd915 Compare March 19, 2025 00:14
RSNara added 3 commits March 19, 2025 09:22
…#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
…#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: D71348561

@RSNara RSNara force-pushed the export-D71348561 branch from 37fd915 to 85206fc Compare March 19, 2025 16:36
@facebook-github-bot
Copy link
Copy Markdown
Contributor

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

@RSNara RSNara force-pushed the export-D71348561 branch from 85206fc to bf6b138 Compare March 19, 2025 16:44
RSNara added 2 commits March 19, 2025 09:58
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
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
@facebook-github-bot
Copy link
Copy Markdown
Contributor

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

@RSNara RSNara force-pushed the export-D71348561 branch from bf6b138 to 82ed9cb Compare March 19, 2025 17:04
@facebook-github-bot
Copy link
Copy Markdown
Contributor

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

@RSNara RSNara force-pushed the export-D71348561 branch from 82ed9cb to e8055ce Compare March 19, 2025 21:19
RSNara added 3 commits March 19, 2025 14:28
Summary:
Pull Request resolved: facebook#50112

## 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: D71347448

Reviewed By: mdvacca
Summary:
Pull Request resolved: facebook#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]

Differential Revision: D71348559

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

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

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

@RSNara RSNara force-pushed the export-D71348561 branch from e8055ce to af06bd1 Compare March 19, 2025 21:57
@facebook-github-bot facebook-github-bot added the Merged This PR has been merged. label Mar 20, 2025
@facebook-github-bot
Copy link
Copy Markdown
Contributor

This pull request has been merged in 886319b.

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