55
66package io .opentelemetry .sdk .trace .internal ;
77
8- import java .util .Objects ;
9- import java .util .Optional ;
108import java .util .Queue ;
11- import java .util .concurrent .atomic .AtomicBoolean ;
129import java .util .function .Consumer ;
13- import java .util .logging .Level ;
14- import java .util .logging .Logger ;
1510import org .jctools .queues .MessagePassingQueue ;
16- import org .jctools .queues .MpscArrayQueue ;
1711import org .jctools .queues .atomic .MpscAtomicArrayQueue ;
1812
1913/**
2418 */
2519public final class JcTools {
2620
27- private static final AtomicBoolean queueCreationWarningLogged = new AtomicBoolean ();
28- private static final Logger logger = Logger .getLogger (JcTools .class .getName ());
29- private static final boolean PROACTIVELY_AVOID_UNSAFE = proactivelyAvoidUnsafe ();
30-
3121 /**
3222 * Returns a new {@link Queue} appropriate for use with multiple producers and a single consumer.
3323 */
3424 public static <T > Queue <T > newFixedSizeQueue (int capacity ) {
35- if (PROACTIVELY_AVOID_UNSAFE ) {
36- return new MpscAtomicArrayQueue <>(capacity );
37- }
38- try {
39- return new MpscArrayQueue <>(capacity );
40- } catch (java .lang .NoClassDefFoundError | java .lang .ExceptionInInitializerError e ) {
41- if (!queueCreationWarningLogged .getAndSet (true )) {
42- logger .log (
43- Level .WARNING ,
44- "Cannot create high-performance queue, reverting to ArrayBlockingQueue ({0})" ,
45- Objects .toString (e , "unknown cause" ));
46- }
47- // Happens when modules such as jdk.unsupported are disabled in a custom JRE distribution,
48- // or a security manager preventing access to Unsafe is installed.
49- return new MpscAtomicArrayQueue <>(capacity );
50- }
25+ return new MpscAtomicArrayQueue <>(capacity );
5126 }
5227
5328 /**
@@ -69,24 +44,5 @@ public static <T> int drain(Queue<T> queue, int limit, Consumer<T> consumer) {
6944 return ((MessagePassingQueue <T >) queue ).drain (consumer ::accept , limit );
7045 }
7146
72- private static boolean proactivelyAvoidUnsafe () {
73- Optional <Double > javaVersion = getJavaVersion ();
74- // Avoid Unsafe on Java 23+ due to JEP-498 deprecation warnings:
75- // "WARNING: A terminally deprecated method in sun.misc.Unsafe has been called"
76- return javaVersion .map (version -> version >= 23 ).orElse (true );
77- }
78-
79- private static Optional <Double > getJavaVersion () {
80- String specVersion = System .getProperty ("java.specification.version" );
81- if (specVersion != null ) {
82- try {
83- return Optional .of (Double .parseDouble (specVersion ));
84- } catch (NumberFormatException exception ) {
85- // ignore
86- }
87- }
88- return Optional .empty ();
89- }
90-
9147 private JcTools () {}
9248}
0 commit comments