4242 * <p><strong>This class is intended to be used only be JNA itself.</strong></p>
4343 */
4444public class Cleaner {
45+ private static final Logger LOG = Logger .getLogger (Cleaner .class .getName ());
46+
4547 /* General idea:
4648 *
4749 * There's one Cleaner per thread, kept in a ThreadLocal static variable.
@@ -158,7 +160,9 @@ private MasterCleaner() {
158160 Logger .getLogger (Cleaner .class .getName ()).log (Level .SEVERE , null , ex );
159161 }
160162 }
163+ LOG .log (Level .FINE , "MasterCleaner thread {0} exiting" , Thread .currentThread ());
161164 }, "JNA Cleaner" );
165+ LOG .log (Level .FINE , "Starting new MasterCleaner thread {0}" , cleanerThread );
162166 cleanerThread .setDaemon (true );
163167 cleanerThread .start ();
164168 }
@@ -173,9 +177,13 @@ private void masterCleanup() {
173177 || !entry .getKey ().isAlive ()) { // owning thread died -> assume it is no longer in use
174178 it .remove ();
175179 CleanerImpl impl = cleaner .impl ;
180+ LOG .log (Level .FINE , () -> "MasterCleaner stealing cleaner " + impl + " from thread " + entry .getKey ());
176181 referencedCleaners .add (impl );
177182 watchedCleaners .add (impl );
178- register (cleaner , () -> referencedCleaners .remove (impl ));
183+ register (cleaner , () -> {
184+ referencedCleaners .remove (impl );
185+ LOG .log (Level .FINE , "Cleaner {0} no longer referenced" , impl );
186+ });
179187 cleaners .remove (cleaner );
180188 } else {
181189 cleaner .lastCount = currentCount ;
@@ -186,7 +194,10 @@ private void masterCleanup() {
186194 CleanerImpl impl = it .next ();
187195 impl .cleanQueue ();
188196 if (!referencedCleaners .contains (impl )) {
189- if (impl .cleanables .isEmpty ()) { it .remove (); }
197+ if (impl .cleanables .isEmpty ()) {
198+ it .remove ();
199+ LOG .log (Level .FINE , "Discarding empty Cleaner {0}" , impl );
200+ }
190201 }
191202 }
192203 }
@@ -213,6 +224,8 @@ private Cleaner(Thread owner) {
213224 if (owner != null ) {
214225 MasterCleaner .add (this );
215226 }
227+ LOG .log (Level .FINE , () -> owner == null ? "Created new MasterCleaner"
228+ : "Created new Cleaner " + impl + " for thread " + owner );
216229 }
217230
218231 public Cleanable register (Object obj , Runnable cleanupTask ) {
@@ -229,6 +242,7 @@ private static class CleanerRef extends PhantomReference<Object> implements Clea
229242
230243 public CleanerRef (CleanerImpl impl , Object referent , ReferenceQueue <Object > q , Runnable cleanupTask ) {
231244 super (referent , q );
245+ LOG .log (Level .FINER , () -> "Registering " + referent + " with " + impl + " as " + this );
232246 this .cleaner = impl ;
233247 this .cleanupTask = cleanupTask ;
234248 cleaner .put (number , this );
@@ -237,6 +251,7 @@ public CleanerRef(CleanerImpl impl, Object referent, ReferenceQueue<Object> q, R
237251 @ Override
238252 public void clean () {
239253 if (cleaner .remove (this .number ) && cleanupTask != null ) {
254+ LOG .log (Level .FINER , "Cleaning up {0}" , this );
240255 cleanupTask .run ();
241256 cleanupTask = null ;
242257 }
0 commit comments