
This pull request adds an arraylist of type Buffer to the Request class. Whenever a request object is created that has associated buffers, the buffers should be added to this array list so the java garbage collector does not dispose of the buffers prematurely. This is a more robust expansion on the idea first proposed by @ggouaillardet Fixes #369 Signed-off-by: Nathaniel Graham <ngraham@lanl.gov>
164 строки
4.3 KiB
Java
164 строки
4.3 KiB
Java
/*
|
|
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
|
|
* University Research and Technology
|
|
* Corporation. All rights reserved.
|
|
* Copyright (c) 2004-2005 The University of Tennessee and The University
|
|
* of Tennessee Research Foundation. All rights
|
|
* reserved.
|
|
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
|
* University of Stuttgart. All rights reserved.
|
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
|
* All rights reserved.
|
|
* Copyright (c) 2015 Los Alamos National Security, LLC. All rights
|
|
* reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*
|
|
*
|
|
* IMPLEMENTATION DETAILS
|
|
*
|
|
* All methods with buffers that can be direct or non direct have
|
|
* a companion argument 'db' which is true if the buffer is direct.
|
|
*
|
|
* Checking if a buffer is direct is faster in Java than C.
|
|
*/
|
|
|
|
package mpi;
|
|
|
|
import java.nio.*;
|
|
import static mpi.MPI.assertDirectBuffer;
|
|
|
|
/**
|
|
* This class represents {@code MPI_Message}.
|
|
*/
|
|
public final class Message
|
|
{
|
|
protected long handle;
|
|
private static long NULL, NO_PROC;
|
|
|
|
static
|
|
{
|
|
init();
|
|
}
|
|
|
|
private static native void init();
|
|
|
|
/**
|
|
* Creates a {@code MPI_MESSAGE_NULL}.
|
|
*/
|
|
public Message()
|
|
{
|
|
handle = NULL;
|
|
}
|
|
|
|
/**
|
|
* Tests if the message is {@code MPI_MESSAGE_NULL}.
|
|
* @return true if the message is {@code MPI_MESSAGE_NULL}.
|
|
*/
|
|
public boolean isNull()
|
|
{
|
|
return handle == NULL;
|
|
}
|
|
|
|
/**
|
|
* Tests if the message is {@code MPI_MESSAGE_NO_PROC}.
|
|
* @return true if the message is {@code MPI_MESSAGE_NO_PROC}.
|
|
*/
|
|
public boolean isNoProc()
|
|
{
|
|
return handle == NO_PROC;
|
|
}
|
|
|
|
/**
|
|
* Java binding of {@code MPI_MPROBE}.
|
|
* @param source rank of the source
|
|
* @param tag message tag
|
|
* @param comm communicator
|
|
* @return status object
|
|
* @throws MPIException Signals that an MPI exception of some sort has occurred.
|
|
*/
|
|
public Status mProbe(int source, int tag, Comm comm) throws MPIException
|
|
{
|
|
MPI.check();
|
|
Status status = new Status();
|
|
handle = mProbe(source, tag, comm.handle, status.data);
|
|
return status;
|
|
}
|
|
|
|
private native long mProbe(int source, int tag, long comm, long[] status)
|
|
throws MPIException;
|
|
|
|
/**
|
|
* Java binding of {@code MPI_IMPROBE}.
|
|
* @param source rank of the source
|
|
* @param tag message tag
|
|
* @param comm communicator
|
|
* @return status object if there is a message, {@code null} otherwise
|
|
* @throws MPIException Signals that an MPI exception of some sort has occurred.
|
|
*/
|
|
public Status imProbe(int source, int tag, Comm comm) throws MPIException
|
|
{
|
|
MPI.check();
|
|
return imProbe(source, tag, comm.handle);
|
|
}
|
|
|
|
private native Status imProbe(int source, int tag, long comm)
|
|
throws MPIException;
|
|
|
|
/**
|
|
* Java binding of {@code MPI_MRECV}.
|
|
* @param buf receive buffer
|
|
* @param count number of elements in receve buffer
|
|
* @param type datatype of each receive buffer element
|
|
* @return status object
|
|
* @throws MPIException Signals that an MPI exception of some sort has occurred.
|
|
*/
|
|
public Status mRecv(Object buf, int count, Datatype type) throws MPIException
|
|
{
|
|
MPI.check();
|
|
int off = 0;
|
|
boolean db = false;
|
|
Status status = new Status();
|
|
|
|
if(buf instanceof Buffer && !(db = ((Buffer)buf).isDirect()))
|
|
{
|
|
off = type.getOffset(buf);
|
|
buf = ((Buffer)buf).array();
|
|
}
|
|
|
|
handle = mRecv(handle, buf, db, off, count,
|
|
type.handle, type.baseType, status.data);
|
|
|
|
return status;
|
|
}
|
|
|
|
private native long mRecv(
|
|
long message, Object buf, boolean db, int offset, int count,
|
|
long type, int baseType, long[] status) throws MPIException;
|
|
|
|
/**
|
|
* Java binding of {@code MPI_IMRECV}.
|
|
* @param buf receive buffer
|
|
* @param count number of elements in receve buffer
|
|
* @param type datatype of each receive buffer element
|
|
* @return request object
|
|
* @throws MPIException Signals that an MPI exception of some sort has occurred.
|
|
*/
|
|
public Request imRecv(Buffer buf, int count, Datatype type)
|
|
throws MPIException
|
|
{
|
|
MPI.check();
|
|
assertDirectBuffer(buf);
|
|
Request req = new Request(imRecv(handle, buf, count, type.handle));
|
|
req.addRecvBufRef(buf);
|
|
return req;
|
|
}
|
|
|
|
private native long imRecv(long message, Object buf, int count, long type)
|
|
throws MPIException;
|
|
|
|
} // Message
|