Skip to content

Commit c6b45d0

Browse files
author
Vivek Varun
committed
Fix ConcurrentModificationException while calling emitBufferedMarks in Android
1 parent 15b9253 commit c6b45d0

File tree

2 files changed

+28
-28
lines changed

2 files changed

+28
-28
lines changed

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.facebook.react.turbomodule.core.interfaces.TurboModule;
1515

1616
import java.util.ArrayList;
17+
import java.util.Iterator;
1718
import java.util.List;
1819

1920
// Should extend NativeRNPerformanceManagerSpec when codegen for old architecture is solved
@@ -88,13 +89,11 @@ public static void setupListener() {
8889
private static void clearMarkBuffer() {
8990
RNPerformance.getInstance().clearEphermalEntries();
9091

91-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
92-
markBuffer.removeIf(PerformanceEntry::isEphemeral);
93-
} else {
94-
for (PerformanceEntry entry : markBuffer) {
95-
if (entry.isEphemeral()) {
96-
markBuffer.remove(entry);
97-
}
92+
Iterator<PerformanceEntry> iterator = markBuffer.iterator();
93+
if (iterator.hasNext()) {
94+
PerformanceEntry entry = iterator.next();
95+
if(entry.isEphemeral()) {
96+
iterator.remove();
9897
}
9998
}
10099
}
@@ -156,15 +155,17 @@ private static void addMark(PerformanceEntry entry) {
156155

157156
private void emitBufferedMarks() {
158157
didEmit = true;
159-
for (PerformanceEntry entry : markBuffer) {
160-
emitMark(entry);
158+
Iterator<PerformanceEntry> iterator = markBuffer.iterator();
159+
if (iterator.hasNext()) {
160+
emitMark(iterator.next());
161161
}
162162
emitNativeBufferedMarks();
163163
}
164164

165165
private void emitNativeBufferedMarks() {
166-
for (PerformanceEntry entry : RNPerformance.getInstance().getEntries()) {
167-
emitMark(entry);
166+
Iterator<PerformanceEntry> iterator = RNPerformance.getInstance().getEntries().iterator();
167+
if (iterator.hasNext()) {
168+
emitMark(iterator.next());
168169
}
169170
}
170171

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

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.oblador.performance;
22

3-
import android.os.Build;
43
import android.os.Bundle;
54

65
import androidx.annotation.NonNull;
6+
77
import com.facebook.proguard.annotations.DoNotStrip;
88

9+
import java.util.ArrayList;
10+
import java.util.Iterator;
911
import java.util.List;
1012
import java.util.concurrent.CopyOnWriteArrayList;
1113

@@ -28,7 +30,7 @@ interface MarkerListener {
2830
}
2931

3032
private static final List<MarkerListener> sListeners = new CopyOnWriteArrayList<>();
31-
private final List<PerformanceEntry> entries = new CopyOnWriteArrayList<>();
33+
private final List<PerformanceEntry> entries = new ArrayList<>();
3234

3335
@DoNotStrip
3436
protected void addListener(MarkerListener listener) {
@@ -105,7 +107,8 @@ private void emitMark(@NonNull PerformanceEntry entry) {
105107
}
106108
}
107109

108-
protected @NonNull List<PerformanceEntry> getEntries() {
110+
protected @NonNull
111+
List<PerformanceEntry> getEntries() {
109112
return entries;
110113
}
111114

@@ -114,13 +117,11 @@ protected void clearEntries() {
114117
}
115118

116119
protected void clearEntries(String name) {
117-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
118-
entries.removeIf((entry) -> entry.getName().equals(name));
119-
} else {
120-
for (PerformanceEntry entry : entries) {
121-
if (entry.getName().equals(name)) {
122-
entries.remove(entry);
123-
}
120+
Iterator<PerformanceEntry> iterator = entries.iterator();
121+
while (iterator.hasNext()) {
122+
PerformanceEntry entry = iterator.next();
123+
if (entry.getName().equals(name)) {
124+
iterator.remove();
124125
}
125126
}
126127
}
@@ -130,13 +131,11 @@ protected void clearEphermalEntries() {
130131
return;
131132
}
132133

133-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
134-
entries.removeIf(PerformanceEntry::isEphemeral);
135-
} else {
136-
for (PerformanceEntry entry : entries) {
137-
if (entry.isEphemeral()) {
138-
entries.remove(entry);
139-
}
134+
Iterator<PerformanceEntry> iterator = entries.iterator();
135+
while (iterator.hasNext()) {
136+
PerformanceEntry entry = iterator.next();
137+
if (entry.isEphemeral()) {
138+
iterator.remove();
140139
}
141140
}
142141
}

0 commit comments

Comments
 (0)