Commit Graph

472 Commits

Author SHA1 Message Date
Samuel Susla 318e9f283e Execute multiple tasks within single dispatch
Summary:
Changelog: [internal]

This brings native scheduler close to React's scheduler. React's scheduler executes all tasks in the queue within a single dispatch (they use setTimeout(0) for dispatch) and makes sure to not schedule two dispatches.

Relevant JS code:
https://github.com/facebook/react/blob/master/packages/scheduler/src/forks/SchedulerNoDOM.js#L359

Reviewed By: JoshuaGross

Differential Revision: D27793200

fbshipit-source-id: 4af13d95cfe4d33d0945f25929ccbea5f9ce5710
2021-04-16 08:16:41 -07:00
Héctor Ramos ae07c53d0b Resolve "fatal: not a git repository" error outside of git repositories
Summary:
CocoaPods will display a "fatal: not a git repository" when these podspecs are consumed within Facebook's internal Mercurial repository due to the reliance on `git` to obtain the current commit hash.

In these cases, the podspec is being consumed locally and the commit hash is unnecessary.

The error is removed by avoiding the use of `git` if the current working directory is not a git repository (or any of the parent directories).

Changelog:
[Internal] [iOS] - Remove CocoaPods error within Facebook's repository

Reviewed By: fkgozali

Differential Revision: D27750974

fbshipit-source-id: 99159611c580baf5526f116948c5ff60e1c02e5c
2021-04-15 13:30:31 -07:00
Joshua Gross bd1d4e9f4f StubViewTree: reenable asserts in Delete mutation path
Summary:
I had intended to make this change as part of the stack I landed earlier, but I had some poorly resolved merge conflicts that left this path disabled.

I verified that T76057501 no longer repros and ran unit tests.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D27788467

fbshipit-source-id: 42148b887c6b3c0e815f1805e6bfb3ee58503e48
2021-04-15 11:22:19 -07:00
CodemodService FBSourceClangFormatLinterBot e6dc3717e9 Daily arc lint --take CLANGFORMAT
Reviewed By: zertosh

Differential Revision: D27789747

fbshipit-source-id: ef4882e92d7755669083573c43ae6c5088bf01ab
2021-04-15 04:27:14 -07:00
Samuel Susla 8f3ffcf0bb Add unit tests for RuntimeScheduler::cancelTask
Summary:
Changelog: [internal]

Add unit tests for RuntimeScheduler::cancelTask

Reviewed By: JoshuaGross

Differential Revision: D27764482

fbshipit-source-id: 3833e49dd49865be4126bc5c3eb95a40d04bba99
2021-04-15 02:44:13 -07:00
Samuel Susla 4c1fd979a0 Add tests for RuntimeScheduler::scheduletTask and RuntimeScheduler::getShouldYield
Summary:
Changelog: [internal]

Add tests for `RuntimeScheduler::scheduleTask` and `RuntimeScheduler::getShouldYield`

Reviewed By: JoshuaGross

Differential Revision: D27764464

fbshipit-source-id: 8f95dfd9ec1ddf9a0ee17d489961b19e4ceaa9de
2021-04-15 02:44:13 -07:00
Samuel Susla e3a4de8b55 Add unit tests for RuntimeScheduler::now
Summary:
changelog: [internal]

Add unit tests for `RuntimeScheduler::now`

Reviewed By: JoshuaGross

Differential Revision: D27763852

fbshipit-source-id: 1edec8e8338e9d9798b95c55d07114be05f555b8
2021-04-15 02:44:13 -07:00
Samuel Susla eb49f95048 Bootstrap unit tests for RuntimeScheduler module
Summary:
changelog: [internal]

Create module for tests.

Reviewed By: JoshuaGross

Differential Revision: D27764408

fbshipit-source-id: 22681c99d64666bb3a04e961ceeba470062abc51
2021-04-15 02:44:12 -07:00
Joshua Gross dc80b2dcb5 Add mounting layer test that stress-tests differ on (un)flattening
Summary:
Add mounting layer test that stress-tests differ on (un)flattening.

This fails before D27759380 and D27730952, and passes after.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D27767219

