mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Summary: Only use State Reconciliation during certain commits from ReactJS, not during State commits or others The idea is that this will have better perf, since many types of commits don't need State Reconciliation at all. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D19794999 fbshipit-source-id: 336325f225d993a6aae9f55cb95a7a2b38a6d853
95 lines
2.7 KiB
C++
95 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <better/mutex.h>
|
|
#include <memory>
|
|
|
|
#include <react/components/root/RootComponentDescriptor.h>
|
|
#include <react/components/root/RootShadowNode.h>
|
|
#include <react/core/LayoutConstraints.h>
|
|
#include <react/core/ReactPrimitives.h>
|
|
#include <react/core/ShadowNode.h>
|
|
#include <react/mounting/MountingCoordinator.h>
|
|
#include <react/mounting/ShadowTreeDelegate.h>
|
|
#include <react/mounting/ShadowTreeRevision.h>
|
|
|
|
namespace facebook {
|
|
namespace react {
|
|
|
|
using ShadowTreeCommitTransaction = std::function<RootShadowNode::Unshared(
|
|
RootShadowNode::Shared const &oldRootShadowNode)>;
|
|
|
|
/*
|
|
* Represents the shadow tree and its lifecycle.
|
|
*/
|
|
class ShadowTree final {
|
|
public:
|
|
/*
|
|
* Creates a new shadow tree instance.
|
|
*/
|
|
ShadowTree(
|
|
SurfaceId surfaceId,
|
|
LayoutConstraints const &layoutConstraints,
|
|
LayoutContext const &layoutContext,
|
|
RootComponentDescriptor const &rootComponentDescriptor,
|
|
ShadowTreeDelegate const &delegate);
|
|
|
|
~ShadowTree();
|
|
|
|
/*
|
|
* Returns the `SurfaceId` associated with the shadow tree.
|
|
*/
|
|
SurfaceId getSurfaceId() const;
|
|
|
|
/*
|
|
* Performs commit calling `transaction` function with a `oldRootShadowNode`
|
|
* and expecting a `newRootShadowNode` as a return value.
|
|
* The `transaction` function can abort commit returning `nullptr`.
|
|
* Returns `true` if the operation finished successfully.
|
|
*/
|
|
bool tryCommit(
|
|
ShadowTreeCommitTransaction transaction,
|
|
bool enableStateReconciliation = false) const;
|
|
|
|
/*
|
|
* Calls `tryCommit` in a loop until it finishes successfully.
|
|
*/
|
|
void commit(
|
|
ShadowTreeCommitTransaction transaction,
|
|
bool enableStateReconciliation = false) const;
|
|
|
|
/*
|
|
* Commit an empty tree (a new `RootShadowNode` with no children).
|
|
*/
|
|
void commitEmptyTree() const;
|
|
|
|
MountingCoordinator::Shared getMountingCoordinator() const;
|
|
|
|
private:
|
|
RootShadowNode::Unshared cloneRootShadowNode(
|
|
RootShadowNode::Shared const &oldRootShadowNode,
|
|
LayoutConstraints const &layoutConstraints,
|
|
LayoutContext const &layoutContext) const;
|
|
|
|
void emitLayoutEvents(
|
|
std::vector<LayoutableShadowNode const *> &affectedLayoutableNodes) const;
|
|
|
|
SurfaceId const surfaceId_;
|
|
ShadowTreeDelegate const &delegate_;
|
|
mutable better::shared_mutex commitMutex_;
|
|
mutable RootShadowNode::Shared
|
|
rootShadowNode_; // Protected by `commitMutex_`.
|
|
mutable ShadowTreeRevision::Number revisionNumber_{
|
|
0}; // Protected by `commitMutex_`.
|
|
MountingCoordinator::Shared mountingCoordinator_;
|
|
};
|
|
|
|
} // namespace react
|
|
} // namespace facebook
|