Skip to content

Commit 5fac28f

Browse files
ensure that object is referenceable past the enqueue point
1 parent 9002b63 commit 5fac28f

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

src/com/sun/jna/internal/Cleaner.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,28 @@ private Cleaner() {
5555
referenceQueue = new ReferenceQueue<>();
5656
}
5757

58-
public synchronized Cleanable register(final Object obj, final Runnable cleanupTask) {
58+
public Cleanable register(final Object obj, final Runnable cleanupTask) {
5959
// The important side effect is the PhantomReference, that is yielded after the referent is GCed
6060
final CleanerRef ref = new CleanerRef(obj, referenceQueue, cleanupTask);
6161

62-
if (firstCleanable != null) {
63-
ref.setNext(firstCleanable);
64-
firstCleanable.setPrevious(ref);
62+
synchronized (this) {
63+
if (firstCleanable != null) {
64+
ref.setNext(firstCleanable);
65+
firstCleanable.setPrevious(ref);
66+
}
67+
firstCleanable = ref;
68+
69+
if (!cleanerRunning) {
70+
logger.log(Level.FINE, "Starting CleanerThread");
71+
Thread cleanerThread = new CleanerThread();
72+
cleanerThread.start();
73+
cleanerRunning = true;
74+
}
6575
}
66-
firstCleanable = ref;
6776

68-
if (!cleanerRunning) {
69-
logger.log(Level.FINE, "Starting CleanerThread");
70-
Thread cleanerThread = new CleanerThread();
71-
cleanerThread.start();
72-
cleanerRunning = true;
77+
// Ensure that obj is referencable past the enqueue point.
78+
if (obj == null) {
79+
throw new IllegalArgumentException("Cleaner object cannot be null");
7380
}
7481

7582
return ref;

0 commit comments

Comments
 (0)