fbshipit-source-id: a7e186e510f95792da6f98f80fcae5ff8ac74775
2021-04-14 19:50:10 -07:00
Joshua Gross d1b1e8b80d Differ: ensure all ShadowViews generated by differ have correct LayoutMetrics
Summary:
While I think this was a very marginal bug with no known issues in the wild, incorrect layout values were sometimes being propagated to certain nodes. This would only occur during complex nested (un)flattening operations and may only impact node consistency, specifically with setting the "previous" ShadowView of mutation instructions, specifically REMOVE and DELETE. Even in rigorous testing I had trouble hitting this case and it didn't seem to impact the "next" values in CREATE, INSERT, or UPDATE.

The issue: previously `sliceChildShadowNodeViewPairsV2` assumed that the node it's operating on is a child of a non-flattened view, and the baseline origin is `{0,0}`. You can see when `sliceChildShadowNodeViewPairsRecursivelyV2` is called, a `layoutOffset` is passed in. If we ever got a list of a node that was in a flattened parent by calling `sliceChildShadowNodeViewPairsV2`, we would incorrectly assume that baseline layoutOffset for the node is `0,0`.

Now, we store the layoutOffset in the ShadowViewNodePair and can retrieve it when getting child pairs of a node.

Changelog: [internal]

Reviewed By: sammy-SC

Differential Revision: D27759380

fbshipit-source-id: a89756190a1cb377bcc55ff31799c2afbaecdaa9
2021-04-14 19:50:10 -07:00
Joshua Gross c22b874fd6 Differ: ensure ownership of all ShadowView/ShadowNode pairs, ensure consistency of nodes
Summary:
Previously, `ShadowViewNodePair::List` owned each `ShadowViewNodePair` but whenever we put `ShadowViewNodePair` into a TinyMap, those were unowned pointer references. This worked... 99% of the time. But in some marginal cases, it would cause dangling pointers, leading to difficult-to-track-down issues. So, I'm moving both of these to be unowned pointers and keeping a `std::deque` that owns all `ShadowViewNodePair`s and is itself owned by the main differ function. See comments for more implementation details. I'm moderately concerned about memory usage regressions, but practically speaking this will contain many items when a tree is created for the first time, and then very few items after that (space complexity should be similar to `O(n)` where `n` is the number of changed nodes after the last diff).

See comments as to why I believe `std::deque` is the right choice. Long-term there might be data-structures that are even more optimal, but std::deque has the right tradeoffs compared to other built-in STL structures like std::list and std::vector, and is probably better than std::forward_list too. Long-term we may want a custom data-structure that fits our needs exactly, but std::deque comes close and is possibly optimal.

Changelog: [Internal]

Reviewed By: sammy-SC

Differential Revision: D27730952

fbshipit-source-id: 2194b535439bd309803a221188da5db75242005a
2021-04-14 19:50:10 -07:00
Joshua Gross b9828a8afa Differ: fix edge-case where we "REMOVE" an older version of a ShadowNode
Summary:
I am fixing an extremely marginal case that probably impacts nothing in production, but in theory, could - see next diff in stack for the assert that is being hit.

TL;DR in marginal, complex cases with a lot of un/flattening, we can generate the following sequence of mutations:

```
UPDATE node V1 -> V2
REMOVE node V1
```

That is incorrect, and what we actually want is:

```
UPDATE node V1 -> V2
REMOVE node V2
```

While this, again, impacts /nothing/ in prod that we know of, it would be good to get this correct so that we can enable stricter asserts (see next diff).

This will also help with debugging LayoutAnimations.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D27697788

fbshipit-source-id: 47f34fe3e8107167b3df4db841d2cc14c58cb31d
2021-04-14 19:50:09 -07:00
Joshua Gross 39b8233c93 Copy Differ implementation to new file, feature-flag-gate new differ
Summary:
Changes in following diffs will be gated by this feature flag.

The differ in the new file is copied from the current stable implementation and will not be modified until it's deleted.

Changelog: [Internal]

Reviewed By: sammy-SC, mdvacca

Differential Revision: D27775698

fbshipit-source-id: 03d9518ffd2b1f25712386c56a38bd2b4d839fc2
2021-04-14 19:50:09 -07:00
Joshua Gross 5eba5c11b0 Differ: improvements to logging
Summary:
First, I make the breadcrumbs mechanism (landed just this week) more readable - I forgot to add separators between the breadcrumbs.

Second, there is a path that I am 99% sure we never hit. I've had comments to that effect for a ~year, but now I'm adding a falsey assert. If we don't hit it in prod after a few months I'll be more comfortable just deleting the branch entirely (while probably keeping the assert).

