diff options
author | sg215889 <[email protected]> | 2009-07-28 18:57:07 -0700 |
---|---|---|
committer | sg215889 <[email protected]> | 2009-07-28 18:57:07 -0700 |
commit | abea54842158e588112f6e35d1ba3c5f069dfc29 (patch) | |
tree | 6e311b8d655a0e04d3ad1c90cb06a67256863aaf /src | |
parent | f607cdf272dffbd45e6389c5715a9596e85c2a90 (diff) |
Fix: Native CPU 32/64 bit detection; Tested on CVM/J2SE
Diffstat (limited to 'src')
-rwxr-xr-x | src/java/com/sun/gluegen/runtime/CPU.java | 25 | ||||
-rwxr-xr-x | src/java/com/sun/gluegen/runtime/NativeLibrary.java | 2 | ||||
-rw-r--r-- | src/java/com/sun/gluegen/test/TestPointerBufferEndian.java | 5 | ||||
-rw-r--r-- | src/java/com/sun/gluegen/test/TestStructAccessorEndian.java | 5 | ||||
-rw-r--r-- | src/native/common/CPU.c | 10 |
5 files changed, 28 insertions, 19 deletions
diff --git a/src/java/com/sun/gluegen/runtime/CPU.java b/src/java/com/sun/gluegen/runtime/CPU.java index c7e6bc1..ee6c9f5 100755 --- a/src/java/com/sun/gluegen/runtime/CPU.java +++ b/src/java/com/sun/gluegen/runtime/CPU.java @@ -38,6 +38,7 @@ */ package com.sun.gluegen.runtime; +import java.security.*; /** Provides information to autogenerated struct accessors about what kind of data model (32- or 64-bit) is being used by the currently @@ -47,23 +48,16 @@ public class CPU { private static boolean is32Bit; static { + NativeLibrary.ensureNativeLibLoaded(); + boolean done=false; // Try to use Sun's sun.arch.data.model first .. - int bits = 0; - try { - String bitS = - (String) AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return System.getProperty("sun.arch.data.model"); - } - }); - if(null!=bitS && bitS.length()>0) { - bits = Integer.parseInt(bitS); - is32Bit = ( 32 == bits ); - done = true ; - } - } catch (NumberFormatException nfe) {} + int bits = getPointerSizeInBits(); + if ( 32 == bits || 64 == bits ) { + is32Bit = ( 32 == bits ); + done = true ; + } if(!done) { // We don't seem to need an AccessController.doPrivileged() block @@ -114,4 +108,7 @@ public class CPU { public static boolean is32Bit() { return is32Bit; } + + public static native int getPointerSizeInBits(); + } diff --git a/src/java/com/sun/gluegen/runtime/NativeLibrary.java b/src/java/com/sun/gluegen/runtime/NativeLibrary.java index 22063a5..c4c9f25 100755 --- a/src/java/com/sun/gluegen/runtime/NativeLibrary.java +++ b/src/java/com/sun/gluegen/runtime/NativeLibrary.java @@ -412,7 +412,7 @@ public class NativeLibrary { } private static volatile boolean loadedDynLinkNativeLib; - private static void ensureNativeLibLoaded() { + static void ensureNativeLibLoaded() { if (!loadedDynLinkNativeLib) { synchronized (NativeLibrary.class) { if (!loadedDynLinkNativeLib) { diff --git a/src/java/com/sun/gluegen/test/TestPointerBufferEndian.java b/src/java/com/sun/gluegen/test/TestPointerBufferEndian.java index cd375af..ba77eed 100644 --- a/src/java/com/sun/gluegen/test/TestPointerBufferEndian.java +++ b/src/java/com/sun/gluegen/test/TestPointerBufferEndian.java @@ -8,10 +8,11 @@ public class TestPointerBufferEndian { public static void main (String[] args) { boolean direct = args.length>0 && args[0].equals("-direct"); boolean ok = true; - String bits = System.getProperty("sun.arch.data.model"); + int bitsPtr = CPU.getPointerSizeInBits(); + String bitsProp = System.getProperty("sun.arch.data.model"); String os = System.getProperty("os.name"); String cpu = System.getProperty("os.arch"); - System.out.println("OS: <"+os+"> CPU: <"+cpu+"> Bits: <"+bits+">"); + System.out.println("OS: <"+os+"> CPU: <"+cpu+"> Bits: <"+bitsPtr+"/"+bitsProp+">"); System.out.println("CPU is: "+ (CPU.is32Bit()?"32":"64") + " bit"); System.out.println("Buffer is in: "+ (BufferFactory.isLittleEndian()?"little":"big") + " endian"); PointerBuffer ptr = direct ? PointerBuffer.allocateDirect(3) : PointerBuffer.allocate(3); diff --git a/src/java/com/sun/gluegen/test/TestStructAccessorEndian.java b/src/java/com/sun/gluegen/test/TestStructAccessorEndian.java index fa28cb6..dc53a10 100644 --- a/src/java/com/sun/gluegen/test/TestStructAccessorEndian.java +++ b/src/java/com/sun/gluegen/test/TestStructAccessorEndian.java @@ -7,10 +7,11 @@ import java.nio.*; public class TestStructAccessorEndian { public static void main (String args[]) { boolean ok = true; - String bits = System.getProperty("sun.arch.data.model"); + int bitsPtr = CPU.getPointerSizeInBits(); + String bitsProp = System.getProperty("sun.arch.data.model"); String os = System.getProperty("os.name"); String cpu = System.getProperty("os.arch"); - System.out.println("OS: <"+os+"> CPU: <"+cpu+"> Bits: <"+bits+">"); + System.out.println("OS: <"+os+"> CPU: <"+cpu+"> Bits: <"+bitsPtr+"/"+bitsProp+">"); System.out.println("CPU is: "+ (CPU.is32Bit()?"32":"64") + " bit"); System.out.println("Buffer is in: "+ (BufferFactory.isLittleEndian()?"little":"big") + " endian"); ByteBuffer tst = BufferFactory.newDirectByteBuffer(BufferFactory.SIZEOF_LONG * 3); diff --git a/src/native/common/CPU.c b/src/native/common/CPU.c new file mode 100644 index 0000000..8c4135c --- /dev/null +++ b/src/native/common/CPU.c @@ -0,0 +1,10 @@ + +#include <jni.h> + +#include <assert.h> + +JNIEXPORT jint JNICALL +Java_com_sun_gluegen_runtime_CPU_getPointerSizeInBits(JNIEnv *env, jclass _unused) { + return sizeof(void *) * 8; +} + |