Skip to content

Commit 1afbb37

Browse files
committed
Prevent leaking listener when getPackages is called multiple times
1 parent cf3542d commit 1afbb37

File tree

1 file changed

+59
-53
lines changed

1 file changed

+59
-53
lines changed

packages/react-native-performance/android/src/main/java/com/oblador/performance/PerformanceModule.java

Lines changed: 59 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,51 @@ public class PerformanceModule extends ReactContextBaseJavaModule implements Tur
2424
private static boolean eventsBuffered = true;
2525
private static final Queue<PerformanceEntry> markBuffer = new ConcurrentLinkedQueue<>();
2626
private static boolean didEmit = false;
27-
private final ReactMarker.MarkerListener markerListener = (name, tag, instanceKey) -> {
27+
28+
private static final ReactMarker.MarkerListener startupMarkerListener = (name, tag, instanceKey) -> {
29+
switch (name) {
30+
case RELOAD:
31+
clearMarkBuffer();
32+
addMark(new PerformanceMark(BRIDGE_SETUP_START, SystemClock.uptimeMillis()));
33+
break;
34+
case ATTACH_MEASURED_ROOT_VIEWS_END:
35+
case ATTACH_MEASURED_ROOT_VIEWS_START:
36+
case BUILD_NATIVE_MODULE_REGISTRY_END:
37+
case BUILD_NATIVE_MODULE_REGISTRY_START:
38+
case CONTENT_APPEARED:
39+
case CREATE_CATALYST_INSTANCE_END:
40+
case CREATE_CATALYST_INSTANCE_START:
41+
case CREATE_REACT_CONTEXT_END:
42+
case CREATE_REACT_CONTEXT_START:
43+
case CREATE_UI_MANAGER_MODULE_CONSTANTS_END:
44+
case CREATE_UI_MANAGER_MODULE_CONSTANTS_START:
45+
case CREATE_UI_MANAGER_MODULE_END:
46+
case CREATE_UI_MANAGER_MODULE_START:
47+
case CREATE_VIEW_MANAGERS_END:
48+
case CREATE_VIEW_MANAGERS_START:
49+
case DOWNLOAD_END:
50+
case DOWNLOAD_START:
51+
case LOAD_REACT_NATIVE_SO_FILE_END:
52+
case LOAD_REACT_NATIVE_SO_FILE_START:
53+
case PRE_RUN_JS_BUNDLE_START:
54+
case PRE_SETUP_REACT_CONTEXT_END:
55+
case PRE_SETUP_REACT_CONTEXT_START:
56+
case PROCESS_CORE_REACT_PACKAGE_END:
57+
case PROCESS_CORE_REACT_PACKAGE_START:
58+
case REACT_CONTEXT_THREAD_END:
59+
case REACT_CONTEXT_THREAD_START:
60+
case RUN_JS_BUNDLE_END:
61+
case RUN_JS_BUNDLE_START:
62+
case SETUP_REACT_CONTEXT_END:
63+
case SETUP_REACT_CONTEXT_START:
64+
case VM_INIT:
65+
long startTime = SystemClock.uptimeMillis();
66+
addMark(new PerformanceMark(getMarkName(name), startTime));
67+
break;
68+
}
69+
};
70+
71+
private final ReactMarker.MarkerListener contentAppearedListener = (name, tag, instanceKey) -> {
2872
switch (name) {
2973
case CONTENT_APPEARED:
3074
eventsBuffered = false;
@@ -43,58 +87,26 @@ public PerformanceModule(@NonNull final ReactApplicationContext reactContext) {
4387
setupNativeMarkerListener();
4488
}
4589

90+
private void setupMarkerListener() {
91+
ReactMarker.addListener(
92+
contentAppearedListener
93+
);
94+
}
95+
4696
private void setupNativeMarkerListener() {
4797
RNPerformance.getInstance().addListener(this);
4898
}
4999

50100
// Need to set up the marker listener before the react module is initialized
51101
// to capture all events
52102
public static void setupListener() {
53-
ReactMarker.addListener(
54-
(name, tag, instanceKey) -> {
55-
switch (name) {
56-
case RELOAD:
57-
clearMarkBuffer();
58-
addMark(new PerformanceMark(BRIDGE_SETUP_START, SystemClock.uptimeMillis()));
59-
break;
60-
case ATTACH_MEASURED_ROOT_VIEWS_END:
61-
case ATTACH_MEASURED_ROOT_VIEWS_START:
62-
case BUILD_NATIVE_MODULE_REGISTRY_END:
63-
case BUILD_NATIVE_MODULE_REGISTRY_START:
64-
case CONTENT_APPEARED:
65-
case CREATE_CATALYST_INSTANCE_END:
66-
case CREATE_CATALYST_INSTANCE_START:
67-
case CREATE_REACT_CONTEXT_END:
68-
case CREATE_REACT_CONTEXT_START:
69-
case CREATE_UI_MANAGER_MODULE_CONSTANTS_END:
70-
case CREATE_UI_MANAGER_MODULE_CONSTANTS_START:
71-
case CREATE_UI_MANAGER_MODULE_END:
72-
case CREATE_UI_MANAGER_MODULE_START:
73-
case CREATE_VIEW_MANAGERS_END:
74-
case CREATE_VIEW_MANAGERS_START:
75-
case DOWNLOAD_END:
76-
case DOWNLOAD_START:
77-
case LOAD_REACT_NATIVE_SO_FILE_END:
78-
case LOAD_REACT_NATIVE_SO_FILE_START:
79-
case PRE_RUN_JS_BUNDLE_START:
80-
case PRE_SETUP_REACT_CONTEXT_END:
81-
case PRE_SETUP_REACT_CONTEXT_START:
82-
case PROCESS_CORE_REACT_PACKAGE_END:
83-
case PROCESS_CORE_REACT_PACKAGE_START:
84-
case REACT_CONTEXT_THREAD_END:
85-
case REACT_CONTEXT_THREAD_START:
86-
case RUN_JS_BUNDLE_END:
87-
case RUN_JS_BUNDLE_START:
88-
case SETUP_REACT_CONTEXT_END:
89-
case SETUP_REACT_CONTEXT_START:
90-
case VM_INIT:
91-
long startTime = SystemClock.uptimeMillis();
92-
addMark(new PerformanceMark(getMarkName(name), startTime));
93-
break;
94-
95-
}
96-
}
97-
);
103+
ReactMarker.addListener(startupMarkerListener);
104+
}
105+
106+
public static void cleanup() {
107+
markBuffer.clear();
108+
eventsBuffered = true;
109+
didEmit = false;
98110
}
99111

100112
private static void clearMarkBuffer() {
@@ -145,12 +157,6 @@ private void emitNativeStartupTime() {
145157
safelyEmitMark(new PerformanceMark("nativeLaunchEnd", StartTimeProvider.getEndTime()));
146158
}
147159

148-
private void setupMarkerListener() {
149-
ReactMarker.addListener(
150-
markerListener
151-
);
152-
}
153-
154160
private void safelyEmitMark(PerformanceEntry entry) {
155161
if (eventsBuffered) {
156162
addMark(entry);
@@ -229,6 +235,6 @@ public void logMarker(PerformanceEntry entry) {
229235
public void invalidate() {
230236
super.invalidate();
231237
RNPerformance.getInstance().removeListener(this);
232-
ReactMarker.removeListener(markerListener);
238+
ReactMarker.removeListener(contentAppearedListener);
233239
}
234240
}

0 commit comments

Comments
 (0)