Author: mturk
Date: Mon Jun 22 07:09:33 2009
New Revision: 787155
URL: http://svn.apache.org/viewvc?rev=787155&view=rev
Log:
Use provided native structure alignment
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/AbstractStructure.java
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure32.java
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure64.java
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestStructure.java
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/AbstractStructure.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/AbstractStructure.java?rev=787155&r1=787154&r2=787155&view=diff
==============================================================================
---
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/AbstractStructure.java
(original)
+++
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/AbstractStructure.java
Mon Jun 22 07:09:33 2009
@@ -44,7 +44,7 @@
{
sizeof = 0;
count = 0;
- align = 4;
+ align = Platform.STRUCT_ALIGN;
}
private void init()
@@ -84,7 +84,6 @@
" has invalid class signature");
}
asizes[i] = getArrayElementLength(f, this);
- align = Math.max(align, esizes[i]);
}
}
}
@@ -100,19 +99,17 @@
// where align is primitive element size
//
// sizeof += (sizeof + esizes[i]) % esizes[i];
- sizeof = esizes[i] + ((sizeof - 1) & ~(esizes[i] - 1));
+ if (esizes[i] > align) {
+ sizeof = align + ((sizeof - 1) & ~(align - 1));
+ }
+ else
+ sizeof = esizes[i] + ((sizeof - 1) & ~(esizes[i] - 1));
offset[i] = sizeof;
if (asizes[i] > 0)
sizeof += (esizes[i] * asizes[i]);
else
sizeof += esizes[i];
}
- if (align > Pointer.SIZEOF) {
- // Align to the pointer size except
- // for the structures which elements are not
- // larger then a size of a pointer.
- align = Pointer.SIZEOF;
- }
sizeof = align(sizeof, align);
}
inited = true;
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure32.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure32.java?rev=787155&r1=787154&r2=787155&view=diff
==============================================================================
---
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure32.java
(original)
+++
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure32.java
Mon Jun 22 07:09:33 2009
@@ -26,6 +26,7 @@
class Structure32 extends Structure {
private Pointer32 POINTER;
+ private static final int amask = Platform.STRUCT_ALIGN - 1;
protected Structure32(Pointer32 ptr)
{
@@ -134,7 +135,7 @@
throw new NullPointerException();
else if (index < 0 || (index + 8) > POINTER.PLENGTH)
throw new IndexOutOfBoundsException();
- else if ((index & 0x07) != 0)
+ else if ((index & amask) != 0)
throw new UnalignedMemoryException();
return peek3(POINTER.POINTER + index);
}
@@ -160,7 +161,7 @@
throw new NullPointerException();
else if (index < 0 || (index + 8) > POINTER.PLENGTH)
throw new IndexOutOfBoundsException();
- else if ((index & 0x07) != 0)
+ else if ((index & amask) != 0)
throw new UnalignedMemoryException();
return peek5(POINTER.POINTER + index);
}
@@ -222,7 +223,7 @@
throw new NullPointerException();
else if (index < 0 || (index + 8) > POINTER.PLENGTH)
throw new IndexOutOfBoundsException();
- else if ((index & 0x07) != 0)
+ else if ((index & amask) != 0)
throw new UnalignedMemoryException();
poke3(POINTER.POINTER + index, value);
}
@@ -235,7 +236,7 @@
throw new NullPointerException();
else if (index < 0 || (index + 8) > POINTER.PLENGTH)
throw new IndexOutOfBoundsException();
- else if ((index & 0x07) != 0)
+ else if ((index & amask) != 0)
throw new UnalignedMemoryException();
poke5(POINTER.POINTER + index, value);
}
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure64.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure64.java?rev=787155&r1=787154&r2=787155&view=diff
==============================================================================
---
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure64.java
(original)
+++
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure64.java
Mon Jun 22 07:09:33 2009
@@ -26,6 +26,7 @@
class Structure64 extends Structure {
private Pointer64 POINTER;
+ private static final int amask = Platform.STRUCT_ALIGN - 1;
protected Structure64(Pointer64 ptr)
{
@@ -72,7 +73,7 @@
throw new NullPointerException();
else if (index < 0L || (index + 8) > POINTER.PLENGTH)
throw new IndexOutOfBoundsException();
- else if ((index & 0x07) != 0)
+ else if ((index & amask) != 0)
throw new UnalignedMemoryException();
return get0(POINTER.POINTER + index);
}
@@ -85,7 +86,7 @@
throw new NullPointerException();
else if (index < 0L || (index + 8) > POINTER.PLENGTH)
throw new IndexOutOfBoundsException();
- else if ((index & 0x07) != 0)
+ else if ((index & amask) != 0)
throw new UnalignedMemoryException();
poke3(POINTER.POINTER + index, ((Pointer64)v).POINTER);
}
@@ -134,7 +135,7 @@
throw new NullPointerException();
else if (index < 0L || (index + 8) > POINTER.PLENGTH)
throw new IndexOutOfBoundsException();
- else if ((index & 0x07) != 0)
+ else if ((index & amask) != 0)
throw new UnalignedMemoryException();
return peek3(POINTER.POINTER + index);
}
@@ -160,7 +161,7 @@
throw new NullPointerException();
else if (index < 0L || (index + 8) > POINTER.PLENGTH)
throw new IndexOutOfBoundsException();
- else if ((index & 0x07) != 0)
+ else if ((index & amask) != 0)
throw new UnalignedMemoryException();
return peek5(POINTER.POINTER + index);
}
@@ -222,7 +223,7 @@
throw new NullPointerException();
else if (index < 0L || (index + 8) > POINTER.PLENGTH)
throw new IndexOutOfBoundsException();
- else if ((index & 0x07) != 0)
+ else if ((index & amask) != 0)
throw new UnalignedMemoryException();
poke3(POINTER.POINTER + index, value);
}
@@ -235,7 +236,7 @@
throw new NullPointerException();
else if (index < 0L || (index + 8) > POINTER.PLENGTH)
throw new IndexOutOfBoundsException();
- else if ((index & 0x07) != 0)
+ else if ((index & amask) != 0)
throw new UnalignedMemoryException();
poke5(POINTER.POINTER + index, value);
}
Modified:
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestStructure.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestStructure.java?rev=787155&r1=787154&r2=787155&view=diff
==============================================================================
---
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestStructure.java
(original)
+++
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestStructure.java
Mon Jun 22 07:09:33 2009
@@ -73,11 +73,11 @@
@OffsetOf(0)
public int I1FIELD;
- @OffsetOf(4) // 8
+ @OffsetOf(4) // 4 or 8 depending on alignment
public long L1FIELD;
- @OffsetOf(8) // 16
+ @OffsetOf(12) // 12 or 16
public long L2FIELD;
- @OffsetOf(12) // 20
+ @OffsetOf(20) // 20 or 24
public char C1FIELD;
}
@@ -147,7 +147,7 @@
{
MyUStructure s = new MyUStructure();
assertEquals("Fields", 4, s.count());
- assertEquals("Sizeof", 28, s.sizeof());
+ assertEquals("Sizeof", 20 + Platform.STRUCT_ALIGN, s.sizeof());
}
public void testOffset()
@@ -155,7 +155,7 @@
{
MyUStructure s = new MyUStructure();
assertEquals("Fields", 4, s.count());
- assertEquals("OffsetOf", 24, s.offsetof("C1FIELD"));
+ assertEquals("OffsetOf", 16 + Platform.STRUCT_ALIGN,
s.offsetof("C1FIELD"));
assertEquals("OffsetOf", -1, s.offsetof("Unknown"));
}