Skip to content

Commit 1cc1e33

Browse files
committed
Avoid deadlock between SseEventSinkImpl and SseBroadcasterImpl
Fixes: #51033
1 parent 7e5adfb commit 1cc1e33

File tree

1 file changed

+7
-6
lines changed
  • independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/jaxrs

1 file changed

+7
-6
lines changed

independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/jaxrs/SseEventSinkImpl.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.Collections;
44
import java.util.concurrent.CompletionStage;
5+
import java.util.concurrent.atomic.AtomicBoolean;
56
import java.util.function.Consumer;
67

78
import jakarta.ws.rs.sse.OutboundSseEvent;
@@ -16,15 +17,15 @@ public class SseEventSinkImpl implements SseEventSink {
1617
public static final byte[] EMPTY_BUFFER = new byte[0];
1718
private ResteasyReactiveRequestContext context;
1819
private SseBroadcasterImpl broadcaster;
19-
private boolean closed;
20+
private AtomicBoolean closed = new AtomicBoolean();
2021

2122
public SseEventSinkImpl(ResteasyReactiveRequestContext context) {
2223
this.context = context;
2324
}
2425

2526
@Override
26-
public synchronized boolean isClosed() {
27-
return context.serverResponse().closed() || closed;
27+
public boolean isClosed() {
28+
return context.serverResponse().closed() || closed.get();
2829
}
2930

3031
@Override
@@ -36,10 +37,10 @@ public CompletionStage<?> send(OutboundSseEvent event) {
3637
}
3738

3839
@Override
39-
public synchronized void close() {
40-
if (closed)
40+
public void close() {
41+
if (!closed.compareAndSet(false, true))
4142
return;
42-
closed = true;
43+
4344
ServerHttpResponse response = context.serverResponse();
4445
if (!response.closed()) {
4546
if (!response.headWritten()) {

0 commit comments

Comments
 (0)