diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.cpp b/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.cpp index 811c8c8928181f..7aaf876c3c4dfe 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.cpp @@ -45,10 +45,17 @@ void SurfaceManager::startSurface( } void SurfaceManager::stopSurface(SurfaceId surfaceId) noexcept { + bool surfaceWasRunning = false; visit(surfaceId, [&](const SurfaceHandler& surfaceHandler) { surfaceHandler.stop(); scheduler_.unregisterSurface(surfaceHandler); + surfaceWasRunning = true; }); + if (!surfaceWasRunning) { + LOG(WARNING) + << "SurfaceManager::stopSurface tried to stop a surface which was not running, surfaceId = " + << surfaceId; + } { std::unique_lock lock(mutex_); @@ -59,6 +66,19 @@ void SurfaceManager::stopSurface(SurfaceId surfaceId) noexcept { } void SurfaceManager::stopAllSurfaces() noexcept { + auto surfaceIds = getRunningSurfaces(); + for (const auto& surfaceId : surfaceIds) { + stopSurface(surfaceId); + } +} + +bool SurfaceManager::isSurfaceRunning(SurfaceId surfaceId) const noexcept { + std::shared_lock lock(mutex_); + return registry_.contains(surfaceId); +} + +std::unordered_set SurfaceManager::getRunningSurfaces() + const noexcept { std::unordered_set surfaceIds; { std::shared_lock lock(mutex_); @@ -66,9 +86,7 @@ void SurfaceManager::stopAllSurfaces() noexcept { surfaceIds.insert(surfaceId); } } - for (const auto& surfaceId : surfaceIds) { - stopSurface(surfaceId); - } + return surfaceIds; } Size SurfaceManager::measureSurface( diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.h b/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.h index d377a2a9903c06..4671212ffb85cd 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.h +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.h @@ -42,6 +42,10 @@ class SurfaceManager final { void stopAllSurfaces() noexcept; + bool isSurfaceRunning(SurfaceId surfaceId) const noexcept; + + std::unordered_set getRunningSurfaces() const noexcept; + Size measureSurface( SurfaceId surfaceId, const LayoutConstraints& layoutConstraints,