diff --git a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp index a3af28d8ed7b97..1001005e780bf8 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp @@ -139,6 +139,7 @@ ShadowNode::ShadowNode( std::shared_ptr ShadowNode::clone( const ShadowNodeFragment& fragment) const { const auto& family = *family_; + std::lock_guard npGuard(family.nativePropsMutex); const auto& componentDescriptor = family.componentDescriptor_; if (family.nativeProps_DEPRECATED != nullptr) { auto propsParserContext = PropsParserContext{family_->getSurfaceId(), {}}; diff --git a/packages/react-native/ReactCommon/react/renderer/core/ShadowNodeFamily.h b/packages/react-native/ReactCommon/react/renderer/core/ShadowNodeFamily.h index 2699cad51ba541..ecf1ee63d7bbbb 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ShadowNodeFamily.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ShadowNodeFamily.h @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -118,6 +119,7 @@ class ShadowNodeFamily final : public jsi::NativeState { * architecture and will be removed in the future. */ mutable std::unique_ptr nativeProps_DEPRECATED; + mutable std::recursive_mutex nativePropsMutex; /** * @return tag for the ShadowNodeFamily. diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp index edee8ac36bca40..78aa1cf83d5e32 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp @@ -118,6 +118,7 @@ std::shared_ptr UIManager::cloneNode( auto props = ShadowNodeFragment::propsPlaceholder(); if (!rawProps.isEmpty()) { + std::lock_guard npGuard(family.nativePropsMutex); if (family.nativeProps_DEPRECATED != nullptr) { // 1. update the nativeProps_DEPRECATED props. // @@ -426,6 +427,7 @@ void UIManager::setNativeProps_DEPRECATED( const std::shared_ptr& shadowNode, RawProps rawProps) const { auto& family = shadowNode->getFamily(); + family.nativePropsMutex.lock(); if (family.nativeProps_DEPRECATED) { // Values in `rawProps` patch (take precedence over) // `nativeProps_DEPRECATED`. For example, if both `nativeProps_DEPRECATED` @@ -440,6 +442,7 @@ void UIManager::setNativeProps_DEPRECATED( family.nativeProps_DEPRECATED = std::make_unique((folly::dynamic)rawProps); } + family.nativePropsMutex.unlock(); shadowTreeRegistry_.visit( family.getSurfaceId(), [&](const ShadowTree& shadowTree) {