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/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. 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/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/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/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();
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 0000000..afa0cc8
Binary files /dev/null and b/src/main/resources/com/higherfrequencytrading/affinity/native/Mac/x86_64/libaffinity.dylib differ
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 6663159..afa0cc8 100755
Binary files a/src/main/resources/com/higherfrequencytrading/affinity/native/Mac/x86_64/libaffinity.jnilib and b/src/main/resources/com/higherfrequencytrading/affinity/native/Mac/x86_64/libaffinity.jnilib differ