From bee24f3accafa99643dd30260e86eab7ee167cac Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Mon, 7 Sep 2026 03:25:07 -0700 Subject: [PATCH 1/2] Forward declare CDP reporters and ViewTransitionModule in Scheduler.h (#58136) Summary: Under the C++ Stable API RFC, `react/renderer/scheduler:scheduler` is a "for frameworks" module while `react/performance/cdpmetrics:cdpmetrics` and `react/renderer/viewtransition:viewtransition` are private. `Scheduler.h` is an exported header of the scheduler target and included all three private headers, so it transitively exposed them to consumers. `ViewTransitionModule.h` already carries the private-tier guard, so this was an active violation and not just a latent one. `Scheduler.h` only needs these types for data members. `viewTransitionModule_` was already a `std::shared_ptr`, so a forward declaration is sufficient. The two CDP reporters were held as `std::optional`, which requires a complete type, so they become `std::unique_ptr`. They are constructed conditionally behind feature flags and only ever handed to `PerformanceEntryReporter` as raw pointers, so ownership and lifetime are unchanged. `~Scheduler()` is already out of line, so the incomplete types are fine. `` and `` are now included explicitly, since they were previously pulled in transitively through the cdpmetrics headers. `Scheduler.h` is the only header in ReactCommon that reached either module, so both are now cleanly private. No build config change is needed: `cdpmetrics` and `viewtransition` are already non-exported deps of the scheduler target. Changelog: [Internal] Differential Revision: D116909092 --- .../react/renderer/scheduler/Scheduler.cpp | 18 ++++++++++++------ .../react/renderer/scheduler/Scheduler.h | 13 ++++++++----- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp index e74e8025c26..a42669c53bb 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include #include #include @@ -23,6 +25,7 @@ #include #include #include +#include #include namespace facebook::react { @@ -43,13 +46,15 @@ Scheduler::Scheduler( if (ReactNativeFeatureFlags::enableBridgelessArchitecture() && ReactNativeFeatureFlags::cdpInteractionMetricsEnabled()) { - cdpMetricsReporter_.emplace(CdpMetricsReporter{runtimeExecutor_}); - performanceEntryReporter_->addEventListener(&*cdpMetricsReporter_); + cdpMetricsReporter_ = + std::make_unique(runtimeExecutor_); + performanceEntryReporter_->addEventListener(cdpMetricsReporter_.get()); } if (ReactNativeFeatureFlags::perfIssuesEnabled()) { - cdpPerfIssuesReporter_.emplace(CdpPerfIssuesReporter{runtimeExecutor_}); - performanceEntryReporter_->addEventListener(&*cdpPerfIssuesReporter_); + cdpPerfIssuesReporter_ = + std::make_unique(runtimeExecutor_); + performanceEntryReporter_->addEventListener(cdpPerfIssuesReporter_.get()); } eventPerformanceLogger_ = @@ -206,10 +211,11 @@ Scheduler::~Scheduler() { uiManager_->setViewTransitionDelegate(nullptr); if (cdpMetricsReporter_) { - performanceEntryReporter_->removeEventListener(&*cdpMetricsReporter_); + performanceEntryReporter_->removeEventListener(cdpMetricsReporter_.get()); } if (cdpPerfIssuesReporter_) { - performanceEntryReporter_->removeEventListener(&*cdpPerfIssuesReporter_); + performanceEntryReporter_->removeEventListener( + cdpPerfIssuesReporter_.get()); } // Then, let's verify that the requirement was satisfied. diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h index 1f5a59d1e1e..5723f4d0e54 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h @@ -11,11 +11,11 @@ #include #include +#include +#include #include #include -#include -#include #include #include #include @@ -31,11 +31,14 @@ #include #include #include -#include #include namespace facebook::react { +class CdpMetricsReporter; +class CdpPerfIssuesReporter; +class ViewTransitionModule; + /* * Scheduler coordinates Shadow Tree updates and event flows. */ @@ -142,8 +145,8 @@ class Scheduler final : public UIManagerDelegate { std::shared_ptr> eventDispatcher_; std::shared_ptr performanceEntryReporter_; - std::optional cdpMetricsReporter_; - std::optional cdpPerfIssuesReporter_; + std::unique_ptr cdpMetricsReporter_; + std::unique_ptr cdpPerfIssuesReporter_; std::shared_ptr eventPerformanceLogger_; /** From 90d0f9b10325b16ceb2a145f3a964268812aaa76 Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Mon, 7 Sep 2026 03:25:07 -0700 Subject: [PATCH 2/2] Remove remaining private includes from scheduler headers (#58137) Summary: Under the C++ Stable API RFC, `react/renderer/scheduler:scheduler` is a "for frameworks" module, but its exported headers still reached two private modules: - `Scheduler.h` included `react/performance/timeline/PerformanceEntryReporter.h` and `react/renderer/observers/events/EventPerformanceLogger.h`. Both are only used as `std::shared_ptr` data members, so forward declarations are sufficient and the includes move to `Scheduler.cpp`. - `SchedulerToolbox.h` included `react/renderer/leakchecker/LeakChecker.h` but never named anything from it. `leakchecker` is not even a dependency of the scheduler target, so the include is dead and is simply removed. `react/renderer/observers/events:events` had no other header-level consumer in ReactCommon, so it is now cleanly private. `react/performance/timeline:timeline` is still reached from `RuntimeScheduler.h` and `NativePerformance.h`, which are handled separately. After this, no scheduler header includes a private module directly. Changelog: [Internal] Differential Revision: D116909093 --- .../ReactCommon/react/renderer/scheduler/Scheduler.cpp | 2 ++ .../ReactCommon/react/renderer/scheduler/Scheduler.h | 4 ++-- .../ReactCommon/react/renderer/scheduler/SchedulerToolbox.h | 1 - 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp index a42669c53bb..e81660b312e 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp @@ -15,12 +15,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h index 5723f4d0e54..59c8f6ceac8 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h @@ -16,14 +16,12 @@ #include #include -#include #include #include #include #include #include #include -#include #include #include #include @@ -37,6 +35,8 @@ namespace facebook::react { class CdpMetricsReporter; class CdpPerfIssuesReporter; +class EventPerformanceLogger; +class PerformanceEntryReporter; class ViewTransitionModule; /* diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/SchedulerToolbox.h b/packages/react-native/ReactCommon/react/renderer/scheduler/SchedulerToolbox.h index 7d78c1ed524..50ddbdca801 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/SchedulerToolbox.h +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/SchedulerToolbox.h @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include