diff a/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java b/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java --- a/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java +++ b/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java @@ -30,10 +30,11 @@ import jdk.incubator.foreign.SequenceLayout; import jdk.internal.access.JavaNioAccess; import jdk.internal.access.SharedSecrets; import jdk.internal.access.foreign.MemorySegmentProxy; import jdk.internal.access.foreign.UnmapperProxy; +import jdk.internal.misc.Unsafe; import jdk.internal.vm.annotation.ForceInline; import sun.security.action.GetPropertyAction; import java.lang.invoke.VarHandle; import java.nio.ByteBuffer; @@ -53,10 +54,12 @@ * are defined for each memory segment kind, see {@link NativeMemorySegmentImpl}, {@link HeapMemorySegmentImpl} and * {@link MappedMemorySegmentImpl}. */ public abstract class AbstractMemorySegmentImpl implements MemorySegment, MemorySegmentProxy { + private static final Unsafe UNSAFE = Unsafe.getUnsafe(); + private static final boolean enableSmallSegments = Boolean.parseBoolean(GetPropertyAction.privilegedGetProperty("jdk.incubator.foreign.SmallSegments", "true")); final static int ACCESS_MASK = READ | WRITE | CLOSE | ACQUIRE | HANDOFF; final static int FIRST_RESERVED_FLAG = 1 << 16; // upper 16 bits are reserved @@ -111,10 +114,19 @@ } return (Spliterator)new SegmentSplitter(sequenceLayout.elementLayout().byteSize(), sequenceLayout.elementCount().getAsLong(), (AbstractMemorySegmentImpl)segment.withAccessModes(segment.accessModes() & ~CLOSE)); } + public static void fill(MemorySegment segment, byte value) { + AbstractMemorySegmentImpl segmentImpl = (AbstractMemorySegmentImpl) segment; + segmentImpl.checkValidState(); + if (!segmentImpl.isSet(WRITE)) { + throw segmentImpl.unsupportedAccessMode(WRITE); + } + UNSAFE.setMemory(segmentImpl.base(), segmentImpl.min(), segmentImpl.length, value); + } + @Override @ForceInline public final MemoryAddress baseAddress() { return new MemoryAddressImpl(this, 0); }