Skip to content

Commit 451d123

Browse files
authored
Merge pull request #1989 from jponge/fix/1988
fix: memory leak in UniMemoizeOp
2 parents 7ca931d + 8c94ac3 commit 451d123

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

implementation/src/main/java/io/smallrye/mutiny/operators/uni/UniMemoizeOp.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import static io.smallrye.mutiny.helpers.ParameterValidation.nonNull;
44

55
import java.util.ArrayList;
6+
import java.util.Iterator;
67
import java.util.List;
7-
import java.util.concurrent.ConcurrentLinkedQueue;
88
import java.util.concurrent.locks.ReentrantLock;
99
import java.util.function.BooleanSupplier;
1010

@@ -33,7 +33,7 @@ private enum State {
3333

3434
private final ReentrantLock internalLock = new ReentrantLock();
3535

36-
private final ConcurrentLinkedQueue<UniSubscriber<? super I>> awaiters = new ConcurrentLinkedQueue<>();
36+
private final List<UniSubscriber<? super I>> awaiters = new ArrayList<>();
3737

3838
private Object cachedResult = null;
3939

@@ -118,12 +118,17 @@ public void onItem(I item) {
118118
}
119119

120120
private List<UniSubscriber<? super I>> gatherAwaiters() {
121-
return new ArrayList<>(awaiters);
121+
ArrayList<UniSubscriber<? super I>> copy = new ArrayList<>(awaiters);
122+
awaiters.clear();
123+
return copy;
122124
}
123125

124126
private void notifyAwaiters(List<UniSubscriber<? super I>> toNotify, Object result) {
125-
for (UniSubscriber<? super I> awaiter : toNotify) {
127+
Iterator<UniSubscriber<? super I>> iterator = toNotify.iterator();
128+
while (iterator.hasNext()) {
129+
UniSubscriber<? super I> awaiter = iterator.next();
126130
forwardTo(awaiter, result);
131+
iterator.remove();
127132
}
128133
}
129134

@@ -166,7 +171,12 @@ private class MemoizedSubscription implements UniSubscription {
166171

167172
@Override
168173
public void cancel() {
169-
awaiters.remove(subscriber);
174+
internalLock.lock();
175+
try {
176+
awaiters.remove(subscriber);
177+
} finally {
178+
internalLock.unlock();
179+
}
170180
}
171181
}
172182
}

0 commit comments

Comments
 (0)