diff --git a/React/Base/RCTBridge+Private.h b/React/Base/RCTBridge+Private.h index 438493e92310e0..70a20f0b00f632 100644 --- a/React/Base/RCTBridge+Private.h +++ b/React/Base/RCTBridge+Private.h @@ -146,6 +146,4 @@ RCT_EXTERN void RCTRegisterModule(Class); - (instancetype)initWithParentBridge:(RCTBridge *)bridge NS_DESIGNATED_INITIALIZER; -- (void)forceGarbageCollection; - @end diff --git a/React/CxxBridge/RCTCxxBridge.mm b/React/CxxBridge/RCTCxxBridge.mm index a3ce3b3897f5eb..0f1a601f4a6ec0 100644 --- a/React/CxxBridge/RCTCxxBridge.mm +++ b/React/CxxBridge/RCTCxxBridge.mm @@ -194,7 +194,6 @@ @interface RCTCxxBridge () - (instancetype)initWithParentBridge:(RCTBridge *)bridge; - (void)partialBatchDidFlush; - (void)batchDidComplete; -- (void)forceGarbageCollection; @end @@ -381,11 +380,6 @@ - (void)_tryAndHandleError:(dispatch_block_t)block } - (void)handleMemoryWarning -{ - [self forceGarbageCollection]; -} - -- (void)forceGarbageCollection { // We only want to run garbage collector when the loading is finished // and the instance is valid. diff --git a/React/Fabric/RCTSurfacePresenter.mm b/React/Fabric/RCTSurfacePresenter.mm index b7222d342bd056..43b154efdb63bb 100644 --- a/React/Fabric/RCTSurfacePresenter.mm +++ b/React/Fabric/RCTSurfacePresenter.mm @@ -293,19 +293,6 @@ - (RCTScheduler *)_createScheduler toolbox.backgroundExecutor = RCTGetBackgroundExecutor(); } -#ifdef REACT_NATIVE_DEBUG - auto optionalBridge = _contextContainer->find>("Bridge"); - if (optionalBridge) { - RCTBridge *bridge = unwrapManagedObjectWeakly(optionalBridge.value()); - toolbox.garbageCollectionTrigger = [bridge]() { - RCTCxxBridge *batchedBridge = (RCTCxxBridge *)([bridge batchedBridge] ?: bridge); - if ([batchedBridge respondsToSelector:@selector(forceGarbageCollection)]) { - [batchedBridge forceGarbageCollection]; - } - }; - } -#endif - toolbox.synchronousEventBeatFactory = [runtimeExecutor](EventBeat::SharedOwnerBox const &ownerBox) { auto runLoopObserver = std::make_unique(RunLoopObserver::Activity::BeforeWaiting, ownerBox->owner); diff --git a/ReactCommon/react/renderer/leakchecker/LeakChecker.cpp b/ReactCommon/react/renderer/leakchecker/LeakChecker.cpp index c393a20d28edcf..a72e485665f2e1 100644 --- a/ReactCommon/react/renderer/leakchecker/LeakChecker.cpp +++ b/ReactCommon/react/renderer/leakchecker/LeakChecker.cpp @@ -8,15 +8,13 @@ #include "LeakChecker.h" #include +#include namespace facebook { namespace react { -LeakChecker::LeakChecker( - RuntimeExecutor const &runtimeExecutor, - GarbageCollectionTrigger const &garbageCollectionTrigger) - : runtimeExecutor_(runtimeExecutor), - garbageCollectionTrigger_(garbageCollectionTrigger) {} +LeakChecker::LeakChecker(RuntimeExecutor const &runtimeExecutor) + : runtimeExecutor_(runtimeExecutor) {} void LeakChecker::uiManagerDidCreateShadowNodeFamily( ShadowNodeFamily::Shared const &shadowNodeFamily) const { @@ -24,13 +22,12 @@ void LeakChecker::uiManagerDidCreateShadowNodeFamily( } void LeakChecker::stopSurface(SurfaceId surfaceId) { - garbageCollectionTrigger_(); - if (previouslyStoppedSurface_ > 0) { // Dispatch the check onto JavaScript thread to make sure all other // cleanup code has had chance to run. runtimeExecutor_([previouslySoppedSurface = previouslyStoppedSurface_, - this](jsi::Runtime &) { + this](jsi::Runtime &runtime) { + runtime.instrumentation().collectGarbage("LeakChecker"); // For now check the previous surface because React uses double // buffering which keeps the surface that was just stopped in // memory. This is a documented problem in the last point of diff --git a/ReactCommon/react/renderer/leakchecker/LeakChecker.h b/ReactCommon/react/renderer/leakchecker/LeakChecker.h index 84bd4a5d8ea782..a9bb3dd004096c 100644 --- a/ReactCommon/react/renderer/leakchecker/LeakChecker.h +++ b/ReactCommon/react/renderer/leakchecker/LeakChecker.h @@ -20,9 +20,7 @@ using GarbageCollectionTrigger = std::function; class LeakChecker final { public: - LeakChecker( - RuntimeExecutor const &runtimeExecutor, - GarbageCollectionTrigger const &garbageCollectionTrigger); + LeakChecker(RuntimeExecutor const &runtimeExecutor); void uiManagerDidCreateShadowNodeFamily( ShadowNodeFamily::Shared const &shadowNodeFamily) const; @@ -32,7 +30,6 @@ class LeakChecker final { void checkSurfaceForLeaks(SurfaceId surfaceId) const; RuntimeExecutor const runtimeExecutor_{}; - GarbageCollectionTrigger const garbageCollectionTrigger_{}; WeakFamilyRegistry registry_{}; SurfaceId previouslyStoppedSurface_; diff --git a/ReactCommon/react/renderer/scheduler/Scheduler.cpp b/ReactCommon/react/renderer/scheduler/Scheduler.cpp index a1eeba1cd9b756..f8ef5661ce8fcc 100644 --- a/ReactCommon/react/renderer/scheduler/Scheduler.cpp +++ b/ReactCommon/react/renderer/scheduler/Scheduler.cpp @@ -45,9 +45,7 @@ Scheduler::Scheduler( std::make_shared>(); auto uiManager = std::make_shared( - runtimeExecutor_, - schedulerToolbox.backgroundExecutor, - schedulerToolbox.garbageCollectionTrigger); + runtimeExecutor_, schedulerToolbox.backgroundExecutor); auto eventOwnerBox = std::make_shared(); eventOwnerBox->owner = eventDispatcher_; diff --git a/ReactCommon/react/renderer/scheduler/SchedulerToolbox.h b/ReactCommon/react/renderer/scheduler/SchedulerToolbox.h index 94740752774f91..a4d8ddabdd684e 100644 --- a/ReactCommon/react/renderer/scheduler/SchedulerToolbox.h +++ b/ReactCommon/react/renderer/scheduler/SchedulerToolbox.h @@ -68,12 +68,6 @@ struct SchedulerToolbox final { */ BackgroundExecutor backgroundExecutor; - /* - * Triggers garbage collection. Used when checking if all Fabric's HostObjects - * have been properly cleaned up from JavaScript. - */ - GarbageCollectionTrigger garbageCollectionTrigger; - /* * A list of `UIManagerCommitHook`s that should be registered in `UIManager`. */ diff --git a/ReactCommon/react/renderer/uimanager/UIManager.cpp b/ReactCommon/react/renderer/uimanager/UIManager.cpp index e938163509e3a2..a1c9d3612b560e 100644 --- a/ReactCommon/react/renderer/uimanager/UIManager.cpp +++ b/ReactCommon/react/renderer/uimanager/UIManager.cpp @@ -18,25 +18,21 @@ namespace facebook::react { -static std::unique_ptr constructLeakChecker( - RuntimeExecutor const &runtimeExecutor, - GarbageCollectionTrigger const &garbageCollectionTrigger) { - if (garbageCollectionTrigger) { - return std::make_unique( - runtimeExecutor, garbageCollectionTrigger); - } else { - return {}; - } +static std::unique_ptr constructLeakCheckerIfNeeded( + RuntimeExecutor const &runtimeExecutor) { +#ifdef REACT_NATIVE_DEBUG + return std::make_unique(runtimeExecutor); +#else + return {}; +#endif } UIManager::UIManager( RuntimeExecutor const &runtimeExecutor, - BackgroundExecutor const &backgroundExecutor, - GarbageCollectionTrigger const &garbageCollectionTrigger) + BackgroundExecutor const &backgroundExecutor) : runtimeExecutor_(runtimeExecutor), backgroundExecutor_(backgroundExecutor), - leakChecker_( - constructLeakChecker(runtimeExecutor, garbageCollectionTrigger)) {} + leakChecker_(constructLeakCheckerIfNeeded(runtimeExecutor)) {} UIManager::~UIManager() { LOG(WARNING) << "UIManager::~UIManager() was called (address: " << this diff --git a/ReactCommon/react/renderer/uimanager/UIManager.h b/ReactCommon/react/renderer/uimanager/UIManager.h index 052a35ae5d1d1b..ebb8a419bd041c 100644 --- a/ReactCommon/react/renderer/uimanager/UIManager.h +++ b/ReactCommon/react/renderer/uimanager/UIManager.h @@ -33,8 +33,7 @@ class UIManager final : public ShadowTreeDelegate { public: UIManager( RuntimeExecutor const &runtimeExecutor, - BackgroundExecutor const &backgroundExecutor, - GarbageCollectionTrigger const &garbageCollectionTrigger); + BackgroundExecutor const &backgroundExecutor); ~UIManager();