42
42
* <p><strong>This class is intended to be used only be JNA itself.</strong></p>
43
43
*/
44
44
public class Cleaner {
45
+ private static final Logger LOG = Logger .getLogger (Cleaner .class .getName ());
46
+
45
47
/* General idea:
46
48
*
47
49
* There's one Cleaner per thread, kept in a ThreadLocal static variable.
@@ -158,7 +160,9 @@ private MasterCleaner() {
158
160
Logger .getLogger (Cleaner .class .getName ()).log (Level .SEVERE , null , ex );
159
161
}
160
162
}
163
+ LOG .log (Level .FINE , "MasterCleaner thread {0} exiting" , Thread .currentThread ());
161
164
}, "JNA Cleaner" );
165
+ LOG .log (Level .FINE , "Starting new MasterCleaner thread {0}" , cleanerThread );
162
166
cleanerThread .setDaemon (true );
163
167
cleanerThread .start ();
164
168
}
@@ -173,9 +177,13 @@ private void masterCleanup() {
173
177
|| !entry .getKey ().isAlive ()) { // owning thread died -> assume it is no longer in use
174
178
it .remove ();
175
179
CleanerImpl impl = cleaner .impl ;
180
+ LOG .log (Level .FINE , () -> "MasterCleaner stealing cleaner " + impl + " from thread " + entry .getKey ());
176
181
referencedCleaners .add (impl );
177
182
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
+ });
179
187
cleaners .remove (cleaner );
180
188
} else {
181
189
cleaner .lastCount = currentCount ;
@@ -186,7 +194,10 @@ private void masterCleanup() {
186
194
CleanerImpl impl = it .next ();
187
195
impl .cleanQueue ();
188
196
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
+ }
190
201
}
191
202
}
192
203
}
@@ -213,6 +224,8 @@ private Cleaner(Thread owner) {
213
224
if (owner != null ) {
214
225
MasterCleaner .add (this );
215
226
}
227
+ LOG .log (Level .FINE , () -> owner == null ? "Created new MasterCleaner"
228
+ : "Created new Cleaner " + impl + " for thread " + owner );
216
229
}
217
230
218
231
public Cleanable register (Object obj , Runnable cleanupTask ) {
@@ -229,6 +242,7 @@ private static class CleanerRef extends PhantomReference<Object> implements Clea
229
242
230
243
public CleanerRef (CleanerImpl impl , Object referent , ReferenceQueue <Object > q , Runnable cleanupTask ) {
231
244
super (referent , q );
245
+ LOG .log (Level .FINER , () -> "Registering " + referent + " with " + impl + " as " + this );
232
246
this .cleaner = impl ;
233
247
this .cleanupTask = cleanupTask ;
234
248
cleaner .put (number , this );
@@ -237,6 +251,7 @@ public CleanerRef(CleanerImpl impl, Object referent, ReferenceQueue<Object> q, R
237
251
@ Override
238
252
public void clean () {
239
253
if (cleaner .remove (this .number ) && cleanupTask != null ) {
254
+ LOG .log (Level .FINER , "Cleaning up {0}" , this );
240
255
cleanupTask .run ();
241
256
cleanupTask = null ;
242
257
}
0 commit comments