Skip to content

Commit d178a74

Browse files
committed
Allow reaper threads to be started at run time
1 parent 01324fc commit d178a74

5 files changed

Lines changed: 41 additions & 15 deletions

File tree

ref/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717
<groupId>${project.groupId}</groupId>
1818
<artifactId>smallrye-common-constraint</artifactId>
1919
</dependency>
20+
<dependency>
21+
<groupId>org.graalvm.sdk</groupId>
22+
<artifactId>graal-sdk</artifactId>
23+
</dependency>
2024
</dependencies>
2125

2226
<build>

ref/src/main/java/io/smallrye/common/ref/PhantomReference.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public PhantomReference(final T referent, final A attachment, final ReferenceQue
3636
* @param reaper the reaper to use
3737
*/
3838
public PhantomReference(final T referent, final A attachment, final Reaper<T, A> reaper) {
39-
super(referent, References.ReaperThread.REAPER_QUEUE);
39+
super(referent, References.ReaperThread.getReaperQueue());
4040
this.reaper = reaper;
4141
this.attachment = attachment;
4242
}

ref/src/main/java/io/smallrye/common/ref/References.java

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import java.security.PrivilegedAction;
77
import java.util.concurrent.atomic.AtomicInteger;
88

9+
import org.graalvm.nativeimage.ImageInfo;
10+
911
import io.smallrye.common.constraint.Assert;
1012

1113
/**
@@ -17,27 +19,47 @@ private References() {
1719

1820
private static final Reference<?, ?> NULL = new StrongReference<>(null);
1921

20-
static final class ReaperThread extends Thread {
22+
static final class BuildTimeHolder {
2123
static final ReferenceQueue<Object> REAPER_QUEUE = new ReferenceQueue<Object>();
24+
}
25+
26+
static final class ReaperThread extends Thread {
27+
static ReferenceQueue<Object> getReaperQueue() {
28+
return BuildTimeHolder.REAPER_QUEUE;
29+
}
2230

2331
static {
24-
final AtomicInteger cnt = new AtomicInteger(1);
25-
final PrivilegedAction<Void> action = () -> {
26-
final ReaperThread thr = new ReaperThread();
27-
thr.setName("Reference Reaper #" + cnt.getAndIncrement());
28-
thr.setDaemon(true);
29-
thr.start();
30-
return null;
31-
};
32-
for (int i = 0; i < 3; i++) {
33-
doPrivileged(action);
32+
if (isBuildTime()) {
33+
// do nothing (class should be reinitialized)
34+
} else {
35+
final AtomicInteger cnt = new AtomicInteger(1);
36+
final PrivilegedAction<Void> action = () -> startThreadAction(cnt.getAndIncrement());
37+
for (int i = 0; i < 3; i++) {
38+
doPrivileged(action);
39+
}
40+
}
41+
}
42+
43+
private static boolean isBuildTime() {
44+
try {
45+
return ImageInfo.inImageBuildtimeCode();
46+
} catch (Throwable ignored) {
47+
return false;
3448
}
3549
}
3650

51+
private static Void startThreadAction(int id) {
52+
final ReaperThread thr = new ReaperThread();
53+
thr.setName("Reference Reaper #" + id);
54+
thr.setDaemon(true);
55+
thr.start();
56+
return null;
57+
}
58+
3759
public void run() {
3860
for (;;)
3961
try {
40-
final java.lang.ref.Reference<?> ref = REAPER_QUEUE.remove();
62+
final java.lang.ref.Reference<?> ref = ReaperThread.getReaperQueue().remove();
4163
if (ref instanceof CleanerReference) {
4264
((CleanerReference<?, ?>) ref).clean();
4365
}

ref/src/main/java/io/smallrye/common/ref/SoftReference.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public SoftReference(final T referent, final A attachment, final ReferenceQueue<
5555
* @param reaper the reaper to use
5656
*/
5757
public SoftReference(final T referent, final A attachment, final Reaper<T, A> reaper) {
58-
super(referent, References.ReaperThread.REAPER_QUEUE);
58+
super(referent, References.ReaperThread.getReaperQueue());
5959
this.reaper = reaper;
6060
this.attachment = attachment;
6161
}

ref/src/main/java/io/smallrye/common/ref/WeakReference.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public WeakReference(final T referent, final A attachment, final ReferenceQueue<
5555
* @param reaper the reaper to use
5656
*/
5757
public WeakReference(final T referent, final A attachment, final Reaper<T, A> reaper) {
58-
super(referent, References.ReaperThread.REAPER_QUEUE);
58+
super(referent, References.ReaperThread.getReaperQueue());
5959
this.attachment = attachment;
6060
this.reaper = reaper;
6161
}

0 commit comments

Comments
 (0)