diff --git a/ReactCommon/fabric/scheduler/Scheduler.cpp b/ReactCommon/fabric/scheduler/Scheduler.cpp index cc67b567091679..1acdf65a174ae7 100644 --- a/ReactCommon/fabric/scheduler/Scheduler.cpp +++ b/ReactCommon/fabric/scheduler/Scheduler.cpp @@ -93,9 +93,13 @@ Scheduler::Scheduler( #ifdef ANDROID enableNewStateReconciliation_ = reactNativeConfig_->getBool( "react_fabric:enable_new_state_reconciliation_android"); + removeOutstandingSurfacesOnDestruction_ = reactNativeConfig_->getBool( + "react_fabric:remove_outstanding_surfaces_on_destruction_android"); #else enableNewStateReconciliation_ = reactNativeConfig_->getBool( "react_fabric:enable_new_state_reconciliation_ios"); + removeOutstandingSurfacesOnDestruction_ = reactNativeConfig_->getBool( + "react_fabric:remove_outstanding_surfaces_on_destruction_ios"); #endif } @@ -140,6 +144,12 @@ Scheduler::~Scheduler() { uiManager_->getShadowTreeRegistry().visit( surfaceId, [](ShadowTree const &shadowTree) { shadowTree.commitEmptyTree(); }); + + // Removing surfaces is gated because it acquires mutex waiting for commits + // in flight; in theory, it can deadlock. + if (removeOutstandingSurfacesOnDestruction_) { + uiManager_->getShadowTreeRegistry().remove(surfaceId); + } } } diff --git a/ReactCommon/fabric/scheduler/Scheduler.h b/ReactCommon/fabric/scheduler/Scheduler.h index c9f664f401e6c8..243db58a0e7c4d 100644 --- a/ReactCommon/fabric/scheduler/Scheduler.h +++ b/ReactCommon/fabric/scheduler/Scheduler.h @@ -121,7 +121,11 @@ class Scheduler final : public UIManagerDelegate { */ std::shared_ptr> eventDispatcher_; + /* + * Temporary flags. + */ bool enableNewStateReconciliation_{false}; + bool removeOutstandingSurfacesOnDestruction_{false}; }; } // namespace react