diff --git a/packages/react-native/React/CxxBridge/RCTCxxBridge.mm b/packages/react-native/React/CxxBridge/RCTCxxBridge.mm index 044862f821c2a2..2ce5c7d41fec5d 100644 --- a/packages/react-native/React/CxxBridge/RCTCxxBridge.mm +++ b/packages/react-native/React/CxxBridge/RCTCxxBridge.mm @@ -163,10 +163,11 @@ static void mapReactMarkerToPerformanceLogger( static void registerPerformanceLoggerHooks(RCTPerformanceLogger *performanceLogger) { __weak RCTPerformanceLogger *weakPerformanceLogger = performanceLogger; - ReactMarker::logTaggedMarkerImpl = [weakPerformanceLogger]( + ReactMarker::LogTaggedMarker newMarker = [weakPerformanceLogger]( const ReactMarker::ReactMarkerId markerId, const char *tag) { mapReactMarkerToPerformanceLogger(markerId, weakPerformanceLogger, tag); }; + ReactMarker::setLogTaggedMarkerImpl(newMarker); } @interface RCTCxxBridge () diff --git a/packages/react-native/ReactCommon/cxxreact/ReactMarker.cpp b/packages/react-native/ReactCommon/cxxreact/ReactMarker.cpp index 86c3a03c9df5bf..8a0b119c24461c 100644 --- a/packages/react-native/ReactCommon/cxxreact/ReactMarker.cpp +++ b/packages/react-native/ReactCommon/cxxreact/ReactMarker.cpp @@ -16,7 +16,6 @@ namespace ReactMarker { #pragma clang diagnostic ignored "-Wglobal-constructors" #endif -LogTaggedMarker logTaggedMarkerImpl = nullptr; LogTaggedMarker logTaggedMarkerBridgelessImpl = nullptr; #if __clang__ diff --git a/packages/react-native/ReactCommon/cxxreact/ReactMarker.h b/packages/react-native/ReactCommon/cxxreact/ReactMarker.h index e50746780d4867..3fb23fe149dee6 100644 --- a/packages/react-native/ReactCommon/cxxreact/ReactMarker.h +++ b/packages/react-native/ReactCommon/cxxreact/ReactMarker.h @@ -8,6 +8,7 @@ #pragma once #include +#include #ifdef __APPLE__ #include @@ -51,7 +52,21 @@ typedef void (*LogTaggedMarkerBridgeless)(const ReactMarkerId, const char* tag); #define RN_EXPORT __attribute__((visibility("default"))) #endif -extern RN_EXPORT LogTaggedMarker logTaggedMarkerImpl; // Bridge only +namespace { + std::shared_mutex logTaggedMarkerImplMutex; + LogTaggedMarker logTaggedMarkerImpl = nullptr; +} + +extern RN_EXPORT inline LogTaggedMarker getLogTaggedMarkerImpl(void) { + std::shared_lock lock(logTaggedMarkerImplMutex); + return logTaggedMarkerImpl; +} + +extern RN_EXPORT inline void setLogTaggedMarkerImpl(LogTaggedMarker marker) { + std::unique_lock lock(logTaggedMarkerImplMutex); + logTaggedMarkerImpl = marker; +} + extern RN_EXPORT LogTaggedMarker logTaggedMarkerBridgelessImpl; extern RN_EXPORT void logMarker(const ReactMarkerId markerId); // Bridge only diff --git a/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp b/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp index 51fabddc8f0f03..6e7693200a24ed 100644 --- a/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp +++ b/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp @@ -140,7 +140,7 @@ void JSIExecutor::initializeRuntime() { runtimeInstaller_(*runtime_); } - bool hasLogger(ReactMarker::logTaggedMarkerImpl); + bool hasLogger(ReactMarker::getLogTaggedMarkerImpl()); if (hasLogger) { ReactMarker::logMarker(ReactMarker::CREATE_REACT_CONTEXT_STOP); } @@ -151,7 +151,7 @@ void JSIExecutor::loadBundle( std::string sourceURL) { SystraceSection s("JSIExecutor::loadBundle"); - bool hasLogger(ReactMarker::logTaggedMarkerImpl); + bool hasLogger(ReactMarker::getLogTaggedMarkerImpl()); std::string scriptName = simpleBasename(sourceURL); if (hasLogger) { ReactMarker::logTaggedMarker( diff --git a/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSINativeModules.cpp b/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSINativeModules.cpp index 56503c683e4a39..62c86a9e0d8eea 100644 --- a/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSINativeModules.cpp +++ b/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSINativeModules.cpp @@ -67,7 +67,7 @@ void JSINativeModules::reset() { std::optional JSINativeModules::createModule( Runtime& rt, const std::string& name) { - bool hasLogger(ReactMarker::logTaggedMarkerImpl); + bool hasLogger(ReactMarker::getLogTaggedMarkerImpl()); if (hasLogger) { ReactMarker::logTaggedMarker( ReactMarker::NATIVE_MODULE_SETUP_START, name.c_str());