Changelog: [Internal]

Reviewed By: sammy-SC

Differential Revision: D27697786

fbshipit-source-id: 6d74d1703b2212d069fbed510f2655ec17294458
2021-04-14 19:50:09 -07:00
Joshua Gross c83562eb1c StubViewTree: move assert to get better debug logging
Summary:
Move this assert so the debug logging executes first; in the case where this assert fires, we'll get a little more information (for Android, where attaching a Cxx debugger is a bit harder vs iOS).

Changelog: [Internal]

Reviewed By: sammy-SC

Differential Revision: D27585132

fbshipit-source-id: e3f4cc3d78587744b9e73db685eda1fd6c36ca9d
2021-04-14 19:50:09 -07:00
Joshua Gross 2d7560d7b9 StubViewTree: enable stricter REMOVE asserts
Summary:
With all known remaining issues (outside of LayoutAnimations, potentially) resolved, enable this assert.

Note for future readers: this is the first time this particular assert has EVER been enabled widely, so if we hit this assert in dev, it's great signal for debugging BUT does not necessarily indicate any wide-spread problems in prod, or with any subsystems. This will simply help us become "more correct" over time.

It is possible, but not extremely likely, that cleaning up things that cause this assert will improve stability/crashes.

Changelog: [Internal]

Reviewed By: sammy-SC

Differential Revision: D27697787

fbshipit-source-id: 28fa34eba70548f5001bbd47f41dbe3c6ff3b4c1
2021-04-14 19:50:09 -07:00
Peter Argany 9729d4dfeb Revert a small change to UIManagerBinding
Summary:
Changelog: [Internal]

