summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsg215889 <[email protected]>2009-07-28 17:23:24 -0700
committersg215889 <[email protected]>2009-07-28 17:23:24 -0700
commitf607cdf272dffbd45e6389c5715a9596e85c2a90 (patch)
treeefb871ce63d67ba4c741c863135cad82fb9a1a7a /src
parent53b16f758e0db510db420fabe6793e7921a9c407 (diff)
Fix: Add sun.arch.data.model to determine 32bit arch
Diffstat (limited to 'src')
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/CPU.java90
-rw-r--r--src/java/com/sun/gluegen/test/TestPointerBufferEndian.java3
-rw-r--r--src/java/com/sun/gluegen/test/TestStructAccessorEndian.java3
3 files changed, 65 insertions, 31 deletions
diff --git a/src/java/com/sun/gluegen/runtime/CPU.java b/src/java/com/sun/gluegen/runtime/CPU.java
index 0456e9f..c7e6bc1 100755
--- a/src/java/com/sun/gluegen/runtime/CPU.java
+++ b/src/java/com/sun/gluegen/runtime/CPU.java
@@ -47,35 +47,67 @@ public class CPU {
private static boolean is32Bit;
static {
- // We don't seem to need an AccessController.doPrivileged() block
- // here as these system properties are visible even to unsigned
- // applets
- // Note: this code is replicated in StructLayout.java
- String os = System.getProperty("os.name").toLowerCase();
- String cpu = System.getProperty("os.arch").toLowerCase();
- if ((os.startsWith("windows") && cpu.equals("x86")) ||
- (os.startsWith("windows") && cpu.equals("arm")) ||
- (os.startsWith("linux") && cpu.equals("i386")) ||
- (os.startsWith("linux") && cpu.equals("x86")) ||
- (os.startsWith("mac os") && cpu.equals("ppc")) ||
- (os.startsWith("mac os") && cpu.equals("i386")) ||
- (os.startsWith("darwin") && cpu.equals("ppc")) ||
- (os.startsWith("darwin") && cpu.equals("i386")) ||
- (os.startsWith("sunos") && cpu.equals("sparc")) ||
- (os.startsWith("sunos") && cpu.equals("x86")) ||
- (os.startsWith("freebsd") && cpu.equals("i386")) ||
- (os.startsWith("hp-ux") && cpu.equals("pa_risc2.0"))) {
- is32Bit = true;
- } else if ((os.startsWith("windows") && cpu.equals("amd64")) ||
- (os.startsWith("linux") && cpu.equals("amd64")) ||
- (os.startsWith("linux") && cpu.equals("x86_64")) ||
- (os.startsWith("linux") && cpu.equals("ia64")) ||
- (os.startsWith("mac os") && cpu.equals("x86_64")) ||
- (os.startsWith("darwin") && cpu.equals("x86_64")) ||
- (os.startsWith("sunos") && cpu.equals("sparcv9")) ||
- (os.startsWith("sunos") && cpu.equals("amd64"))) {
- } else {
- throw new RuntimeException("Please port CPU detection (32/64 bit) to your platform (" + os + "/" + cpu + ")");
+ 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) {}
+
+ if(!done) {
+ // We don't seem to need an AccessController.doPrivileged() block
+ // here as these system properties are visible even to unsigned
+ // applets
+ // Note: this code is replicated in StructLayout.java
+ String os = System.getProperty("os.name").toLowerCase();
+ String cpu = System.getProperty("os.arch").toLowerCase();
+
+ if(!done) {
+ if ((os.startsWith("windows") && cpu.equals("x86")) ||
+ (os.startsWith("windows") && cpu.equals("arm")) ||
+ (os.startsWith("linux") && cpu.equals("i386")) ||
+ (os.startsWith("linux") && cpu.equals("x86")) ||
+ (os.startsWith("mac os") && cpu.equals("ppc")) ||
+ (os.startsWith("mac os") && cpu.equals("i386")) ||
+ (os.startsWith("darwin") && cpu.equals("ppc")) ||
+ (os.startsWith("darwin") && cpu.equals("i386")) ||
+ (os.startsWith("sunos") && cpu.equals("sparc")) ||
+ (os.startsWith("sunos") && cpu.equals("x86")) ||
+ (os.startsWith("freebsd") && cpu.equals("i386")) ||
+ (os.startsWith("hp-ux") && cpu.equals("pa_risc2.0"))) {
+ is32Bit = true;
+ done = true;
+ }
+ }
+
+ if(!done) {
+ if ((os.startsWith("windows") && cpu.equals("amd64")) ||
+ (os.startsWith("linux") && cpu.equals("amd64")) ||
+ (os.startsWith("linux") && cpu.equals("x86_64")) ||
+ (os.startsWith("linux") && cpu.equals("ia64")) ||
+ (os.startsWith("mac os") && cpu.equals("x86_64")) ||
+ (os.startsWith("darwin") && cpu.equals("x86_64")) ||
+ (os.startsWith("sunos") && cpu.equals("sparcv9")) ||
+ (os.startsWith("sunos") && cpu.equals("amd64"))) {
+ is32Bit = false;
+ done = true;
+ }
+ }
+
+ if(!done) {
+ throw new RuntimeException("Please port CPU detection (32/64 bit) to your platform (" + os + "/" + cpu + ")");
+ }
}
}
diff --git a/src/java/com/sun/gluegen/test/TestPointerBufferEndian.java b/src/java/com/sun/gluegen/test/TestPointerBufferEndian.java
index 1c180bd..cd375af 100644
--- a/src/java/com/sun/gluegen/test/TestPointerBufferEndian.java
+++ b/src/java/com/sun/gluegen/test/TestPointerBufferEndian.java
@@ -8,9 +8,10 @@ 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");
String os = System.getProperty("os.name");
String cpu = System.getProperty("os.arch");
- System.out.println("OS: <"+os+"> CPU: <"+cpu+">");
+ System.out.println("OS: <"+os+"> CPU: <"+cpu+"> Bits: <"+bits+">");
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 4f05256..fa28cb6 100644
--- a/src/java/com/sun/gluegen/test/TestStructAccessorEndian.java
+++ b/src/java/com/sun/gluegen/test/TestStructAccessorEndian.java
@@ -7,9 +7,10 @@ import java.nio.*;
public class TestStructAccessorEndian {
public static void main (String args[]) {
boolean ok = true;
+ String bits = 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+">");
+ System.out.println("OS: <"+os+"> CPU: <"+cpu+"> Bits: <"+bits+">");
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);