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 #include <cstdint>
10 
11 namespace ABI47_0_0facebook {
12 namespace ABI47_0_0React {
13 
14 /**
15  * A platform-agnostic interface to do performance logging on NativeModules and
16  * TuboModules.
17  */
18 class NativeModulePerfLogger {
19  public:
~NativeModulePerfLogger()20   virtual ~NativeModulePerfLogger() {}
21 
22   /**
23    * NativeModule Initialization.
24    *
25    * The initialization of two NativeModules can interleave. Therefore,
26    * performance markers should use the moduleName as a unique key.
27    */
28 
29   /**
30    * On iOS:
31    *   - NativeModule initialization is split into two phases, which sometimes
32    *     have a pause in the middle.
33    *   - TurboModule initialization happens all at once.
34    *
35    * On Android:
36    *   - NativeModule and TurboModule initialization happens all at once.
37    *
38    * These markers are meant for iOS NativeModules:
39    *  - moduleDataCreateStart: very beginning of first phase.
40    *  - moduleDataCreateEnd: after ABI47_0_0RCTModuleData has been created.
41    */
42   virtual void moduleDataCreateStart(const char *moduleName, int32_t id) = 0;
43   virtual void moduleDataCreateEnd(const char *moduleName, int32_t id) = 0;
44 
45   /**
46    * How long does it take to create the platform NativeModule object?
47    *   - moduleCreateStart: start creating platform NativeModule
48    *   - moduleCreateEnd: stop creating platform NativeModule
49    */
50   virtual void moduleCreateStart(const char *moduleName, int32_t id) = 0;
51   virtual void moduleCreateCacheHit(const char *moduleName, int32_t id) = 0;
52   virtual void moduleCreateConstructStart(
53       const char *moduleName,
54       int32_t id) = 0;
55   virtual void moduleCreateConstructEnd(const char *moduleName, int32_t id) = 0;
56   virtual void moduleCreateSetUpStart(const char *moduleName, int32_t id) = 0;
57   virtual void moduleCreateSetUpEnd(const char *moduleName, int32_t id) = 0;
58   virtual void moduleCreateEnd(const char *moduleName, int32_t id) = 0;
59   virtual void moduleCreateFail(const char *moduleName, int32_t id) = 0;
60 
61   /**
62    * How long, after starting JS require, does it take to start creating the
63    * platform NativeModule?
64    *   - moduleJSRequireBeginningStart: start of JS require
65    *   - moduleJSRequireBeginningEnd: start creating platform NativeModule
66    */
67   virtual void moduleJSRequireBeginningStart(const char *moduleName) = 0;
68   virtual void moduleJSRequireBeginningCacheHit(const char *moduleName) = 0;
69   virtual void moduleJSRequireBeginningEnd(const char *moduleName) = 0;
70   virtual void moduleJSRequireBeginningFail(const char *moduleName) = 0;
71 
72   /**
73    * How long does it take to return from the JS require after the platform
74    * NativeModule is created?
75    *   - moduleJSRequireEndingStart: end creating platform NativeModule
76    *   - moduleJSRequireEndingEnd: end of JS require
77    */
78   virtual void moduleJSRequireEndingStart(const char *moduleName) = 0;
79   virtual void moduleJSRequireEndingEnd(const char *moduleName) = 0;
80   virtual void moduleJSRequireEndingFail(const char *moduleName) = 0;
81 
82   // Sync method calls
83   virtual void syncMethodCallStart(
84       const char *moduleName,
85       const char *methodName) = 0;
86   virtual void syncMethodCallArgConversionStart(
87       const char *moduleName,
88       const char *methodName) = 0;
89   virtual void syncMethodCallArgConversionEnd(
90       const char *moduleName,
91       const char *methodName) = 0;
92   virtual void syncMethodCallExecutionStart(
93       const char *moduleName,
94       const char *methodName) = 0;
95   virtual void syncMethodCallExecutionEnd(
96       const char *moduleName,
97       const char *methodName) = 0;
98   virtual void syncMethodCallReturnConversionStart(
99       const char *moduleName,
100       const char *methodName) = 0;
101   virtual void syncMethodCallReturnConversionEnd(
102       const char *moduleName,
103       const char *methodName) = 0;
104   virtual void syncMethodCallEnd(
105       const char *moduleName,
106       const char *methodName) = 0;
107   virtual void syncMethodCallFail(
108       const char *moduleName,
109       const char *methodName) = 0;
110 
111   // Async method calls
112   virtual void asyncMethodCallStart(
113       const char *moduleName,
114       const char *methodName) = 0;
115   virtual void asyncMethodCallArgConversionStart(
116       const char *moduleName,
117       const char *methodName) = 0;
118   virtual void asyncMethodCallArgConversionEnd(
119       const char *moduleName,
120       const char *methodName) = 0;
121   virtual void asyncMethodCallDispatch(
122       const char *moduleName,
123       const char *methodName) = 0;
124   virtual void asyncMethodCallEnd(
125       const char *moduleName,
126       const char *methodName) = 0;
127   virtual void asyncMethodCallFail(
128       const char *moduleName,
129       const char *methodName) = 0;
130 
131   /**
132    * In the NativeModule system, we batch async NativeModule method calls.
133    * When we execute a batch of NativeModule method calls, we convert the batch
134    * from a jsi::Value to folly::dynamic to std::vector<MethodCall>. This marker
135    * documents that work.
136    */
137   virtual void asyncMethodCallBatchPreprocessStart() = 0;
138   virtual void asyncMethodCallBatchPreprocessEnd(int batchSize) = 0;
139 
140   // Async method call execution
141   virtual void asyncMethodCallExecutionStart(
142       const char *moduleName,
143       const char *methodName,
144       int32_t id) = 0;
145   virtual void asyncMethodCallExecutionArgConversionStart(
146       const char *moduleName,
147       const char *methodName,
148       int32_t id) = 0;
149   virtual void asyncMethodCallExecutionArgConversionEnd(
150       const char *moduleName,
151       const char *methodName,
152       int32_t id) = 0;
153   virtual void asyncMethodCallExecutionEnd(
154       const char *moduleName,
155       const char *methodName,
156       int32_t id) = 0;
157   virtual void asyncMethodCallExecutionFail(
158       const char *moduleName,
159       const char *methodName,
160       int32_t id) = 0;
161 };
162 
163 } // namespace ABI47_0_0React
164 } // namespace ABI47_0_0facebook
165