diff --git a/src/main/java/io/netty/buffer/api/NativeMemoryCleanerDrop.java b/src/main/java/io/netty/buffer/api/NativeMemoryCleanerDrop.java index 5e448d2..68c4c1f 100644 --- a/src/main/java/io/netty/buffer/api/NativeMemoryCleanerDrop.java +++ b/src/main/java/io/netty/buffer/api/NativeMemoryCleanerDrop.java @@ -61,9 +61,9 @@ class NativeMemoryCleanerDrop implements Drop { var mem = manager.unwrapRecoverableMemory(buf); var delegate = this.delegate; WeakReference ref = new WeakReference<>(buf); - AtomicBoolean gate = new AtomicBoolean(); + AtomicBoolean gate = new AtomicBoolean(true); cleanable = new GatedCleanable(gate, CLEANER.register(this, () -> { - if (gate.compareAndSet(false, true)) { + if (gate.getAndSet(false)) { Buf b = ref.get(); if (b == null) { pool.recoverMemory(mem); @@ -84,7 +84,7 @@ class NativeMemoryCleanerDrop implements Drop { } public void disable() { - gate.set(true); + gate.set(false); } @Override diff --git a/src/main/java/io/netty/buffer/api/SizeClassedMemoryPool.java b/src/main/java/io/netty/buffer/api/SizeClassedMemoryPool.java index b015064..dc547e1 100644 --- a/src/main/java/io/netty/buffer/api/SizeClassedMemoryPool.java +++ b/src/main/java/io/netty/buffer/api/SizeClassedMemoryPool.java @@ -70,7 +70,7 @@ class SizeClassedMemoryPool implements Allocator, AllocatorControl, Drop { Send send; while ((send = v.poll()) != null) { try { - dispose(send.receive()); + send.receive().close(); } catch (Exception e) { capturedExceptions.add(e); } @@ -86,12 +86,16 @@ class SizeClassedMemoryPool implements Allocator, AllocatorControl, Drop { @Override public void drop(Buf buf) { + if (closed) { + dispose(buf); + return; + } var sizeClassPool = getSizeClassPool(buf.capacity()); sizeClassPool.offer(buf.send()); if (closed) { Send send; while ((send = sizeClassPool.poll()) != null) { - dispose(send.receive()); + send.receive().close(); } } }