summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsg215889 <[email protected]>2009-07-28 18:57:07 -0700
committersg215889 <[email protected]>2009-07-28 18:57:07 -0700
commitabea54842158e588112f6e35d1ba3c5f069dfc29 (patch)
tree6e311b8d655a0e04d3ad1c90cb06a67256863aaf /src
parentf607cdf272dffbd45e6389c5715a9596e85c2a90 (diff)
Fix: Native CPU 32/64 bit detection; Tested on CVM/J2SE
Diffstat (limited to 'src')
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/CPU.java25
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/NativeLibrary.java2
-rw-r--r--src/java/com/sun/gluegen/test/TestPointerBufferEndian.java5
-rw-r--r--src/java/com/sun/gluegen/test/TestStructAccessorEndian.java5
-rw-r--r--src/native/common/CPU.c10
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;
+}
+