[foreign-memaccess] RFR 8234644: Misc cleanup of the memory access API implementation
Paul Sandoz
paul.sandoz at oracle.com
Fri Nov 22 18:30:27 UTC 2019
Just some small stuff and some observations.
Paul.
X-ScopedBuffer.java.template
—
+/**
+ * This class decorated the ByteBuffer class, by adding checks for the validity of the temporal bounds associated
+ * with the underlying memory segment.
+ */
class Scoped$Type$Buffer extends $Type$Buffer {
s/decorated/decorates
MemoryScope.java
—
MemoryScope acquire() {
if (activeCount.updateAndGet(i -> i == CLOSED ? CLOSED : ++i) == CLOSED) {
//cannot get here - segment is not alive!
throw new IllegalStateException();
}
return new MemoryScope(ref, this::release);
}
Can you add a “fixme” comment about overflow? it's rare but possible. An easy fix would be to switch the count to be a long.
Separately, later on we can improve on the footprint of the memory scope if needed, both in the use of an Atomic* and a Runnable (possible tradeoff with two impls, the root scope and the acquired scope).
MemorySegmentImpl.java
—
+ private void checkIntSize(String typeName) {
+ if (length > Integer.MAX_VALUE) {
+ throw new UnsupportedOperationException(String.format("Segment is too large to wrap as %s. Size: %d", typeName, length));
+ }
+ }
FWIW the max array length may actually be slightly less than Integer.MAX_VALUE due to VM restrictions. If a purpose here is to avoid an OOME in the case of allocating a byte[], then we might want to conservatively limit to say Integer.MAX_VALUE - 8 (as is done in ArrayDeque, ConcurrentHashMap etc) (Ideally we should have a method in say Unsafe that tells us what the max array length can be.)
LayoutPath.java
—
Possible optimize the scales type from List<Long> to long[]
149 public static LayoutPathImpl nestedPath(MemoryLayout layout, long offset, List<Long> scales, LayoutPathImpl encl) {
150 return new LayoutPathImpl(layout, offset, scales, encl);
151 }
Can be private?
MemoryHandkes.java
—
public final class MemoryHandles {
private static JavaLangInvokeAccess JLI = SharedSecrets.getJavaLangInvokeAccess();
Make JLS field final
ForeignUnsafe
—
/**
* Obtain the offset associated with this address. If {@link #getUnsafeBase(MemoryAddress)} returns {@null} on the passed
s/{@ null}/{@code null}
AbstractLayout
—
void checkAlignment(long alignmentBitCount) {
if (alignmentBitCount <= 0 || //alignment must be positive
((alignmentBitCount & (alignmentBitCount - 1)) != 0L) || //alignment must be a power of two
(alignmentBitCount < 8)) { //alignment must be greater than 8
throw new IllegalArgumentException("Invalid alignment: " + alignmentBitCount);
}
}
First check is redundant, dominated by the last check.
> On Nov 22, 2019, at 4:34 AM, Maurizio Cimadamore <maurizio.cimadamore at oracle.com> wrote:
>
> Hi,
> now that the API javadoc is mostly in shape, I wanted to do a pass over the implementation, to make sure that classes have at least some minimal documentation, and that methods inside the impl classes are organized in a meaningful way (this should help the review process a bit).
>
> Webrev:
>
> http://cr.openjdk.java.net/~mcimadamore/panama/8234644/
>
> Cheers
> Maurizio
>
More information about the panama-dev
mailing list