Skip to content

Commit 4e8aab6

Browse files
committed
Conflicts: src/main/java/vanilla/java/affinity/AffinityLock.java src/main/java/vanilla/java/affinity/JNAAffinity.java src/main/java/vanilla/java/affinity/impl/NativeAffinity.java src/test/java/vanilla/java/affinity/JNAAffinityTest.java src/test/java/vanilla/java/affinity/impl/PosixJNAAffinityTest.java
2 parents f9b7c2e + 7243c4d commit 4e8aab6

20 files changed

Lines changed: 622 additions & 251 deletions

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
affinity.iml
3+
4+
affinity.ipr
5+
6+
target/
7+
8+
affinity.iws

src/main/c/Makefile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ endif
2626

2727
all: $(TARGET)
2828

29-
$(TARGET): vanilla_java_affinity_NativeAffinity.c $(WORKING_DIR)/vanilla_java_affinity_NativeAffinity.h
30-
gcc -O2 -shared -fPIC -L$(JVM_SHARED_LIB) -ljvm -lrt $(INCLUDES) vanilla_java_affinity_NativeAffinity.c -o $(TARGET)
29+
$(TARGET): vanilla_java_affinity_impl_NativeAffinity.c $(WORKING_DIR)/vanilla_java_affinity_impl_NativeAffinity.h
30+
gcc -O2 -shared -fPIC -L$(JVM_SHARED_LIB) -ljvm -lrt $(INCLUDES) vanilla_java_affinity_impl_NativeAffinity.c -o $(TARGET)
3131

32-
$(WORKING_DIR)/vanilla_java_affinity_NativeAffinity.h: $(TARGET_DIR)/vanilla/java/affinity/NativeAffinity.class
32+
$(WORKING_DIR)/vanilla_java_affinity_impl_NativeAffinity.h: $(TARGET_DIR)/vanilla/java/affinity/impl/NativeAffinity.class
3333
mkdir -p $(TARGET_DIR)/jni
34-
javah -force -classpath $(JAVAH_CLASSPATH) -d $(WORKING_DIR) vanilla.java.affinity.NativeAffinity
34+
javah -force -classpath $(JAVAH_CLASSPATH) -d $(WORKING_DIR) vanilla.java.affinity.impl.NativeAffinity
3535

