2222import net .openhft .affinity .impl .WindowsJNAAffinity ;
2323import org .jetbrains .annotations .NotNull ;
2424
25+ import java .io .PrintWriter ;
26+ import java .io .StringWriter ;
2527import java .lang .reflect .Field ;
2628import java .util .logging .Logger ;
2729
@@ -39,13 +41,13 @@ public enum AffinitySupport {
3941
4042 static {
4143 String osName = System .getProperty ("os.name" );
42- if (osName .contains ("Win" ) && isJNAAvailable () && WindowsJNAAffinity . LOADED ) {
44+ if (osName .contains ("Win" ) && isWindowsJNAAffinityUsable () ) {
4345 LOGGER .fine ("Using Windows JNA-based affinity control implementation" );
4446 AFFINITY_IMPL = WindowsJNAAffinity .INSTANCE ;
45- } else if (osName .contains ("x" ) && isJNAAvailable () && PosixJNAAffinity . LOADED ) {
47+ } else if (osName .contains ("x" ) && isPosixJNAAffinityUsable () ) {
4648 LOGGER .fine ("Using Posix JNA-based affinity control implementation" );
4749 AFFINITY_IMPL = PosixJNAAffinity .INSTANCE ;
48- } else if (osName .contains ("Mac" ) && isJNAAvailable ()) {
50+ } else if (osName .contains ("Mac" ) && isMacJNAAffinityUsable ()) {
4951 LOGGER .fine ("Using MAC OSX JNA-based thread id implementation" );
5052 AFFINITY_IMPL = OSXJNAAffinity .INSTANCE ;
5153 } else {
@@ -54,6 +56,51 @@ public enum AffinitySupport {
5456 }
5557 }
5658
59+ private static boolean isWindowsJNAAffinityUsable () {
60+ if (isJNAAvailable ()) {
61+ try {
62+ return WindowsJNAAffinity .LOADED ;
63+ } catch (Throwable t ) {
64+ logThrowable (t , "Windows JNA-based affinity not usable because it failed to load!" );
65+ return false ;
66+ }
67+ } else {
68+ LOGGER .warning ("Windows JNA-based affinity not usable due to JNA not being available!" );
69+ return false ;
70+ }
71+ }
72+
73+ private static boolean isPosixJNAAffinityUsable () {
74+ if (isJNAAvailable ()) {
75+ try {
76+ return PosixJNAAffinity .LOADED ;
77+ } catch (Throwable t ) {
78+ logThrowable (t , "Posix JNA-based affinity not usable because it failed to load!" );
79+ return false ;
80+ }
81+ } else {
82+ LOGGER .warning ("Posix JNA-based affinity not usable due to JNA not being available!" );
83+ return false ;
84+ }
85+ }
86+
87+ private static boolean isMacJNAAffinityUsable () {
88+ if (isJNAAvailable ()) {
89+ return true ;
90+ } else {
91+ LOGGER .warning ("MAX OSX JNA-based affinity not usable due to JNA not being available!" );
92+ return false ;
93+ }
94+ }
95+
96+ private static void logThrowable (Throwable t , String description ) {
97+ StringWriter sw = new StringWriter ();
98+ sw .append (description );
99+ sw .append (" Reason: " );
100+ t .printStackTrace (new PrintWriter (sw ));
101+ LOGGER .warning (sw .toString ());
102+ }
103+
57104 public static long getAffinity () {
58105 return AFFINITY_IMPL .getAffinity ();
59106 }
0 commit comments