66import java .security .PrivilegedAction ;
77import java .util .concurrent .atomic .AtomicInteger ;
88
9+ import org .graalvm .nativeimage .ImageInfo ;
10+
911import 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 }
0 commit comments