8000 Preserve direct buffer marks in Pointer.toBuffer by RicheyWorks · Pull Request #49 · jcuda/jcuda · GitHub
[go: up one dir, main page]

Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions JCudaJava/src/main/java/jcuda/Pointer.java
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ public static Pointer to(Buffer buffer)
* <br />
* Note that this method takes into account the array offset and position
* of the given buffer, in contrast to the {@link #to(Buffer)} method.
* The position, limit, and mark of the given buffer are not modified.
*
* @param buffer The buffer
* @return The new pointer
Expand Down Expand Up @@ -234,11 +235,11 @@ private static Pointer computePointer(ByteBuffer buffer)
Pointer result = null;
if (buffer.isDirect())
{
buffer = buffer.duplicate();
int oldPosition = buffer.position();
buffer.position(0);
result = Pointer.to(buffer.slice()).withByteOffset(
oldPosition * Sizeof.BYTE);
buffer.position(oldPosition);
}
else if (buffer.hasArray())
{
Expand All @@ -265,11 +266,11 @@ private static Pointer computePointer(ShortBuffer buffer)
Pointer result = null;
if (buffer.isDirect())
{
buffer = buffer.duplicate();
int oldPosition = buffer.position();
buffer.position(0);
result = Pointer.to(buffer.slice()).withByteOffset(
oldPosition * Sizeof.SHORT);
buffer.position(oldPosition);
}
else if (buffer.hasArray())
{
Expand All @@ -296,11 +297,11 @@ private static Pointer computePointer(IntBuffer buffer)
Pointer result = null;
if (buffer.isDirect())
{
buffer = buffer.duplicate();
int oldPosition = buffer.position();
buffer.position(0);
result = Pointer.to(buffer.slice()).withByteOffset(
oldPosition * Sizeof.INT);
buffer.position(oldPosition);
}
else if (buffer.hasArray())
{
Expand All @@ -327,11 +328,11 @@ private static Pointer computePointer(LongBuffer buffer)
Pointer result = null;
if (buffer.isDirect())
{
buffer = buffer.duplicate();
int oldPosition = buffer.position();
buffer.position(0);
result = Pointer.to(buffer.slice()).withByteOffset(
oldPosition * Sizeof.LONG);
buffer.position(oldPosition);
}
else if (buffer.hasArray())
{
Expand All @@ -358,11 +359,11 @@ private static Pointer computePointer(FloatBuffer buffer)
Pointer result = null;
if (buffer.isDirect())
{
buffer = buffer.duplicate();
int oldPosition = buffer.position();
buffer.position(0);
result = Pointer.to(buffer.slice()).withByteOffset(
oldPosition * Sizeof.FLOAT);
buffer.position(oldPosition);
}
else if (buffer.hasArray())
{
Expand All @@ -389,11 +390,11 @@ private static Pointer computePointer(DoubleBuffer buffer)
Pointer result = null;
if (buffer.isDirect())
{
buffer = buffer.duplicate();
int oldPosition = buffer.position();
buffer.position(0);
result = Pointer.to(buffer.slice()).withByteOffset(
oldPosition * Sizeof.DOUBLE);
buffer.position(oldPosition);
}
else if (buffer.hasArray())
{
Expand Down
79 changes: 79 additions & 0 deletions JCudaJava/src/test/java/jcuda/test/PointerBufferStateTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
* JCuda - Java bindings for CUDA
*
* http://www.jcuda.org
*/

package jcuda.test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import jcuda.Pointer;

/**
* Tests that creating pointers does not modify caller-owned buffer state.
* These tests do not load CUDA or require a GPU.
*/
@RunWith(Parameterized.class)
public class PointerBufferStateTest
{
@Parameters(name = "{0}")
public static Collection<Object[]> buffers()
{
ByteBuffer bytes = ByteBuffer.allocateDirect(128)
.order(ByteOrder.nativeOrder());
// Use nonzero slice origins as well as nonzero buffer positions.
bytes.position(16);
ByteBuffer slice = bytes.slice().order(ByteOrder.nativeOrder());
return Arrays.asList(new Object[][] {
{ "byte", bytes },
{ "short", bytes.asShortBuffer() },
{ "int", bytes.asIntBuffer() },
{ "long", bytes.asLongBuffer() },
{ "float", bytes.asFloatBuffer() },
{ "double", bytes.asDoubleBuffer() },
{ "byte slice", slice },
{ "short slice", slice.asShortBuffer() },
{ "int slice", slice.asIntBuffer() },
{ "long slice", slice.asLongBuffer() },
{ "float slice", slice.asFloatBuffer() },
{ "double slice", slice.asDoubleBuffer() },
{ "read-only byte", slice.asReadOnlyBuffer() }
});
}

private final Buffer buffer;

public PointerBufferStateTest(String name, Buffer buffer)
{
this.buffer = buffer;
}

@Test
public void testToBufferPreservesMarkPositionAndLimit()
{
buffer.limit(8);
buffer.position(2);
buffer.mark();
buffer.position(4);

assertNotNull(Pointer.toBuffer(buffer));

assertEquals(4, buffer.position());
assertEquals(8, buffer.limit());
buffer.reset();
assertEquals(2, buffer.position());
}
}
0