This reverts a small change from D26885562 (https://github.com/facebook/react-native/commit/ea1f9531f00b5cd834e03f58cdfa117a93634624). I'm not sure if this change was made intentionally (feel free to reject this diff if it was luluwu).

Before D26885562 (https://github.com/facebook/react-native/commit/ea1f9531f00b5cd834e03f58cdfa117a93634624), if `RN$Bridgeless` was truthy and `RN$stopSurface` was falsey, then the function returned. After D26885562 (https://github.com/facebook/react-native/commit/ea1f9531f00b5cd834e03f58cdfa117a93634624), it ran the else clause (which shouldn't be run in bridgeless mode IIUC).

Reviewed By: mdvacca

Differential Revision: D27751583

fbshipit-source-id: daaf5c72fec11f4b2e21d1d2926a5026b984461f
2021-04-14 10:37:50 -07:00
Joshua Gross 88c3090066 Correct LayoutMetrics comparison and make debuggable
Summary:
Allow conversion of LayoutMetrics to DebuggableString.

We also skipped a field in comparison. It probably isn't impactful in terms of production issues, but still wasn't correct.

Changelog: [Internal]

Reviewed By: sammy-SC

Differential Revision: D27709451

fbshipit-source-id: 987fc2de0a4562a295d6cbeffdd922cbf056b811
2021-04-14 09:41:41 -07:00
Samuel Susla 06753d431a Add expiration date to Task and use it to determine priority
Summary:
Changelog: [internal]

To prevent starvation, this diff implements expiration time as a way to order tasks in priority queue. This stops higher priority tasks from preventing lower priority tasks from running. The same mechanism is implemented in [JavaScript's scheduler](https://github.com/facebook/react/blob/master/packages/scheduler/src/forks/SchedulerNoDOM.js).

Reviewed By: mdvacca

Differential Revision: D27707887

fbshipit-source-id: 3dc734c856a166ef5c17c5045ebd429565ba79f0
2021-04-14 02:53:24 -07:00
Samuel Susla 240588b6d4 Implement RuntimeScheduler::now
Summary:
Changelog: [internal]

Implement RuntimeScheduler::now and exposite it to JavaScript. JavaScripts expects miliseconds and is using `performance.now()` call to get this value.

More about `performance.now()`: https://developer.mozilla.org/en-US/docs/Web/API/Performance/now
JavaScript implementation in Scheduler: https://github.com/facebook/react/blob/master/packages/scheduler/src/forks/SchedulerNoDOM.js#L71-L82

Reviewed By: JoshuaGross

Differential Revision: D27675512

fbshipit-source-id: bce5ac700e71b1722cd280dfbdd15e141783a3a5
2021-04-14 02:53:24 -07:00
Samuel Susla 52f1d54509 Add implementation for requestPaint
Summary:
Changelog: [internal]

requestPaint is unimplemented on JavaScript scheduler:

https://github.com/facebook/react/blob/master/packages/scheduler/src/forks/SchedulerNoDOM.js#L445

Reviewed By: mdvacca

Differential Revision: D27651947

fbshipit-source-id: 1e3cece8cbcd330f2408887ceb283ca61374f5bd
2021-04-14 02:53:23 -07:00
Samuel Susla cc3e87c45b Implement RuntimeScheduler::getShouldYield
Summary:
Changelog: [internal]

Implement RuntimeScheduler::getShouldYield and expose it through JSI.
For now we are only returning `false`. The value is backed by atomic_bool and in the future we will be able to indicate that React should yield to native.

JavaScript implementation:
https://github.com/facebook/react/blob/master/packages/scheduler/src/forks/SchedulerNoDOM.js#L439-L441

Reviewed By: JoshuaGross

Differential Revision: D27648579

fbshipit-source-id: b9313e2efbd9daae8975357df9de803f24a35e89
2021-04-14 02:53:23 -07:00
David Vacca aee07e1203 Integrate react_native_asserts into mapbuffer
Summary:
Integrate react_native_asserts into mapbuffer

changelog: [internal] internal

Reviewed By: JoshuaGross

Differential Revision: D27753092

fbshipit-source-id: dbeb7f140f3096c8153e2f6bced4e4d9d88b48b8
2021-04-13 21:32:17 -07:00
Samuel Susla 08ef1df1ba Implement RuntimeScheduler::cancelTask
Summary:
Changelog: [internal]

Implement RuntimeScheduler::cancelTask and expose it through JSI.

JavaScript implementation:
https://github.com/facebook/react/blob/master/packages/scheduler/src/forks/SchedulerNoDOM.js#L384-L397

Reviewed By: mdvacca

Differential Revision: D27648071

fbshipit-source-id: 91ae92b336017596fb658831824e971c7e047cd2
2021-04-13 01:55:04 -07:00
Samuel Susla 3c14c196ca Add return value to RuntimeScheduler unstable_scheduleCallback
Summary:
Changelog: [internal]

unstable_scheduleCallback needs to return reference to the created task so it can be cancelled later.

Reviewed By: mdvacca

Differential Revision: D27622779

fbshipit-source-id: 54160015c7f98e123d08c2e13efac4f498d3ba5e
2021-04-13 01:55:04 -07:00
Samuel Susla 2779129434 Add minimal implementation of RuntimeScheduler::scheduleTask
Summary:
Changelog: [internal]

Add minimal implementation of schedule task. More features and proper scheduling will be added later.

Reviewed By: mdvacca

Differential Revision: D27622138

fbshipit-source-id: b2e4623d38e7217290a6a3c59ccc10a1c13e3a4f
2021-04-13 01:55:04 -07:00
Samuel Susla 71b5178230 Make glog exported depencency of debug module
Summary:
Changelog: [internal]

`glog` needs to be exported dependency because it is used in public headers.

Reviewed By: mdvacca

Differential Revision: D27617632

fbshipit-source-id: 91aa27b641286002a80a8cd5ef2e6fe6c266b452
2021-04-13 01:55:03 -07:00
Samuel Susla 8d5c22edfd Add runtime scheduler priorities
Summary:
Changelog: [internal]

Add runtime scheduler priorities

Reviewed By: JoshuaGross

Differential Revision: D27618305

fbshipit-source-id: 95e4e02f3473acb41bca0c22df7b271a8d710f34
2021-04-13 01:55:03 -07:00
Andrei Shikov a17e3cf893 Avoid mounting tree on mode change if it wasn't commited
Summary:
Changelog: [Internal]

Calls to `surfaceHandler.start()` and `setDisplayMode(DisplayMode::Visible)` in quick succession on different threads can cause a race condition between mount and commit operations.

The mountingCoordinator will try to mount an empty revision without any commits causing it to fail with:
```
TransactionTelemetry.cpp:108: function getCommitStartTime: assertion failed (commitStartTime_ != kTelemetryUndefinedTimePoint)
```
which is called from [Binding.cpp](https://www.internalfb.com/intern/diffusion/FBS/browse/master/xplat/js/react-native-github/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp?lines=791-791&blame=1).

This change avoids this initial commit by verifying we had at least 1 revision commited before mounting it.

Reviewed By: sammy-SC

Differential Revision: D27430174

fbshipit-source-id: d208d55f02cd218a316d6fea62d0106c2bcb4be8
2021-04-12 13:17:52 -07:00
David Vacca b28ddede7b Transfer 'DisplayMode' value from Native -> JS
Summary:
This diff adds a new variable called "DisplayMode" into SurfaceHandler.cpp and FacebookAppRouteHandler.js. The purpose of DisplayMode is for the native pre-render system to notify React that the a surface is either being "pre-rendered" or "rendered"

When the surface is being "pre-rendered" (displayMode == "SUSPENDED"), react will create and commit React Trees, but it will not execute use-effect callbacks

When the surface is being "rendered" (displayMode == "VISIBLE"), react will create and commit React Trees and it will not execute all use-effect callbacks that weren't executed during "pre-rendering"

By default surfaces are going to be rendered with displayMode == "VISIBLE".

This diff should not create any change of behavior for now, this is the infra required to integrate the new offScreen API the react team is working on for pre-rendering system

changelog: [internal] internal

Reviewed By: yungsters

Differential Revision: D27614664

fbshipit-source-id: f1f42fdf174c2ffa74174feb1873f1d5d46e7a95
2021-04-12 00:05:43 -07:00
David Vacca bdb9a1e094 Add displayMode parameter into startSurface and setSurfaceProps methods
Summary:
This diff extends startSurface and setSurfaceProps methods with the new parameter called displayMode

changelog: [internal] internal

Reviewed By: yungsters

Differential Revision: D27669847

fbshipit-source-id: c2ddb690ca897e46e00f07b491b91bb2bc8e847d
2021-04-12 00:05:43 -07:00
David Vacca 2793bba278 Move DisplayMode out of SurfaceHandler
Summary:
This diff moves DisplayMode out of SurfaceHandler, this is necessary in order to use it from react/uimanager package

changelog: [internal] internal

Reviewed By: ShikaSD

Differential Revision: D27669846

fbshipit-source-id: 274869d8f2907b1b159f51240440acece09a746f
2021-04-12 00:05:43 -07:00
David Vacca e7b52d7b0b Update initial props when DisplayMode changes in Fabric
Summary:
This diff updates initial props when DisplayMode changes in Fabric. This method will be called during pre-rendering.

changelog: [internal] internal

Reviewed By: JoshuaGross

Differential Revision: D27607586

fbshipit-source-id: 7625943d57a786d6dfe30dd893e27704f51826d2
2021-04-12 00:05:43 -07:00
David Vacca 680dd36fd1 Introduce new Fabric API setSurfaceProps
Summary:
This diff introduces a new fabric API called setSurfaceProps that will be used to call the new JS api "setSurfaceProps"

changelog: [internal] internal

Reviewed By: sammy-SC

Differential Revision: D27607588

fbshipit-source-id: 36a19f728af244d7e72687d9305b1c568e2b8ec6
2021-04-12 00:05:43 -07:00
Joshua Gross c91e32b050 Differ: introduce breadcrumb logging
Summary:
Introduce a new debugging mechanism for the debugger. Outside of debug mode (you must defined `DEBUG_LOGS_BREADCRUMBS` manually to enable this feature) it will have no cost or binary size.

When the debug mode is enabled, it allows you to trace the call stack to trace what the differ is doing, making logs more useful.

Motivation: tracking down a tricky bug caught by D27585136 which originates in the differ.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D27667885

fbshipit-source-id: ef75a9a1c8890f9bbe3e5b2e8a8ffcde92fb22c2
2021-04-09 10:30:15 -07:00
Ramanpreet Nara c4c34a1237 Delete RCTTurboModuleManagerDelegate getTurboModule:initParams
Summary:
D27316129 made it mandatory for all RCTTurboModules to have a getTurboModule: method. So, there's no need to keep the getTurboModule:initParams method in RCTTurboModuleManagerDelegate. So, to simplify the TurboModule infra, this diff gets rid of that TurboModuleManager delegate method.

Changelog: [iOS][Removed] - Delete RCTTurboModuleManagerDelegate getTurboModule:initParams

Reviewed By: fkgozali

Differential Revision: D27316873

fbshipit-source-id: c0b8449c6088bf08f17ba9a8d1c2cb644e5a242d
2021-04-08 21:15:53 -07:00
Ramanpreet Nara e0b8f5080f Make RCTTurboModule getTurboModule: required
Summary:
## Rationale
There are two ways to associate NativeModule ObjC objects with ObjCTurboModule jsi::HostObjects:
1. Via the NativeModule ObjC class's `getTurboModule:` method.
2. Via the TurboModule manager delegate's getTurboModule:initParams: method.

There's no good reason to support both options. So, this diff stack removes 2, and make 1 mandatory for all RCTTurboModules. Not only will this simplify the infra, but it should also help eliminate a class of runtime errors in the TurboModule standalone app migration: you forget to implement the getTurboModule: method.

Changelog: [iOS][Changed] - Make RCTTurboModule getTurboModule: required

Reviewed By: PeteTheHeat

Differential Revision: D27316129

fbshipit-source-id: baccd155b8c191d0f961b316db552bdfdbeb0a97
2021-04-08 21:15:53 -07:00
Ramanpreet Nara 3f38186b78 Codemod: Give legacy cxx and ObjC-only NativeModules a getTurboModule: method
Summary:
We're making the getTurboModule: method required for all classes that conform to RCTTurboModule.

Many of our ObjC-only and Cxx NativeModules don't implement this method. This diff implements a getTurboModule: method on all those modules that returns nullptr.

**Question:** Why is it fine to make ObjC-only NativeModules return nullptr from their getTurboModule: method?
- Because they're only accessed from ObjC, and should appear as null on the JavaScript side. Longer term, these NativeModules will also go away.

**Question:** Why is it fine to make Cxx NativeModules return nullptr from getTurboModule: method?
- Because after D27316872, the TurboModuleManager checks if the module is a CxxModule first. If it is, we do an early return, and never call the module's getTurboModule: method.

Changelog: [Internal]

Reviewed By: JoshuaGross

Differential Revision: D27316871

fbshipit-source-id: bc693f2927ab3b0de24e6e9e7699390ec0f7d729
2021-04-08 21:15:52 -07:00
Ramanpreet Nara 6a5e98a84c Stop calling getTurboModule:initParams in RCTTurboModuleManager
Summary:
We're going to make RCTTurboModule getTurboModule: required in D27316129. So, RCTTurboModuleManagerDelegate getTurboModule:initParams is no longer necessary.

## Changes
1. Makes TurboModuleManager stop calling RCTTurboModuleManagerDelegate getTurboModule:initParams
2. Makes getTurboModule: have the lowest priority. So, Cxx NativeModules with a getTurboModule: method won't have their getTurboModule: method executed.

Changelog: [Internal]

Reviewed By: PeteTheHeat

Differential Revision: D27316872

fbshipit-source-id: a024e55b8e3692d7117420007dd3947ecfd5019c
2021-04-08 21:15:52 -07:00
Samuel Susla 0b8731d40d Add config flag for RuntimeScheduler
Summary:
Changelog: [internal]

Add config flags for RuntimeScheduler. Even with the flags, React will not be using it. Further changes on React side will be required.

Reviewed By: mdvacca

Differential Revision: D27616916

fbshipit-source-id: 296a040c2b6dd936dd9582e937e6db75e28f31a4
2021-04-08 10:29:07 -07:00
Joshua Gross 49b6c60bc0 EZ: fix up LayoutAnimation logs
Summary:
Make these logs more readable/useful and add debug print of ShadowView hashes in one place.

Changelog: [Internal]

Reviewed By: sammy-SC

Differential Revision: D27585135

fbshipit-source-id: 5f526856d893c32015d8b480522580732fda0cc6
2021-04-08 10:06:48 -07:00
Joshua Gross 3824c565bf ShadowView hash: add surfaceId and LayoutMetrics
Summary:
Turns out that ShadowViews that have different LayoutMetrics will have the same hash. Fix that.

This helps for debugging LayoutAnimations.

Changelog: [Internal]

Reviewed By: sammy-SC

Differential Revision: D27585133

fbshipit-source-id: f0ac50619115150339089276e34fee5ddd0270bc
2021-04-08 10:06:48 -07:00
Micha Reiser dde48fd554 Use mock clock
Summary:
Change the `TransactionTelemetryTest` to use a mock clock or change the tests to only test if at least x amount of time has passed.

Using a mock clock is the only way to make the test deterministic and be able to assert on the sub-results of the captured phases.

Changelog: [Internal] Change to the `TelemetryTest`. Neither changes the runtime behavior nor the API.

Reviewed By: sammy-SC

Differential Revision: D27618448

fbshipit-source-id: 0cbf51b050aabb75341112ea4a43bea0115082f9
2021-04-08 09:27:18 -07:00
Micha Reiser 46acfcb8fc Allow swapping the clock implementation for TransactionTelemetry
Summary:
The `TransactionalTelemetryTest`s are flaky because they use a real clock and assert on how much time has passed (with a threshold, but that's no good either).

Using the real clock in the test is the cause for the test to be flaky because it depends on the assumption that it's the sole process running, never risking to be put in the process-queue of the OS. However, that's not the case and is why the test sporadically fails if the OS decided to schedule other threads/process in the middle of the test.

This diff allows parametrising the `TransactionTelemetry` class with the clock implementation so that tests can use a Mock Clock if desired (separate diff).

Changelog: [Internal] Fabric-specific internal change.

Reviewed By: sammy-SC

Differential Revision: D27618516

fbshipit-source-id: 5a08e115b388398ca2b05b9d5ae0fd281dfe3b04
2021-04-08 09:27:18 -07:00
Samuel Susla eb13baf2a6 Introducing RuntimeScheduler module
Summary:
Changelog: [internal[

Introducing RuntimeScheduler. A coordinator of work between native and React.

Reviewed By: mdvacca

Differential Revision: D27616818

fbshipit-source-id: e90d3d9ca8907be99e61f69e62e83cece8155050
2021-04-08 04:07:34 -07:00
Ramanpreet Nara f525ec0fe5 Remove assertions in ~Scheduler and ~SurfaceHandler
Summary:
~Scheduler and ~SurfaceHandler both contain react_native_asserts that trip whenever we reload React Native with Fabric enabled. These asserts trip because of a memory leak in Fabric. These asserts do not run in production. We should fix the memory leak before re-enabling these assertions.

Changelog: [Internal]

Reviewed By: JoshuaGross

Differential Revision: D27481220

fbshipit-source-id: 15c3d46f7efab9ed67a70714efe44b74b0acd385
2021-04-07 19:37:59 -07:00
Micha Reiser 28ed660c2d Use EXPECT_NEAR to improve test failure messages
Summary:
The current test failures don't include the values passed to `EXPECT` which makes it difficult to understand if the test ended earlier or later then expected.

```
Failure: Value of: (commitDuration >= 1000 - threshold) && (commitDuration <= 1000 + threshold)
  Actual: false
Expected: true
```

This diff uses the gtest `EXPECT_NEAR` to get exception messages including the delta:

```
Failure: The difference between telemetryDurationToMilliseconds(telemetry.getTextMeasureTime()) and 600 is 153, which exceeds threshold, where
telemetryDurationToMilliseconds(telemetry.getTextMeasureTime()) evaluates to 753,
600 evaluates to 600, and
threshold evaluates to 70.
```

This doesn't change the test's flakiness because of how sleep is implemented.

Changelog: [Internal] Test only change

Reviewed By: sammy-SC

Differential Revision: D27595206

fbshipit-source-id: f31bdd92ecc7271c9491dda18639ea08820f5730
2021-04-07 01:31:47 -07:00
David Vacca 2182efaf7c Change values of DisplayMode enum
Summary:
Changing back the values of DisplayMode, visible is the default value, it should be 0

changelog: [internal] internal

Reviewed By: ShikaSD

Differential Revision: D27596595

fbshipit-source-id: e5a17e22dc04d380f584bbb816106ab7d3388875
2021-04-06 10:58:58 -07:00
David Vacca 75c4920a0e Use explicit values in SurfaceHandler enums
Summary:
quick refactor to use explicit values in SurfaceHandler enums

changelog: [internal] internal

Reviewed By: JoshuaGross

Differential Revision: D27571543

fbshipit-source-id: 070c527b6a482979efd7289313a3491d16b401f8
2021-04-06 03:47:06 -07:00
Samuel Susla e9765a7f21 Remove last uses of UnsharedShadowNode
Summary:
Changelog: [internal]

`ShadowNode::Unshared` is preferred over `UnsharedShadowNode`. This diff removes last uses of the alias.

Differential Revision: D27407197

fbshipit-source-id: aa1440f80dcab523d61c186f2d3ce052f314e52c
2021-04-05 11:48:56 -07:00