Skip to content

Commit cdd3462

Browse files
committed
Add reference counting for UndertowDataBuffer
This commit adds proper reference counting to the UndertowDataBuffer.
1 parent ecc165a commit cdd3462

File tree

1 file changed

+47
-20
lines changed

1 file changed

+47
-20
lines changed

spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpRequest.java

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.net.URISyntaxException;
2525
import java.nio.ByteBuffer;
2626
import java.nio.charset.Charset;
27+
import java.util.concurrent.atomic.AtomicInteger;
2728
import java.util.function.IntPredicate;
2829
import javax.net.ssl.SSLSession;
2930

@@ -211,31 +212,45 @@ private static class UndertowDataBuffer implements PooledDataBuffer {
211212

212213
private final PooledByteBuffer pooledByteBuffer;
213214

215+
private final AtomicInteger refCount;
216+
214217
public UndertowDataBuffer(DataBuffer dataBuffer, PooledByteBuffer pooledByteBuffer) {
215218
this.dataBuffer = dataBuffer;
216219
this.pooledByteBuffer = pooledByteBuffer;
220+
this.refCount = new AtomicInteger(1);
221+
}
222+
223+
private UndertowDataBuffer(DataBuffer dataBuffer, PooledByteBuffer pooledByteBuffer,
224+
AtomicInteger refCount) {
225+
this.refCount = refCount;
226+
this.dataBuffer = dataBuffer;
227+
this.pooledByteBuffer = pooledByteBuffer;
217228
}
218229

219230
@Override
220231
public boolean isAllocated() {
221-
return this.pooledByteBuffer.isOpen();
232+
return this.refCount.get() > 0;
222233
}
223234

224235
@Override
225236
public PooledDataBuffer retain() {
237+
this.refCount.incrementAndGet();
238+
DataBufferUtils.retain(this.dataBuffer);
226239
return this;
227240
}
228241

229242
@Override
230243
public boolean release() {
231-
boolean result;
232-
try {
233-
result = DataBufferUtils.release(this.dataBuffer);
234-
}
235-
finally {
236-
this.pooledByteBuffer.close();
244+
int refCount = this.refCount.decrementAndGet();
245+
if (refCount == 0) {
246+
try {
247+
return DataBufferUtils.release(this.dataBuffer);
248+
}
249+
finally {
250+
this.pooledByteBuffer.close();
251+
}
237252
}
238-
return result && this.pooledByteBuffer.isOpen();
253+
return false;
239254
}
240255

241256
@Override
@@ -280,7 +295,8 @@ public int writePosition() {
280295

281296
@Override
282297
public DataBuffer writePosition(int writePosition) {
283-
return this.dataBuffer.writePosition(writePosition);
298+
this.dataBuffer.writePosition(writePosition);
299+
return this;
284300
}
285301

286302
@Override
@@ -290,12 +306,14 @@ public int capacity() {
290306

291307
@Override
292308
public DataBuffer capacity(int newCapacity) {
293-
return this.dataBuffer.capacity(newCapacity);
309+
this.dataBuffer.capacity(newCapacity);
310+
return this;
294311
}
295312

296313
@Override
297314
public DataBuffer ensureCapacity(int capacity) {
298-
return this.dataBuffer.ensureCapacity(capacity);
315+
this.dataBuffer.ensureCapacity(capacity);
316+
return this;
299317
}
300318

301319
@Override
@@ -310,47 +328,56 @@ public byte read() {
310328

311329
@Override
312330
public DataBuffer read(byte[] destination) {
313-
return this.dataBuffer.read(destination);
331+
this.dataBuffer.read(destination);
332+
return this;
314333
}
315334

316335
@Override
317336
public DataBuffer read(byte[] destination, int offset, int length) {
318-
return this.dataBuffer.read(destination, offset, length);
337+
this.dataBuffer.read(destination, offset, length);
338+
return this;
319339
}
320340

321341
@Override
322342
public DataBuffer write(byte b) {
323-
return this.dataBuffer.write(b);
343+
this.dataBuffer.write(b);
344+
return this;
324345
}
325346

326347
@Override
327348
public DataBuffer write(byte[] source) {
328-
return this.dataBuffer.write(source);
349+
this.dataBuffer.write(source);
350+
return this;
329351
}
330352

331353
@Override
332354
public DataBuffer write(byte[] source, int offset, int length) {
333-
return this.dataBuffer.write(source, offset, length);
355+
this.dataBuffer.write(source, offset, length);
356+
return this;
334357
}
335358

336359
@Override
337360
public DataBuffer write(DataBuffer... buffers) {
338-
return this.dataBuffer.write(buffers);
361+
this.dataBuffer.write(buffers);
362+
return this;
339363
}
340364

341365
@Override
342366
public DataBuffer write(ByteBuffer... byteBuffers) {
343-
return this.dataBuffer.write(byteBuffers);
367+
this.dataBuffer.write(byteBuffers);
368+
return this;
344369
}
345370

346371
@Override
347372
public DataBuffer write(CharSequence charSequence, Charset charset) {
348-
return this.dataBuffer.write(charSequence, charset);
373+
this.dataBuffer.write(charSequence, charset);
374+
return this;
349375
}
350376

351377
@Override
352378
public DataBuffer slice(int index, int length) {
353-
return this.dataBuffer.slice(index, length);
379+
DataBuffer slice = this.dataBuffer.slice(index, length);
380+
return new UndertowDataBuffer(slice, this.pooledByteBuffer, this.refCount);
354381
}
355382

356383
@Override

0 commit comments

Comments
 (0)