From e91e295f7937e0ecb97c650cacbc1ed6721687d0 Mon Sep 17 00:00:00 2001 From: Gang Zhao Date: Fri, 29 May 2026 13:30:41 -0700 Subject: [PATCH] Promote event loop control JSI interface (#57005) Summary: X-link: https://github.com/facebook/hermes/pull/2037 Promote `IEventLoopControl` and `ISetEventLoopControl` out of `JSI_UNSTABLE` and make `HermesRuntimeImpl` always implement the setter interface. Keep unrelated unstable APIs such as serialization, tracing helpers, and Worker installation behind `JSI_UNSTABLE`. Other hermes branches do not implement `ISetEventLoopControl`, for now. Changelog: [Internal] Differential Revision: D106744174 --- .../ReactCommon/jsi/jsi/hermes-interfaces.h | 2 -- .../cxx-api/api-snapshots/ReactAndroidDebugCxx.api | 14 ++++++++++++++ .../api-snapshots/ReactAndroidNewarchCxx.api | 14 ++++++++++++++ .../api-snapshots/ReactAndroidReleaseCxx.api | 14 ++++++++++++++ .../cxx-api/api-snapshots/ReactAppleDebugCxx.api | 14 ++++++++++++++ .../cxx-api/api-snapshots/ReactAppleNewarchCxx.api | 14 ++++++++++++++ .../cxx-api/api-snapshots/ReactAppleReleaseCxx.api | 14 ++++++++++++++ .../cxx-api/api-snapshots/ReactCommonDebugCxx.api | 14 ++++++++++++++ .../api-snapshots/ReactCommonNewarchCxx.api | 14 ++++++++++++++ .../api-snapshots/ReactCommonReleaseCxx.api | 14 ++++++++++++++ 10 files changed, 126 insertions(+), 2 deletions(-) diff --git a/packages/react-native/ReactCommon/jsi/jsi/hermes-interfaces.h b/packages/react-native/ReactCommon/jsi/jsi/hermes-interfaces.h index e224e95a8e48..4655aa8ce0cd 100644 --- a/packages/react-native/ReactCommon/jsi/jsi/hermes-interfaces.h +++ b/packages/react-native/ReactCommon/jsi/jsi/hermes-interfaces.h @@ -26,7 +26,6 @@ namespace debugger { class Debugger; } -#ifdef JSI_UNSTABLE /// IEventLoopControl is defined by the integrator to allow the Runtime to /// schedule some task to be run when convenient, and to keep track of "Task /// sources". After it is set to a Runtime, the integrator must ensure that the @@ -79,7 +78,6 @@ struct JSI_EXPORT ISetEventLoopControl : public jsi::ICast { protected: ~ISetEventLoopControl() = default; }; -#endif /// Interface for Hermes-specific runtime methods.The actual implementations of /// the pure virtual methods are provided by Hermes API. diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api index 2b4fbb3a4986..b374ac98c462 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api @@ -438,6 +438,20 @@ class facebook::hermes::IHermesSHUnit : public facebook::jsi::ICast { public virtual SHUnitCreator getSHUnitCreator() const = 0; } +struct facebook::hermes::IEventLoopControl { + protected ~IEventLoopControl() = default; + public virtual uint64_t registerTaskQueueSource() = 0; + public virtual void scheduleTask(const std::function& task) = 0; + public virtual void unregisterTaskQueueSource(uint64_t sourceId) = 0; +} + +struct facebook::hermes::ISetEventLoopControl : public facebook::jsi::ICast { + protected ~ISetEventLoopControl() = default; + public static constexpr facebook::jsi::UUID uuid; + public virtual facebook::hermes::IEventLoopControl* getEventLoopControl() = 0; + public virtual void setEventLoopControl(facebook::hermes::IEventLoopControl* eventLoopControl) = 0; +} + const char facebook::react::AndroidHorizontalScrollContentViewShadowNodeComponentName[]; const char facebook::react::AndroidProgressBarComponentName[]; diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api index 06d8694b4b82..d587c74d5295 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api @@ -438,6 +438,20 @@ class facebook::hermes::IHermesSHUnit : public facebook::jsi::ICast { public virtual SHUnitCreator getSHUnitCreator() const = 0; } +struct facebook::hermes::IEventLoopControl { + protected ~IEventLoopControl() = default; + public virtual uint64_t registerTaskQueueSource() = 0; + public virtual void scheduleTask(const std::function& task) = 0; + public virtual void unregisterTaskQueueSource(uint64_t sourceId) = 0; +} + +struct facebook::hermes::ISetEventLoopControl : public facebook::jsi::ICast { + protected ~ISetEventLoopControl() = default; + public static constexpr facebook::jsi::UUID uuid; + public virtual facebook::hermes::IEventLoopControl* getEventLoopControl() = 0; + public virtual void setEventLoopControl(facebook::hermes::IEventLoopControl* eventLoopControl) = 0; +} + const char facebook::react::AndroidHorizontalScrollContentViewShadowNodeComponentName[]; const char facebook::react::AndroidProgressBarComponentName[]; diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api index 1f7567f39773..229844ee67ac 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api @@ -438,6 +438,20 @@ class facebook::hermes::IHermesSHUnit : public facebook::jsi::ICast { public virtual SHUnitCreator getSHUnitCreator() const = 0; } +struct facebook::hermes::IEventLoopControl { + protected ~IEventLoopControl() = default; + public virtual uint64_t registerTaskQueueSource() = 0; + public virtual void scheduleTask(const std::function& task) = 0; + public virtual void unregisterTaskQueueSource(uint64_t sourceId) = 0; +} + +struct facebook::hermes::ISetEventLoopControl : public facebook::jsi::ICast { + protected ~ISetEventLoopControl() = default; + public static constexpr facebook::jsi::UUID uuid; + public virtual facebook::hermes::IEventLoopControl* getEventLoopControl() = 0; + public virtual void setEventLoopControl(facebook::hermes::IEventLoopControl* eventLoopControl) = 0; +} + const char facebook::react::AndroidHorizontalScrollContentViewShadowNodeComponentName[]; const char facebook::react::AndroidProgressBarComponentName[]; diff --git a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api index d4f7c124a3cb..0368b218d2fa 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api @@ -3750,6 +3750,20 @@ class facebook::hermes::IHermesSHUnit : public facebook::jsi::ICast { public virtual SHUnitCreator getSHUnitCreator() const = 0; } +struct facebook::hermes::IEventLoopControl { + protected ~IEventLoopControl() = default; + public virtual uint64_t registerTaskQueueSource() = 0; + public virtual void scheduleTask(const std::function& task) = 0; + public virtual void unregisterTaskQueueSource(uint64_t sourceId) = 0; +} + +struct facebook::hermes::ISetEventLoopControl : public facebook::jsi::ICast { + protected ~ISetEventLoopControl() = default; + public static constexpr facebook::jsi::UUID uuid; + public virtual facebook::hermes::IEventLoopControl* getEventLoopControl() = 0; + public virtual void setEventLoopControl(facebook::hermes::IEventLoopControl* eventLoopControl) = 0; +} + const char facebook::react::AppleSwitchComponentName[]; const char facebook::react::ImageComponentName[]; diff --git a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api index cd89d347ccfa..2a943a04c0a5 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api @@ -3376,6 +3376,20 @@ class facebook::hermes::IHermesSHUnit : public facebook::jsi::ICast { public virtual SHUnitCreator getSHUnitCreator() const = 0; } +struct facebook::hermes::IEventLoopControl { + protected ~IEventLoopControl() = default; + public virtual uint64_t registerTaskQueueSource() = 0; + public virtual void scheduleTask(const std::function& task) = 0; + public virtual void unregisterTaskQueueSource(uint64_t sourceId) = 0; +} + +struct facebook::hermes::ISetEventLoopControl : public facebook::jsi::ICast { + protected ~ISetEventLoopControl() = default; + public static constexpr facebook::jsi::UUID uuid; + public virtual facebook::hermes::IEventLoopControl* getEventLoopControl() = 0; + public virtual void setEventLoopControl(facebook::hermes::IEventLoopControl* eventLoopControl) = 0; +} + const char facebook::react::AppleSwitchComponentName[]; const char facebook::react::ImageComponentName[]; diff --git a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api index 8219222a7c4d..3d1659027cb8 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api @@ -3750,6 +3750,20 @@ class facebook::hermes::IHermesSHUnit : public facebook::jsi::ICast { public virtual SHUnitCreator getSHUnitCreator() const = 0; } +struct facebook::hermes::IEventLoopControl { + protected ~IEventLoopControl() = default; + public virtual uint64_t registerTaskQueueSource() = 0; + public virtual void scheduleTask(const std::function& task) = 0; + public virtual void unregisterTaskQueueSource(uint64_t sourceId) = 0; +} + +struct facebook::hermes::ISetEventLoopControl : public facebook::jsi::ICast { + protected ~ISetEventLoopControl() = default; + public static constexpr facebook::jsi::UUID uuid; + public virtual facebook::hermes::IEventLoopControl* getEventLoopControl() = 0; + public virtual void setEventLoopControl(facebook::hermes::IEventLoopControl* eventLoopControl) = 0; +} + const char facebook::react::AppleSwitchComponentName[]; const char facebook::react::ImageComponentName[]; diff --git a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api index 5f68b22fb882..d78037a8fb8f 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api @@ -136,6 +136,20 @@ class facebook::hermes::IHermesSHUnit : public facebook::jsi::ICast { public virtual SHUnitCreator getSHUnitCreator() const = 0; } +struct facebook::hermes::IEventLoopControl { + protected ~IEventLoopControl() = default; + public virtual uint64_t registerTaskQueueSource() = 0; + public virtual void scheduleTask(const std::function& task) = 0; + public virtual void unregisterTaskQueueSource(uint64_t sourceId) = 0; +} + +struct facebook::hermes::ISetEventLoopControl : public facebook::jsi::ICast { + protected ~ISetEventLoopControl() = default; + public static constexpr facebook::jsi::UUID uuid; + public virtual facebook::hermes::IEventLoopControl* getEventLoopControl() = 0; + public virtual void setEventLoopControl(facebook::hermes::IEventLoopControl* eventLoopControl) = 0; +} + const char facebook::react::AndroidProgressBarComponentName[]; const char facebook::react::AndroidSwitchComponentName[]; diff --git a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api index 81705abe51bd..eb70a53982fc 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api @@ -136,6 +136,20 @@ class facebook::hermes::IHermesSHUnit : public facebook::jsi::ICast { public virtual SHUnitCreator getSHUnitCreator() const = 0; } +struct facebook::hermes::IEventLoopControl { + protected ~IEventLoopControl() = default; + public virtual uint64_t registerTaskQueueSource() = 0; + public virtual void scheduleTask(const std::function& task) = 0; + public virtual void unregisterTaskQueueSource(uint64_t sourceId) = 0; +} + +struct facebook::hermes::ISetEventLoopControl : public facebook::jsi::ICast { + protected ~ISetEventLoopControl() = default; + public static constexpr facebook::jsi::UUID uuid; + public virtual facebook::hermes::IEventLoopControl* getEventLoopControl() = 0; + public virtual void setEventLoopControl(facebook::hermes::IEventLoopControl* eventLoopControl) = 0; +} + const char facebook::react::AndroidProgressBarComponentName[]; const char facebook::react::AndroidSwitchComponentName[]; diff --git a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api index 29810fb16f09..ae504e26ce4a 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api @@ -136,6 +136,20 @@ class facebook::hermes::IHermesSHUnit : public facebook::jsi::ICast { public virtual SHUnitCreator getSHUnitCreator() const = 0; } +struct facebook::hermes::IEventLoopControl { + protected ~IEventLoopControl() = default; + public virtual uint64_t registerTaskQueueSource() = 0; + public virtual void scheduleTask(const std::function& task) = 0; + public virtual void unregisterTaskQueueSource(uint64_t sourceId) = 0; +} + +struct facebook::hermes::ISetEventLoopControl : public facebook::jsi::ICast { + protected ~ISetEventLoopControl() = default; + public static constexpr facebook::jsi::UUID uuid; + public virtual facebook::hermes::IEventLoopControl* getEventLoopControl() = 0; + public virtual void setEventLoopControl(facebook::hermes::IEventLoopControl* eventLoopControl) = 0; +} + const char facebook::react::AndroidProgressBarComponentName[]; const char facebook::react::AndroidSwitchComponentName[];