Details
-
Bug
-
Resolution: Done
-
Major
-
3.3.0.Final
-
None
Description
ThreadLocalCache.finalizer is trying to remove a thread local:
https://github.com/xnio/xnio/blob/4ce5eacbab141694377f844f37ba221e49a34a45/api/src/main/java/org/xnio/ByteBufferSlicePool.java#L264
However, finalize method is invoked in another thread, so there is no much sense in calling {[threadLocal.remove}} from finalize.
Was it really intended that .remove would result in initialValue?
Here's a thread stack of the offending finalizer:
Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007f4b101d2800 nid=0x9c03 runnable [0x00007f4afbffe000] java.lang.Thread.State: RUNNABLE at java.lang.Object.<init>(Object.java:37) at java.util.AbstractCollection.<init>(AbstractCollection.java:66) at java.util.ArrayDeque.<init>(ArrayDeque.java:197) at org.xnio.ByteBufferSlicePool$ThreadLocalCache$1.<init>(ByteBufferSlicePool.java:250) at org.xnio.ByteBufferSlicePool$ThreadLocalCache.<init>(ByteBufferSlicePool.java:250) at org.xnio.ByteBufferSlicePool$ThreadLocalCache.<init>(ByteBufferSlicePool.java:246) at org.xnio.ByteBufferSlicePool$1.initialValue(ByteBufferSlicePool.java:64) at org.xnio.ByteBufferSlicePool$1.initialValue(ByteBufferSlicePool.java:61) at java.lang.ThreadLocal.setInitialValue(ThreadLocal.java:180) at java.lang.ThreadLocal.get(ThreadLocal.java:170) at org.xnio.ByteBufferSlicePool$1.remove(ByteBufferSlicePool.java:68) at org.xnio.ByteBufferSlicePool$ThreadLocalCache$1.finalize(ByteBufferSlicePool.java:256) at java.lang.System$2.invokeFinalize(System.java:1270) at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:98) at java.lang.ref.Finalizer.access$100(Finalizer.java:34) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)