1 /*
2  * Copyright (c) Meta Platforms, Inc. and affiliates.
3  *
4  * This source code is licensed under the MIT license found in the
5  * LICENSE file in the root directory of this source tree.
6  */
7 
8 #include "ABI49_0_0ReactMarker.h"
9 #include <ABI49_0_0cxxreact/ABI49_0_0JSExecutor.h>
10 
11 namespace ABI49_0_0facebook {
12 namespace ABI49_0_0React {
13 namespace ABI49_0_0ReactMarker {
14 
15 #if __clang__
16 #pragma clang diagnostic push
17 #pragma clang diagnostic ignored "-Wglobal-constructors"
18 #endif
19 
20 LogTaggedMarker logTaggedMarkerImpl = nullptr;
21 LogTaggedMarker logTaggedMarkerBridgelessImpl = nullptr;
22 GetAppStartTime getAppStartTimeImpl = nullptr;
23 
24 #if __clang__
25 #pragma clang diagnostic pop
26 #endif
27 
logMarker(const ABI49_0_0ReactMarkerId markerId)28 void logMarker(const ABI49_0_0ReactMarkerId markerId) {
29   logTaggedMarker(markerId, nullptr);
30 }
31 
logTaggedMarker(const ABI49_0_0ReactMarkerId markerId,const char * tag)32 void logTaggedMarker(const ABI49_0_0ReactMarkerId markerId, const char *tag) {
33   StartupLogger::getInstance().logStartupEvent(markerId);
34   logTaggedMarkerImpl(markerId, tag);
35 }
36 
logMarkerBridgeless(const ABI49_0_0ReactMarkerId markerId)37 void logMarkerBridgeless(const ABI49_0_0ReactMarkerId markerId) {
38   logTaggedMarkerBridgeless(markerId, nullptr);
39 }
40 
logTaggedMarkerBridgeless(const ABI49_0_0ReactMarkerId markerId,const char * tag)41 void logTaggedMarkerBridgeless(const ABI49_0_0ReactMarkerId markerId, const char *tag) {
42   StartupLogger::getInstance().logStartupEvent(markerId);
43   logTaggedMarkerBridgelessImpl(markerId, tag);
44 }
45 
getInstance()46 StartupLogger &StartupLogger::getInstance() {
47   static StartupLogger instance;
48   return instance;
49 }
50 
logStartupEvent(const ABI49_0_0ReactMarkerId markerId)51 void StartupLogger::logStartupEvent(const ABI49_0_0ReactMarkerId markerId) {
52   auto now = JSExecutor::performanceNow();
53   switch (markerId) {
54     case ABI49_0_0ReactMarkerId::RUN_JS_BUNDLE_START:
55       if (runJSBundleStartTime == 0) {
56         runJSBundleStartTime = now;
57       }
58       return;
59 
60     case ABI49_0_0ReactMarkerId::RUN_JS_BUNDLE_STOP:
61       if (runJSBundleEndTime == 0) {
62         runJSBundleEndTime = now;
63       }
64       return;
65 
66     default:
67       return;
68   }
69 }
70 
getAppStartTime()71 double StartupLogger::getAppStartTime() {
72   if (getAppStartTimeImpl == nullptr) {
73     return 0;
74   }
75 
76   return getAppStartTimeImpl();
77 }
78 
getRunJSBundleStartTime()79 double StartupLogger::getRunJSBundleStartTime() {
80   return runJSBundleStartTime;
81 }
82 
getRunJSBundleEndTime()83 double StartupLogger::getRunJSBundleEndTime() {
84   return runJSBundleEndTime;
85 }
86 
87 } // namespace ABI49_0_0ReactMarker
88 } // namespace ABI49_0_0React
89 } // namespace ABI49_0_0facebook
90