From dd24aebc2bb6e249e10c76185de77b4237b3e73c Mon Sep 17 00:00:00 2001 From: Daniel Mitterdorfer Date: Tue, 4 Oct 2016 12:16:27 +0200 Subject: [PATCH 1/4] Fix build on JDK 8 On JDK 8 the build fails with various Javadoc errors (tested with Oracle JDK 1.8.0_102). With this commit we fix these. --- .../affinity/AffinityLock.java | 12 ++++++------ .../affinity/AffinityThreadFactory.java | 2 +- .../affinity/impl/PosixJNAAffinity.java | 2 +- .../affinity/impl/WindowsJNAAffinity.java | 1 - .../com/higherfrequencytrading/clock/IClock.java | 8 ++++---- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/higherfrequencytrading/affinity/AffinityLock.java b/src/main/java/com/higherfrequencytrading/affinity/AffinityLock.java index fbe74dd..fb374f5 100644 --- a/src/main/java/com/higherfrequencytrading/affinity/AffinityLock.java +++ b/src/main/java/com/higherfrequencytrading/affinity/AffinityLock.java @@ -74,7 +74,7 @@ public class AffinityLock { /** * Set the CPU layout for this machine. CPUs which are not mentioned will be ignored. - *

+ * * Changing the layout will have no impact on thread which have already been assigned. * It only affects subsequent assignments. * @@ -107,7 +107,7 @@ public static void cpuLayout(CpuLayout cpuLayout) { /** * Translate a layout id into a logical cpu id. - *

+ * * This translation is perform so that regardless of how * * @param id @@ -149,7 +149,7 @@ public static AffinityLock acquireLock() { /** * Assign any free core to this thread. - *

+ * * In reality, only one cpu is assigned, the rest of the threads for that core are reservable so they are not used. * * @return A handle for the current AffinityLock. @@ -160,7 +160,7 @@ public static AffinityLock acquireCore() { /** * Assign a cpu which can be bound to the current thread or another thread. - *

+ * * This can be used for defining your thread layout centrally and passing the handle via dependency injection. * * @param bind if true, bind the current thread, if false, reserve a cpu which can be bound later. @@ -172,7 +172,7 @@ public static AffinityLock acquireLock(boolean bind) { /** * Assign a core(and all its cpus) which can be bound to the current thread or another thread. - *

+ * * This can be used for defining your thread layout centrally and passing the handle via dependency injection. * * @param bind if true, bind the current thread, if false, reserve a cpu which can be bound later. @@ -329,7 +329,7 @@ private boolean canReserve() { /** * Give another affinity lock relative to this one based on a list of strategies. - *

+ * * The strategies are evaluated in order to (like a search path) to find the next appropriate thread. * If ANY is not the last strategy, a warning is logged and no cpu is assigned (leaving the OS to choose) * diff --git a/src/main/java/com/higherfrequencytrading/affinity/AffinityThreadFactory.java b/src/main/java/com/higherfrequencytrading/affinity/AffinityThreadFactory.java index e2201d9..1273ac4 100644 --- a/src/main/java/com/higherfrequencytrading/affinity/AffinityThreadFactory.java +++ b/src/main/java/com/higherfrequencytrading/affinity/AffinityThreadFactory.java @@ -20,7 +20,7 @@ /** * This is a ThreadFactory which assigns threads based the strategies provided. - *

+ * * If no strategies are provided AffinityStrategies.ANY is used. * * @author peter.lawrey diff --git a/src/main/java/com/higherfrequencytrading/affinity/impl/PosixJNAAffinity.java b/src/main/java/com/higherfrequencytrading/affinity/impl/PosixJNAAffinity.java index 8d7b314..270ca94 100644 --- a/src/main/java/com/higherfrequencytrading/affinity/impl/PosixJNAAffinity.java +++ b/src/main/java/com/higherfrequencytrading/affinity/impl/PosixJNAAffinity.java @@ -28,7 +28,7 @@ * Implementation of {@link IAffinity} based on JNA call of * sched_setaffinity(3)/sched_getaffinity(3) from 'c' library. Applicable for most * linux/unix platforms - *

+ * * TODO Support assignment to core 64 and above * * @author peter.lawrey diff --git a/src/main/java/com/higherfrequencytrading/affinity/impl/WindowsJNAAffinity.java b/src/main/java/com/higherfrequencytrading/affinity/impl/WindowsJNAAffinity.java index 13aebd5..451ac46 100644 --- a/src/main/java/com/higherfrequencytrading/affinity/impl/WindowsJNAAffinity.java +++ b/src/main/java/com/higherfrequencytrading/affinity/impl/WindowsJNAAffinity.java @@ -31,7 +31,6 @@ * Implementation of {@link com.higherfrequencytrading.affinity.IAffinity} based on JNA call of * sched_SetThreadAffinityMask/GetProcessAffinityMask from Windows 'kernel32' library. Applicable for * most windows platforms - *

* * * @author andre.monteiro */ diff --git a/src/main/java/com/higherfrequencytrading/clock/IClock.java b/src/main/java/com/higherfrequencytrading/clock/IClock.java index 5b3dd65..cf2cb3d 100644 --- a/src/main/java/com/higherfrequencytrading/clock/IClock.java +++ b/src/main/java/com/higherfrequencytrading/clock/IClock.java @@ -26,10 +26,10 @@ public interface IClock { /** * The general contract is same, as {@link System#nanoTime()}: - *

+ * * Returns the current value of the most precise available system * timer, in nanoseconds. - *

+ * *

This method can only be used to measure elapsed time and is * not related to any other notion of system or wall-clock time. * The value returned represents nanoseconds since some fixed but @@ -39,8 +39,8 @@ public interface IClock { * how frequently values change. Differences in successive calls * that span greater than approximately 292 years (263 * nanoseconds) will not accurately compute elapsed time due to - * numerical overflow. - *

+ * numerical overflow.

+ * *

For example, to measure how long some code takes to execute: *

      *   long startTime = clock.nanoTime();

From bf8f99b8f7578425f9a5eabe5c9fbbe456abcc25 Mon Sep 17 00:00:00 2001
From: Daniel Mitterdorfer 
Date: Tue, 4 Oct 2016 12:19:28 +0200
Subject: [PATCH 2/4] Use NativeAffinity on Mac OS X

---
 .../affinity/impl/NativeAffinity.java           |   2 +-
 .../native/Mac/x86_64/libaffinity.dylib         | Bin 0 -> 10816 bytes
 2 files changed, 1 insertion(+), 1 deletion(-)
 create mode 100755 src/main/resources/com/higherfrequencytrading/affinity/native/Mac/x86_64/libaffinity.dylib

diff --git a/src/main/java/com/higherfrequencytrading/affinity/impl/NativeAffinity.java b/src/main/java/com/higherfrequencytrading/affinity/impl/NativeAffinity.java
index 0997f8b..3ee31c9 100644
--- a/src/main/java/com/higherfrequencytrading/affinity/impl/NativeAffinity.java
+++ b/src/main/java/com/higherfrequencytrading/affinity/impl/NativeAffinity.java
@@ -193,7 +193,7 @@ private static boolean loadAffinityNativeLibrary() {
         String affinityNativeLibraryName = System.mapLibraryName("affinity");
 
         // Load the os-dependent library from a jar file
-        String affinityNativeLibraryPath = "/com/higherfrequencytrading/java/affinity/native/"
+        String affinityNativeLibraryPath = "/com/higherfrequencytrading/affinity/native/"
                 + getNativeLibFolderPathForCurrentOS();
 
         if (NativeAffinity.class.getResource(affinityNativeLibraryPath
diff --git a/src/main/resources/com/higherfrequencytrading/affinity/native/Mac/x86_64/libaffinity.dylib b/src/main/resources/com/higherfrequencytrading/affinity/native/Mac/x86_64/libaffinity.dylib
new file mode 100755
index 0000000000000000000000000000000000000000..66631597eb16ca296b015386e0931f71f3087759
GIT binary patch
literal 10816
zcmeHNeP|p-6rYQUO*Ks;*fxGtF0~Oq+FpuUiXU*PS=qE{s%@hE$4)nQd%0`(K61O8
zCStVGMp>?rLsSAHih}xwf}lbb+D82&?O!cYq)>(aqntECu!>Ql@%MIT+P!NM;|HR!
z58lkYH}Ac9^JaHucVWQY9NhtFbO!x=Kcv3fVdfuhW
z`};$MJxNP@?6UsanSH5DoToC0>@4=8^`532BBC*ja{}jjk|*+7TK7aM`#UP^B}LGP
z_V@Q{#&-LS({oY+a^BY3)#|H}&&M1&Jtt&W#*gz1#?%|yoRy!`UZZRRcBL+{XguYZ
z63w}x&1bJs_|-zf0HXc&$Uk}~Bv3z9Am<(Jom-T)b{X)nkP!BmprhisCOiJ;kB0vt
zAoauJQyO9s+ssFdY)msEMyiLfU(2KnL))zNYhB5_uEkpuiBu+K4Q|z9+ji_+7axQW
zyFu7Gw))+@2R~`FYQMk#!TYV|$STJ6yL}5YRtuS0oC=o+MqZ*W?iL@E5~O5=NA{0
zNp)0pl;dhaIey|ZU&BvNyhrAoBS{FV&WF3*?8Tjw6>4_Ds9I=Ho$jgipO?OY1LW8l
z8B<4=yoSn;<768s`ly0eW-JFMifZ9QG9c{2V4>z^eBG&q?kV-o
z2CJsD0%~RbKQMvb4NW2NlO_5N@K-Kf?B7j9b>CZA^boDQJFlykkZ_W=mfko7sB$;Fx`u`2U#k
zp;?Wyndaxv^_k|Pn?CQRFSzMTZaRu|4?h1QhL-7#Y_~I3Dy=I6F+FFcvKbl^#x`m3
za9+3Ud?wtl8MYoyc_
zq>Zko`@a_w|7>K6T}ufd^!Rob8fXYL)GewlqGk(8V3xL5J5G4Vb?c2Q&ml-
zm&ktrlBa*R5g{*{n^*n`$UpY0XMZKiF3e;99SCd|@=Zc~K7YQ1%)LT>`2ytY(C;Q8
z|JVZL?}L2j0_CN-%Dh_q|7{TY8j-IOd85edMP8{N&_M)(2m}!bA`nC%h(Hj5AOb-I
zf(Qf=2qF+fAc(+!Cj!?rH9kV#TodJVWUa;a@>p^&@3pmjoITvficy>|#=XPr9-Kep
zFuO?deT|+*4rk_8f^@*|3s;y)XeopEw}PJ&n^9>kmgJ(G$x&^Kuh!I!1o1Y4SH64I
zt6NkNy{rP;TBwi^;&f8V#i=Q$eKXEhuq!liYRXgToWVOaE7h;dlT^+IVmNc%>(y=U
zY=6L|@^Qm28s7^xLl?5*_zS9z6f>brrDL$GA-;Z>P}n-#W$~a
zx36d`R>DebwE5{{pc9Zf*}r=m$zUsptwSR3SDeJ|*lHh5^{at$AC2fvBz~IoZ8`u3
z)Kz=>l9u{%Urp-!X;;6_({Gphf|mMnpH1rfY0`gQ$nO*Sl9u{So_V)f^50LB{`*4z
zNue)kRJr|^`*1{)zMm%j6GH#6(3iB-m-}*3-%peNE#kh%PeNbP3(=30kO10Oy~#(@
zK50E@84tP#a1+{)_etn{ektnZ_$LG{$L|e6%XoYxXxYCTp-cMG-(7;XMLZ6H4zUnY
z4_>aI-*svEG%z++QBP+XetkOQ@Y6q6&~*ra%M$HT|857a0n+yLI$#8N2M`b?oJ)oT
z!nnziPIC7W1#atTG{JHA#b;rHq)$

literal 0
HcmV?d00001


From a94d13d3512422a1fd7a26359a92a0ee5c4761d0 Mon Sep 17 00:00:00 2001
From: Daniel Mitterdorfer 
Date: Tue, 4 Oct 2016 15:13:05 +0200
Subject: [PATCH 3/4] Allow to build shared library on Linux on Mac OS X

With this commit we adapt the Makefile so it builds the shared library for Linux
and Mac OS X. Cross compilation is not supported.
---
 .gitignore                                    |   2 ++
 src/main/c/Makefile                           |  29 +++++++++++++-----
 .../native/Mac/x86_64/libaffinity.dylib       | Bin 10816 -> 9540 bytes
 .../native/Mac/x86_64/libaffinity.jnilib      | Bin 10816 -> 9540 bytes
 4 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/.gitignore b/.gitignore
index 28f3615..75c576a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,5 @@ affinity.ipr
 target/
 
 affinity.iws
+
+.DS_Store
\ No newline at end of file
diff --git a/src/main/c/Makefile b/src/main/c/Makefile
index 797d93f..597cb5f 100755
--- a/src/main/c/Makefile
+++ b/src/main/c/Makefile
@@ -6,17 +6,27 @@
 # C sources to compile
 
 TARGET_DIR := ../../../target/classes
-TARGET := $(TARGET_DIR)/libaffinity.so
-
+JAVA_BUILD_DIR := $(TARGET_DIR)
 WORKING_DIR := $(TARGET_DIR)/../jni
 
-JAVA_BUILD_DIR := $(TARGET_DIR)
+SYS := $(shell gcc -dumpmachine)
+uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
 
-JAVA_HOME ?= /usr/java/default
-JAVA_LIB := $(JAVA_HOME)/jre/lib
-JVM_SHARED_LIBS := -L$(JAVA_LIB)/amd64/server -L$(JAVA_LIB)/i386/server  -L$(JAVA_LIB)/amd64/jrockit/ -L$(JAVA_LIB)/i386/jrockit/
+ifeq ($(uname_S),Linux)
+    TARGET := $(TARGET_DIR)/libaffinity.so
+    JAVA_HOME := /usr/java/default
+    JAVA_LIB := $(JAVA_HOME)/jre/lib
+    INCLUDES := -I $(JAVA_HOME)/include -I $(JAVA_HOME)/include/linux -I $(WORKING_DIR)
+    JVM_SHARED_LIBS := -L$(JAVA_LIB)/amd64/server -L$(JAVA_LIB)/i386/server -L$(JAVA_LIB)/amd64/jrockit/ -L$(JAVA_LIB)/i386/jrockit/
+endif
 
-INCLUDES := -I $(JAVA_HOME)/include -I $(JAVA_HOME)/include/linux -I $(WORKING_DIR)
+ifeq ($(uname_S),Darwin)
+    TARGET := $(TARGET_DIR)/libaffinity.dylib
+    JAVA_HOME := $(shell /usr/libexec/java_home)
+    JAVA_LIB := $(JAVA_HOME)/jre/lib
+    INCLUDES := -I $(JAVA_HOME)/include -I $(JAVA_HOME)/include/darwin -I $(WORKING_DIR)
+    JVM_SHARED_LIBS := -L$(JAVA_LIB) -L$(JAVA_LIB)/server
+endif
 
 # classpath for javah
 ifdef CLASSPATH
@@ -27,7 +37,10 @@ endif
 
 all: $(TARGET)
 
-$(TARGET): com_higherfrequencytrading_affinity_impl_NativeAffinity.c $(WORKING_DIR)/com_higherfrequencytrading_affinity_impl_NativeAffinity.h $(WORKING_DIR)/com_higherfrequencytrading_clock_impl_JNIClock.h $(WORKING_DIR)/com_higherfrequencytrading_busywaiting_impl_BusyWaiting.h
+$(TARGET_DIR)/libaffinity.dylib: com_higherfrequencytrading_affinity_impl_NativeAffinity_MacOSX.c $(WORKING_DIR)/com_higherfrequencytrading_affinity_impl_NativeAffinity.h $(WORKING_DIR)/com_higherfrequencytrading_clock_impl_JNIClock.h $(WORKING_DIR)/com_higherfrequencytrading_busywaiting_impl_BusyWaiting.h
+	gcc -O2 -shared -fPIC $(JVM_SHARED_LIBS) -ljvm $(INCLUDES) com_higherfrequencytrading_affinity_impl_NativeAffinity_MacOSX.c -o $(TARGET)
+
+$(TARGET_DIR)/libaffinity.so: com_higherfrequencytrading_affinity_impl_NativeAffinity.c $(WORKING_DIR)/com_higherfrequencytrading_affinity_impl_NativeAffinity.h $(WORKING_DIR)/com_higherfrequencytrading_clock_impl_JNIClock.h $(WORKING_DIR)/com_higherfrequencytrading_busywaiting_impl_BusyWaiting.h
 	gcc -O2 -shared -fPIC $(JVM_SHARED_LIBS) -ljvm -lrt $(INCLUDES) com_higherfrequencytrading_affinity_impl_NativeAffinity.c -o $(TARGET)
 
 $(WORKING_DIR)/com_higherfrequencytrading_affinity_impl_NativeAffinity.h: $(TARGET_DIR)/com/higherfrequencytrading/affinity/impl/NativeAffinity.class
diff --git a/src/main/resources/com/higherfrequencytrading/affinity/native/Mac/x86_64/libaffinity.dylib b/src/main/resources/com/higherfrequencytrading/affinity/native/Mac/x86_64/libaffinity.dylib
index 66631597eb16ca296b015386e0931f71f3087759..afa0cc828ece50db26aa5a5e01974f1c557e330b 100755
GIT binary patch
literal 9540
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

diff --git a/src/main/resources/com/higherfrequencytrading/affinity/native/Mac/x86_64/libaffinity.jnilib b/src/main/resources/com/higherfrequencytrading/affinity/native/Mac/x86_64/libaffinity.jnilib
index 66631597eb16ca296b015386e0931f71f3087759..afa0cc828ece50db26aa5a5e01974f1c557e330b 100755
GIT binary patch
literal 9540
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


From 8687240fc077bba576a7408afa9e1a137560acc9 Mon Sep 17 00:00:00 2001
From: Peter Lawrey 
Date: Wed, 6 Jun 2018 13:21:27 +0100
Subject: [PATCH 4/4] Update README

---
 README | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/README b/README
index 46da3d9..1e24273 100644
--- a/README
+++ b/README
@@ -1,8 +1,15 @@
+This is an old version of this library kept here for historical purposes. The latest version is available here
+
+https://github.com/OpenHFT/Java-Thread-Affinity
+
+----
+
 [ Project Development Summary ]
 
 https://www.ohloh.net/p/Java-Thread-Affinity
 
 [ Version History ]
+Verions 3.x - moved to https://github.com/OpenHFT/Java-Thread-Affinity
 
 Version 1.6.3 - Added AffinityLock.isAllocated() and isBound() so you can check whether a CPU could be allocated.
 
@@ -44,4 +51,4 @@ Verison 1.0 - JNI implementation
 
 [ Contributers ]
 
-peter.lawrey - Lead Developer.
\ No newline at end of file
+peter.lawrey - Lead Developer.