From 44525aaf8bd8d8273a8006a49acfdf9b6d6dd4e3 Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Mon, 6 Jan 2025 18:51:46 -0800 Subject: [PATCH] Add isSurfaceRunning / getRunningSurfaces util functions to SurfaceManager (#48484) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/48484 [Changelog] [Internal] - Add isSurfaceRunning / getRunningSurfaces util functions to SurfaceManager This exposes convience getter methods to data already stored in SurfaceManager Reviewed By: rshest Differential Revision: D67814092 fbshipit-source-id: af5e9df3b380d5efc0c11627a0d9a56796526639 --- .../renderer/scheduler/SurfaceManager.cpp | 24 ++++++++++++++++--- .../react/renderer/scheduler/SurfaceManager.h | 4 ++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.cpp b/packages/react-native/ReactCommon/react/renderer/scheduler/SurfaceManager.cpp index 811c8c89281..7aaf876c3c4 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 d377a2a9903..4671212ffb8 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,