src/main/c/vanilla_java_affinity_NativeAffinity.c renamed to src/main/c/vanilla_java_affinity_impl_NativeAffinity.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
#define _GNU_SOURCE
1818
#include <jni.h>
1919
#include <sched.h>
20-
#include "vanilla_java_affinity_NativeAffinity.h"
20+
#include "vanilla_java_affinity_impl_NativeAffinity.h"
2121
/*
22-
* Class: vanilla_java_affinity_NativeAffinity
22+
* Class: vanilla_java_affinity_impl_NativeAffinity
2323
* Method: getAffinity0
2424
* Signature: ()J
2525
*/
26-
JNIEXPORT jlong JNICALL Java_vanilla_java_affinity_NativeAffinity_getAffinity0
26+
JNIEXPORT jlong JNICALL Java_vanilla_java_affinity_impl_NativeAffinity_getAffinity0
2727
(JNIEnv *env, jclass c) {
2828
cpu_set_t mask;
2929
int ret = sched_getaffinity(0, sizeof(mask), &mask);
@@ -40,7 +40,7 @@ JNIEXPORT jlong JNICALL Java_vanilla_java_affinity_NativeAffinity_getAffinity0
4040
* Method: setAffinity0
4141
* Signature: (J)V
4242
*/
43-
JNIEXPORT void JNICALL Java_vanilla_java_affinity_NativeAffinity_setAffinity0
43+
JNIEXPORT void JNICALL Java_vanilla_java_affinity_impl_NativeAffinity_setAffinity0
4444
(JNIEnv *env, jclass c, jlong affinity) {
4545
int i;
4646
cpu_set_t mask;
@@ -84,7 +84,7 @@ static __inline__ unsigned long long rdtsc (void) {
8484
* Method: rdtsc0
8585
* Signature: ()J
8686
*/
87-
JNIEXPORT jlong JNICALL Java_vanilla_java_affinity_NativeAffinity_rdtsc0
87+
JNIEXPORT jlong JNICALL Java_vanilla_java_clock_impl_JNIClock_rdtsc0
8888
(JNIEnv *env, jclass c) {
8989
return (jlong) rdtsc();
9090
}

src/main/java/vanilla/java/affinity/AffinityLock.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,15 @@
2323
* @author peter.lawrey
2424
*/
2525
public class AffinityLock {
26+
// TODO It seems like on virtualized platforms .availableProcessors() value can change at
27+
// TODO runtime. We should think about how to adopt to such change
28+
2629
public static final int PROCESSORS = Runtime.getRuntime().availableProcessors();
2730
public static final long BASE_AFFINITY = AffinitySupport.getAffinity();
2831
public static final long RESERVED_AFFINITY = getReservedAffinity0();
2932

3033
private static final Logger LOGGER = Logger.getLogger(AffinityLock.class.getName());
34+
3135
private static final AffinityLock[] LOCKS = new AffinityLock[PROCESSORS];
3236
private static final AffinityLock NONE = new AffinityLock(-1, false, false);
3337

@@ -79,6 +83,7 @@ public void release() {
7983
if (this == NONE) return;
8084

8185
Thread t = Thread.currentThread();
86+
8287
synchronized (AffinityLock.class) {
8388
if (assignedThread != t)
8489
throw new IllegalStateException("Cannot release lock " + id + " assigned to " + assignedThread);

src/main/java/vanilla/java/affinity/AffinitySupport.java

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,40 +16,39 @@
1616

1717
package vanilla.java.affinity;
1818

19+
import vanilla.java.affinity.impl.NativeAffinity;
20+
import vanilla.java.affinity.impl.NullAffinity;
21+
import vanilla.java.affinity.impl.PosixJNAAffinity;
22+
23+
import java.util.logging.Logger;
24+
1925
/**
2026
* @author peter.lawrey
2127
*/
2228
public enum AffinitySupport {
2329
;
30+
private static final IAffinity AFFINITY_IMPL;
2431

25-
interface IAffinity {
26-
public long getAffinity();
27-
28-
public void setAffinity(long affinity);
29-
30-
public long nanoTime();
31-
}
32-
33-
private static final IAffinity affinityImpl;
32+
private static final Logger LOGGER = Logger.getLogger(AffinitySupport.class.getName());
3433

3534
static {
36-
if (NativeAffinity.LOADED)
37-
affinityImpl = NativeAffinity.INSTANCE;
38-
else if (JNAAffinity.LOADED)
39-
affinityImpl = JNAAffinity.INSTANCE;
40-
else
41-
affinityImpl = NullAffinity.INSTANCE;
35+
if (NativeAffinity.LOADED) {
36+
LOGGER.fine("Using JNI-based affinity control implementation");
37+
AFFINITY_IMPL = NativeAffinity.INSTANCE;
38+
} else if (PosixJNAAffinity.LOADED) {
39+
LOGGER.fine("Using JNA-based affinity control implementation");
40+
AFFINITY_IMPL = PosixJNAAffinity.INSTANCE;
41+
} else {
42+
LOGGER.info("Using dummy affinity control implementation!");
43+
AFFINITY_IMPL = NullAffinity.INSTANCE;
44+
}
4245
}
4346

4447
public static long getAffinity() {
45-
return affinityImpl.getAffinity();
46-
}
47-
48-
public static void setAffinity(long affinity) {
49-
affinityImpl.setAffinity(affinity);
48+
return AFFINITY_IMPL.getAffinity();
5049
}
5150

52-
public static long nanoTime() {
53-
return affinityImpl.nanoTime();
51+
public static void setAffinity(final long affinity) {
52+
AFFINITY_IMPL.setAffinity(affinity);
5453
}
5554
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright 2011 Peter Lawrey
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package vanilla.java.affinity;
18+
19+
/**
20+
* Implementation interface
21+
*
22+
* @author cheremin
23+
* @since 29.12.11, 20:14
24+
*/
25+
public interface IAffinity {
26+
/**
27+
* @return returns affinity mask for current thread
28+
*/
29+
public long getAffinity();
30+
31+
/**
32+
* @param affinity sets affinity mask of current thread to specified value
33+
*/
34+
public void setAffinity(final long affinity);
35+
}

src/main/java/vanilla/java/affinity/JNAAffinity.java

Lines changed: 0 additions & 81 deletions
This file was deleted.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
* Copyright 2011 Peter Lawrey
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package vanilla.java.affinity.impl;
18+
19+
import vanilla.java.affinity.IAffinity;
20+
21+
import java.util.logging.Level;
22+
import java.util.logging.Logger;
23+
24+
/**
25+
* @author peter.lawrey
26+
*/
27+
public enum NativeAffinity implements IAffinity {
28+
INSTANCE;
29+
30+
public static final boolean LOADED;
31+
private static final Logger LOGGER = Logger.getLogger(NativeAffinity.class.getName());
32+
33+
static {
34+
boolean loaded;
35+
try {
36+
System.loadLibrary("affinity");
37+
loaded = true;
38+
} catch (UnsatisfiedLinkError ule) {
39+
if (LOGGER.isLoggable(Level.FINE))
40+
LOGGER.fine("Unable to find libaffinity in " + System.getProperty("java.library.path") + " " + ule);
41+
loaded = false;
42+
}
43+
LOADED = loaded;
44+
}
45+
46+
private native static long getAffinity0();
47+
48+
private native static void setAffinity0(long affinity);
49+
50+
@Override
51+
public long getAffinity() {
52+
return getAffinity0();
53+
}
54+
55+
@Override
56+
public void setAffinity(long affinity) {
57+
setAffinity0(affinity);
58+
}
59+
}

src/main/java/vanilla/java/affinity/NullAffinity.java renamed to src/main/java/vanilla/java/affinity/impl/NullAffinity.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,18 @@
1414
* limitations under the License.
1515
*/
1616

17-
package vanilla.java.affinity;
17+
package vanilla.java.affinity.impl;
18+
19+
20+
import vanilla.java.affinity.IAffinity;
1821

1922
import java.util.logging.Level;
2023
import java.util.logging.Logger;
2124

2225
/**
2326
* @author peter.lawrey
2427
*/
25-
public enum NullAffinity implements AffinitySupport.IAffinity {
28+
public enum NullAffinity implements IAffinity {
2629
INSTANCE;
2730

2831
private static final Logger LOGGER = Logger.getLogger(NullAffinity.class.getName());
@@ -33,13 +36,8 @@ public long getAffinity() {
3336
}
3437

3538
@Override
36-
public void setAffinity(long affinity) {
39+
public void setAffinity(final long affinity) {
3740
if (LOGGER.isLoggable(Level.FINE))
3841
LOGGER.fine("unable to set mask to " + Long.toHexString(affinity) + " as the JNIa nd JNA libraries and not loaded");
3942
}
40-
41-
@Override
42-
public long nanoTime() {
43-
return System.nanoTime();
44-
}
4543
}

0 commit comments

Comments
 (0)