< prev index next >

test/jdk/java/foreign/TestSpliterator.java

Print this page
M TestSpliterator.java

@@ -33,18 +33,22 @@
 import jdk.incubator.foreign.SequenceLayout;
 
 import java.lang.invoke.VarHandle;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Spliterator;
 import java.util.concurrent.CountedCompleter;
 import java.util.concurrent.RecursiveTask;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
 import java.util.stream.LongStream;
 import java.util.stream.StreamSupport;
 
 import org.testng.annotations.*;
+import static jdk.incubator.foreign.MemorySegment.*;
 import static org.testng.Assert.*;
 
 public class TestSpliterator {
 
     static final VarHandle INT_HANDLE = MemoryLayout.ofSequence(MemoryLayouts.JAVA_INT)

@@ -88,11 +92,11 @@
         }
         long expected = LongStream.range(0, layout.elementCount().getAsLong()).sum();
 
         //check that a segment w/o ACQUIRE access mode can still be used from same thread
         AtomicLong spliteratorSum = new AtomicLong();
-        MemorySegment.spliterator(segment.withAccessModes(MemorySegment.READ), layout)
+        spliterator(segment.withAccessModes(MemorySegment.READ), layout)
                 .forEachRemaining(s -> spliteratorSum.addAndGet(sumSingle(0L, s)));
         assertEquals(spliteratorSum.get(), expected);
     }
 
     static long sumSingle(long acc, MemorySegment segment) {

@@ -198,6 +202,56 @@
                 { 100, 10000 },
                 { 1000, 10000 },
                 { 10000, 10000 },
         };
     }
+
+    static final int ALL_ACCESS_MODES = READ | WRITE | CLOSE | ACQUIRE | HANDOFF;
+
+    @DataProvider(name = "accessScenarios")
+    public Object[][] accessScenarios() {
+        SequenceLayout layout = MemoryLayout.ofSequence(16, MemoryLayouts.JAVA_INT);
+        var mallocSegment = MemorySegment.allocateNative(layout);
+
+        Map<Supplier<Spliterator<MemorySegment>>,Integer> l = Map.of(
+            () -> spliterator(mallocSegment.withAccessModes(ALL_ACCESS_MODES), layout), ALL_ACCESS_MODES,
+            () -> spliterator(mallocSegment.withAccessModes(0), layout), 0,
+            () -> spliterator(mallocSegment.withAccessModes(READ), layout), READ,
+            () -> spliterator(mallocSegment.withAccessModes(CLOSE), layout), 0,
+            () -> spliterator(mallocSegment.withAccessModes(READ|WRITE), layout), READ|WRITE,
+            () -> spliterator(mallocSegment.withAccessModes(READ|WRITE|ACQUIRE), layout), READ|WRITE|ACQUIRE,
+            () -> spliterator(mallocSegment.withAccessModes(READ|WRITE|ACQUIRE|HANDOFF), layout), READ|WRITE|ACQUIRE|HANDOFF
+
+        );
+        return l.entrySet().stream().map(e -> new Object[] { e.getKey(), e.getValue() }).toArray(Object[][]::new);
+    }
+
+    static Consumer<MemorySegment> assertAccessModes(int accessModes) {
+        return segment -> {
+            assertTrue(segment.hasAccessModes(accessModes & ~CLOSE));
+            assertEquals(segment.accessModes(), accessModes & ~CLOSE);
+        };
+    }
+
+    @Test(dataProvider = "accessScenarios")
+    public void testAccessModes(Supplier<Spliterator<MemorySegment>> spliteratorSupplier,
+                                int expectedAccessModes) {
+        Spliterator<MemorySegment> spliterator = spliteratorSupplier.get();
+        spliterator.forEachRemaining(assertAccessModes(expectedAccessModes));
+
+        spliterator = spliteratorSupplier.get();
+        do { } while (spliterator.tryAdvance(assertAccessModes(expectedAccessModes)));
+
+        splitOrConsume(spliteratorSupplier.get(), assertAccessModes(expectedAccessModes));
+    }
+
+    static void splitOrConsume(Spliterator<MemorySegment> spliterator,
+                               Consumer<MemorySegment> consumer) {
+        var s1 = spliterator.trySplit();
+        if (s1 != null) {
+            splitOrConsume(s1, consumer);
+            splitOrConsume(spliterator, consumer);
+        } else {
+            spliterator.forEachRemaining(consumer);
+        }
+    }
 }
< prev index next >