Merge pull request #15 from netty/fix-drop-gate
Fix drop race with Cleaner
This commit is contained in:
commit
e8a38185bb
@ -61,9 +61,9 @@ class NativeMemoryCleanerDrop implements Drop<Buf> {
|
||||
var mem = manager.unwrapRecoverableMemory(buf);
|
||||
var delegate = this.delegate;
|
||||
WeakReference<Buf> 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<Buf> {
|
||||
}
|
||||
|
||||
public void disable() {
|
||||
gate.set(true);
|
||||
gate.set(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -70,7 +70,7 @@ class SizeClassedMemoryPool implements Allocator, AllocatorControl, Drop<Buf> {
|
||||
Send<Buf> 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<Buf> {
|
||||
|
||||
@Override
|
||||
public void drop(Buf buf) {
|
||||
if (closed) {
|
||||
dispose(buf);
|
||||
return;
|
||||
}
|
||||
var sizeClassPool = getSizeClassPool(buf.capacity());
|
||||
sizeClassPool.offer(buf.send());
|
||||
if (closed) {
|
||||
Send<Buf> send;
|
||||
while ((send = sizeClassPool.poll()) != null) {
|
||||
dispose(send.receive());
|
||||
send.receive().close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user