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 #pragma once
9 
10 #ifdef __APPLE__
11 #include <functional>
12 #endif
13 
14 namespace ABI49_0_0facebook {
15 namespace ABI49_0_0React {
16 namespace ABI49_0_0ReactMarker {
17 
18 enum ABI49_0_0ReactMarkerId {
19   NATIVE_REQUIRE_START,
20   NATIVE_REQUIRE_STOP,
21   RUN_JS_BUNDLE_START,
22   RUN_JS_BUNDLE_STOP,
23   CREATE_REACT_CONTEXT_STOP,
24   JS_BUNDLE_STRING_CONVERT_START,
25   JS_BUNDLE_STRING_CONVERT_STOP,
26   NATIVE_MODULE_SETUP_START,
27   NATIVE_MODULE_SETUP_STOP,
28   REGISTER_JS_SEGMENT_START,
29   REGISTER_JS_SEGMENT_STOP,
30   ABI49_0_0REACT_INSTANCE_INIT_START,
31   ABI49_0_0REACT_INSTANCE_INIT_STOP
32 };
33 
34 #ifdef __APPLE__
35 using LogTaggedMarker =
36     std::function<void(const ABI49_0_0ReactMarkerId, const char *tag)>; // Bridge only
37 using LogTaggedMarkerBridgeless =
38     std::function<void(const ABI49_0_0ReactMarkerId, const char *tag)>;
39 using GetAppStartTime = std::function<double()>;
40 #else
41 typedef void (
42     *LogTaggedMarker)(const ABI49_0_0ReactMarkerId, const char *tag); // Bridge only
43 typedef void (*LogTaggedMarkerBridgeless)(const ABI49_0_0ReactMarkerId, const char *tag);
44 typedef double (*GetAppStartTime)();
45 #endif
46 
47 #ifndef ABI49_0_0RN_EXPORT
48 #define ABI49_0_0RN_EXPORT __attribute__((visibility("default")))
49 #endif
50 
51 extern ABI49_0_0RN_EXPORT LogTaggedMarker logTaggedMarkerImpl; // Bridge only
52 extern ABI49_0_0RN_EXPORT LogTaggedMarker logTaggedMarkerBridgelessImpl;
53 extern ABI49_0_0RN_EXPORT GetAppStartTime getAppStartTimeImpl;
54 
55 extern ABI49_0_0RN_EXPORT void logMarker(const ABI49_0_0ReactMarkerId markerId); // Bridge only
56 extern ABI49_0_0RN_EXPORT void logTaggedMarker(
57     const ABI49_0_0ReactMarkerId markerId,
58     const char *tag); // Bridge only
59 extern ABI49_0_0RN_EXPORT void logMarkerBridgeless(const ABI49_0_0ReactMarkerId markerId);
60 extern ABI49_0_0RN_EXPORT void logTaggedMarkerBridgeless(
61     const ABI49_0_0ReactMarkerId markerId,
62     const char *tag);
63 extern ABI49_0_0RN_EXPORT double getAppStartTime();
64 
65 struct ABI49_0_0ReactMarkerEvent {
66   const ABI49_0_0ReactMarkerId markerId;
67   const char *tag;
68   double time;
69 };
70 
71 class StartupLogger {
72  public:
73   static StartupLogger &getInstance();
74 
75   void logStartupEvent(const ABI49_0_0ReactMarker::ABI49_0_0ReactMarkerId markerId);
76   double getAppStartTime();
77   double getRunJSBundleStartTime();
78   double getRunJSBundleEndTime();
79 
80  private:
81   StartupLogger() = default;
82   StartupLogger(const StartupLogger &) = delete;
83   StartupLogger &operator=(const StartupLogger &) = delete;
84 
85   double runJSBundleStartTime;
86   double runJSBundleEndTime;
87 };
88 
89 } // namespace ABI49_0_0ReactMarker
90 } // namespace ABI49_0_0React
91 } // namespace ABI49_0_0facebook
92