< prev index next >

src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java

Print this page
@@ -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<S>)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);
      }
< prev index next >