diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/GZIPContentDecoder.java b/jetty-http/src/main/java/org/eclipse/jetty/http/GZIPContentDecoder.java index 79518f821881..882c06337a2c 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/GZIPContentDecoder.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/GZIPContentDecoder.java @@ -70,6 +70,7 @@ public GZIPContentDecoder(ByteBufferPool pool, int bufferSize) public GZIPContentDecoder(InflaterPool inflaterPool, ByteBufferPool pool, int bufferSize) { _inflaterEntry = inflaterPool.acquire(); + _inflater = _inflaterEntry.get(); _bufferSize = bufferSize; _pool = pool; reset(); diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/compression/CompressionPool.java b/jetty-util/src/main/java/org/eclipse/jetty/util/compression/CompressionPool.java index 80ace49383c8..f0725bf82309 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/compression/CompressionPool.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/compression/CompressionPool.java @@ -56,7 +56,7 @@ public void setCapacity(int capacity) _capacity = capacity; } - protected abstract T newObject(); + protected abstract T newPooled(); protected abstract void end(T object); @@ -70,15 +70,12 @@ public Entry acquire() Entry entry = null; if (_pool != null) { - Pool.Entry acquiredEntry = _pool.acquire(e -> new Entry(newObject())); + Pool.Entry acquiredEntry = _pool.acquire(e -> new Entry(newPooled(), e)); if (acquiredEntry != null) - { entry = acquiredEntry.getPooled(); - entry.setEntry(acquiredEntry); - } } - return (entry == null) ? new Entry(newObject()) : entry; + return (entry == null) ? new Entry(newPooled()) : entry; } /** @@ -107,17 +104,20 @@ public void doStop() throws Exception public class Entry implements Closeable { - private T _value; - private Pool.Entry _entry; + private final T _value; + private final Pool.Entry _entry; Entry(T value) { - _value = value; - _entry = null; + this(value, null); } - void setEntry(Pool.Entry entry) + Entry(T value, Pool.Entry entry) { + if (entry != null && entry.getPooled() != value) + throw new IllegalArgumentException("value does not match pooled entry"); + + _value = value; _entry = entry; } @@ -139,8 +139,6 @@ public void release() if (_pool.remove(_entry)) close(); } - - _entry = null; } } @@ -148,8 +146,6 @@ public void release() public void close() { end(_value); - _value = null; - _entry = null; } } diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/compression/DeflaterPool.java b/jetty-util/src/main/java/org/eclipse/jetty/util/compression/DeflaterPool.java index 7fbcc0d1bcb5..ebd3eec2f80e 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/compression/DeflaterPool.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/compression/DeflaterPool.java @@ -44,7 +44,7 @@ public DeflaterPool(int capacity, int compressionLevel, boolean nowrap) } @Override - protected Deflater newObject() + protected Deflater newPooled() { return new Deflater(compressionLevel, nowrap); } diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/compression/InflaterPool.java b/jetty-util/src/main/java/org/eclipse/jetty/util/compression/InflaterPool.java index c74b8388386e..a41e1f933c92 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/compression/InflaterPool.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/compression/InflaterPool.java @@ -41,7 +41,7 @@ public InflaterPool(int capacity, boolean nowrap) } @Override - protected Inflater newObject() + protected Inflater newPooled() { return new Inflater(nowrap); } diff --git a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/PerMessageDeflateExtension.java b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/PerMessageDeflateExtension.java index 66193b5f3450..55f5ead57378 100644 --- a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/PerMessageDeflateExtension.java +++ b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/PerMessageDeflateExtension.java @@ -54,8 +54,8 @@ public class PerMessageDeflateExtension extends AbstractExtension private final TransformingFlusher outgoingFlusher; private final TransformingFlusher incomingFlusher; - private DeflaterPool.Entry deflaterEntry; - private InflaterPool.Entry inflaterEntry; + private DeflaterPool.Entry deflaterHolder; + private InflaterPool.Entry inflaterHolder; private boolean incomingCompressed; private ExtensionConfig configRequested; @@ -180,28 +180,34 @@ public static boolean endsWithTail(ByteBuffer buf) public Deflater getDeflater() { - if (deflaterEntry == null) - deflaterEntry = getDeflaterPool().acquire(); - return deflaterEntry.get(); + if (deflaterHolder == null) + deflaterHolder = getDeflaterPool().acquire(); + return deflaterHolder.get(); } public Inflater getInflater() { - if (inflaterEntry == null) - inflaterEntry = getInflaterPool().acquire(); - return inflaterEntry.get(); + if (inflaterHolder == null) + inflaterHolder = getInflaterPool().acquire(); + return inflaterHolder.get(); } public void releaseInflater() { - inflaterEntry.release(); - inflaterEntry = null; + if (inflaterHolder != null) + { + inflaterHolder.release(); + inflaterHolder = null; + } } public void releaseDeflater() { - deflaterEntry.release(); - deflaterEntry = null; + if (deflaterHolder != null) + { + deflaterHolder.release(); + deflaterHolder = null; + } } @Override