diff --git a/ompi/mpi/java/java/Comm.java b/ompi/mpi/java/java/Comm.java index c8693153f2..0b37ca806c 100644 --- a/ompi/mpi/java/java/Comm.java +++ b/ompi/mpi/java/java/Comm.java @@ -152,7 +152,7 @@ public class Comm implements Freeable, Cloneable } protected final native long[] iDup(long comm) throws MPIException; - + /** * Duplicates this communicator with the info object used in the call. *
Java binding of {@code MPI_COMM_DUP_WITH_INFO}. @@ -162,12 +162,12 @@ public class Comm implements Freeable, Cloneable */ public Comm dupWithInfo(Info info) throws MPIException { - MPI.check(); - return new Comm(dupWithInfo(handle, info.handle)); + MPI.check(); + return new Comm(dupWithInfo(handle, info.handle)); } protected final native long dupWithInfo(long comm, long info) throws MPIException; - + /** * Returns the associated request to this communicator if it was * created using {@link #iDup}. @@ -641,7 +641,9 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - return new Request(iSend(handle, buf, count, type.handle, dest, tag)); + Request req = new Request(iSend(handle, buf, count, type.handle, dest, tag)); + req.addSendBufRef(buf); + return req; } private native long iSend( @@ -666,7 +668,9 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - return new Request(ibSend(handle, buf, count, type.handle, dest, tag)); + Request req = new Request(ibSend(handle, buf, count, type.handle, dest, tag)); + req.addSendBufRef(buf); + return req; } private native long ibSend( @@ -691,7 +695,9 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - return new Request(isSend(handle, buf, count, type.handle, dest, tag)); + Request req = new Request(isSend(handle, buf, count, type.handle, dest, tag)); + req.addSendBufRef(buf); + return req; } private native long isSend( @@ -716,7 +722,9 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - return new Request(irSend(handle, buf, count, type.handle, dest, tag)); + Request req = new Request(irSend(handle, buf, count, type.handle, dest, tag)); + req.addSendBufRef(buf); + return req; } private native long irSend( @@ -741,7 +749,9 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - return new Request(iRecv(handle, buf, count, type.handle, source, tag)); + Request req = new Request(iRecv(handle, buf, count, type.handle, source, tag)); + req.addRecvBufRef(buf); + return req; } private native long iRecv( @@ -769,7 +779,9 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - return new Prequest(sendInit(handle, buf, count, type.handle, dest, tag)); + Prequest preq = new Prequest(sendInit(handle, buf, count, type.handle, dest, tag)); + preq.addSendBufRef(buf); + return preq; } private native long sendInit( @@ -794,7 +806,9 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - return new Prequest(bSendInit(handle, buf, count, type.handle, dest, tag)); + Prequest preq = new Prequest(bSendInit(handle, buf, count, type.handle, dest, tag)); + preq.addSendBufRef(buf); + return preq; } private native long bSendInit( @@ -819,7 +833,9 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - return new Prequest(sSendInit(handle, buf, count, type.handle, dest, tag)); + Prequest preq = new Prequest(sSendInit(handle, buf, count, type.handle, dest, tag)); + preq.addSendBufRef(buf); + return preq; } private native long sSendInit( @@ -844,7 +860,9 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - return new Prequest(rSendInit(handle, buf, count, type.handle, dest, tag)); + Prequest preq = new Prequest(rSendInit(handle, buf, count, type.handle, dest, tag)); + preq.addSendBufRef(buf); + return preq; } private native long rSendInit( @@ -869,7 +887,9 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - return new Prequest(recvInit(handle, buf, count, type.handle, source, tag)); + Prequest preq = new Prequest(recvInit(handle, buf, count, type.handle, source, tag)); + preq.addRecvBufRef(buf); + return preq; } private native long recvInit( @@ -1252,7 +1272,9 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - return new Request(iBcast(handle, buf, count, type.handle, root)); + Request req = new Request(iBcast(handle, buf, count, type.handle, root)); + req.addSendBufRef(buf); + return req; } private native long iBcast( @@ -1358,9 +1380,11 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iGather(handle, sendbuf, sendcount, sendtype.handle, + Request req = new Request(iGather(handle, sendbuf, sendcount, sendtype.handle, recvbuf, recvcount, recvtype.handle, root)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } /** @@ -1381,9 +1405,10 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - - return new Request(iGather(handle, null, 0, 0, + Request req = new Request(iGather(handle, null, 0, 0, buf, count, type.handle, root)); + req.addRecvBufRef(buf); + return req; } private native long iGather( @@ -1527,10 +1552,11 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iGatherv( + Request req = new Request(iGatherv( handle, sendbuf, sendcount, sendtype.handle, recvbuf, recvcount, displs, recvtype.handle, root)); + req.addSendBufRef(sendbuf); + return req; } /** @@ -1553,9 +1579,10 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(recvbuf); - - return new Request(iGatherv(handle, null, 0, 0, + Request req = new Request(iGatherv(handle, null, 0, 0, recvbuf, recvcount, displs, recvtype.handle, root)); + req.addRecvBufRef(recvbuf); + return req; } /** @@ -1577,9 +1604,10 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf); - - return new Request(iGatherv(handle, sendbuf, sendcount, sendtype.handle, + Request req = new Request(iGatherv(handle, sendbuf, sendcount, sendtype.handle, null, null, null, 0, root)); + req.addSendBufRef(sendbuf); + return req; } private native long iGatherv( @@ -1686,9 +1714,11 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iScatter(handle, sendbuf, sendcount, sendtype.handle, + Request req = new Request(iScatter(handle, sendbuf, sendcount, sendtype.handle, recvbuf, recvcount, recvtype.handle, root)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } /** @@ -1709,9 +1739,10 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - - return new Request(iScatter(handle, buf, count, type.handle, + Request req = new Request(iScatter(handle, buf, count, type.handle, null, 0, 0, root)); + req.addSendBufRef(buf); + return req; } private native long iScatter( @@ -1852,10 +1883,12 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iScatterv( + Request req = new Request(iScatterv( handle, sendbuf, sendcount, displs, sendtype.handle, recvbuf, recvcount, recvtype.handle, root)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } /** @@ -1877,9 +1910,10 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf); - - return new Request(iScatterv(handle, sendbuf, sendcount, displs, + Request req = new Request(iScatterv(handle, sendbuf, sendcount, displs, sendtype.handle, null, 0, 0, root)); + req.addSendBufRef(sendbuf); + return req; } /** @@ -1900,9 +1934,10 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(recvbuf); - - return new Request(iScatterv(handle, null, null, null, 0, + Request req = new Request(iScatterv(handle, null, null, null, 0, recvbuf, recvcount, recvtype.handle, root)); + req.addRecvBufRef(recvbuf); + return req; } private native long iScatterv( @@ -2002,9 +2037,11 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iAllGather(handle, sendbuf, sendcount, sendtype.handle, + Request req = new Request(iAllGather(handle, sendbuf, sendcount, sendtype.handle, recvbuf, recvcount, recvtype.handle)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } /** @@ -2022,7 +2059,9 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - return new Request(iAllGather(handle, null, 0, 0, buf, count, type.handle)); + Request req = new Request(iAllGather(handle, null, 0, 0, buf, count, type.handle)); + req.addRecvBufRef(buf); + return req; } private native long iAllGather( @@ -2127,10 +2166,12 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iAllGatherv( + Request req = new Request(iAllGatherv( handle, sendbuf, sendcount, sendtype.handle, recvbuf, recvcount, displs, recvtype.handle)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } /** @@ -2150,9 +2191,10 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(buf); - - return new Request(iAllGatherv( + Request req = new Request(iAllGatherv( handle, null, 0, 0, buf, count, displs, type.handle)); + req.addRecvBufRef(buf); + return req; } private native long iAllGatherv( @@ -2227,9 +2269,11 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iAllToAll(handle, sendbuf, sendcount, sendtype.handle, + Request req = new Request(iAllToAll(handle, sendbuf, sendcount, sendtype.handle, recvbuf, recvcount, recvtype.handle)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } private native long iAllToAll( @@ -2312,10 +2356,12 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iAllToAllv( + Request req = new Request(iAllToAllv( handle, sendbuf, sendcount, sdispls, sendtype.handle, recvbuf, recvcount, rdispls, recvtype.handle)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } private native long iAllToAllv(long comm, @@ -2385,10 +2431,12 @@ public class Comm implements Freeable, Cloneable long[] sendHandles = convertTypeArray(sendTypes); long[] recvHandles = convertTypeArray(recvTypes); - - return new Request(iAllToAllw( + Request req = new Request(iAllToAllw( handle, sendBuf, sendCount, sDispls, sendHandles, recvBuf, recvCount, rDispls, recvHandles)); + req.addSendBufRef(sendBuf); + req.addRecvBufRef(recvBuf); + return req; } private native long iAllToAllw(long comm, @@ -2462,10 +2510,12 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iNeighborAllGather( + Request req = new Request(iNeighborAllGather( handle, sendbuf, sendcount, sendtype.handle, recvbuf, recvcount, recvtype.handle)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } private native long iNeighborAllGather( @@ -2540,10 +2590,12 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iNeighborAllGatherv( + Request req = new Request(iNeighborAllGatherv( handle, sendbuf, sendcount, sendtype.handle, recvbuf, recvcount, displs, recvtype.handle)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } private native long iNeighborAllGatherv( @@ -2617,10 +2669,12 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iNeighborAllToAll( + Request req = new Request(iNeighborAllToAll( handle, sendbuf, sendcount, sendtype.handle, recvbuf, recvcount, recvtype.handle)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } private native long iNeighborAllToAll( @@ -2698,10 +2752,12 @@ public class Comm implements Freeable, Cloneable { MPI.check(); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iNeighborAllToAllv( + Request req = new Request(iNeighborAllToAllv( handle, sendbuf, sendcount, sdispls, sendtype.handle, recvbuf, recvcount, rdispls, recvtype.handle)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } private native long iNeighborAllToAllv( @@ -2815,10 +2871,12 @@ public class Comm implements Freeable, Cloneable MPI.check(); assertDirectBuffer(sendbuf, recvbuf); op.setDatatype(type); - - return new Request(iReduce( + Request req = new Request(iReduce( handle, sendbuf, recvbuf, count, type.handle, type.baseType, op, op.handle, root)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } /** @@ -2842,10 +2900,11 @@ public class Comm implements Freeable, Cloneable MPI.check(); assertDirectBuffer(buf); op.setDatatype(type); - - return new Request(iReduce( + Request req = new Request(iReduce( handle, null, buf, count, type.handle, type.baseType, op, op.handle, root)); + req.addSendBufRef(buf); + return req; } private native long iReduce( @@ -2946,9 +3005,11 @@ public class Comm implements Freeable, Cloneable MPI.check(); assertDirectBuffer(sendbuf, recvbuf); op.setDatatype(type); - - return new Request(iAllReduce(handle, sendbuf, recvbuf, count, + Request req = new Request(iAllReduce(handle, sendbuf, recvbuf, count, type.handle, type.baseType, op, op.handle)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } /** @@ -2969,10 +3030,11 @@ public class Comm implements Freeable, Cloneable MPI.check(); op.setDatatype(type); assertDirectBuffer(buf); - - return new Request(iAllReduce( + Request req = new Request(iAllReduce( handle, null, buf, count, type.handle, type.baseType, op, op.handle)); + req.addRecvBufRef(buf); + return req; } private native long iAllReduce( @@ -3075,10 +3137,12 @@ public class Comm implements Freeable, Cloneable MPI.check(); op.setDatatype(type); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iReduceScatter( + Request req = new Request(iReduceScatter( handle, sendbuf, recvbuf, recvcounts, type.handle, type.baseType, op, op.handle)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } /** @@ -3101,10 +3165,11 @@ public class Comm implements Freeable, Cloneable MPI.check(); op.setDatatype(type); assertDirectBuffer(buf); - - return new Request(iReduceScatter( + Request req = new Request(iReduceScatter( handle, null, buf, counts, type.handle, type.baseType, op, op.handle)); + req.addRecvBufRef(buf); + return req; } private native long iReduceScatter( @@ -3202,10 +3267,12 @@ public class Comm implements Freeable, Cloneable MPI.check(); op.setDatatype(type); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iReduceScatterBlock( + Request req = new Request(iReduceScatterBlock( handle, sendbuf, recvbuf, recvcount, type.handle, type.baseType, op, op.handle)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } /** @@ -3226,10 +3293,11 @@ public class Comm implements Freeable, Cloneable MPI.check(); op.setDatatype(type); assertDirectBuffer(buf); - - return new Request(iReduceScatterBlock( + Request req = new Request(iReduceScatterBlock( handle, null, buf, count, type.handle, type.baseType, op, op.handle)); + req.addRecvBufRef(buf); + return req; } private native long iReduceScatterBlock( diff --git a/ompi/mpi/java/java/File.java b/ompi/mpi/java/java/File.java index 1ac9564b09..3309c62377 100644 --- a/ompi/mpi/java/java/File.java +++ b/ompi/mpi/java/java/File.java @@ -396,7 +396,9 @@ public final class File { MPI.check(); assertDirectBuffer(buf); - return new Request(iReadAt(handle, offset, buf, count, type.handle)); + Request req = new Request(iReadAt(handle, offset, buf, count, type.handle)); + req.addRecvBufRef(buf); + return req; } private native long iReadAt( @@ -417,7 +419,9 @@ public final class File { MPI.check(); assertDirectBuffer(buf); - return new Request(iWriteAt(handle, offset, buf, count, type.handle)); + Request req = new Request(iWriteAt(handle, offset, buf, count, type.handle)); + req.addSendBufRef(buf); + return req; } private native long iWriteAt( @@ -552,7 +556,9 @@ public final class File { MPI.check(); assertDirectBuffer(buf); - return new Request(iRead(handle, buf, count, type.handle)); + Request req = new Request(iRead(handle, buf, count, type.handle)); + req.addRecvBufRef(buf); + return req; } private native long iRead(long fh, Buffer buf, int count, long type) @@ -570,7 +576,9 @@ public final class File { MPI.check(); assertDirectBuffer(buf); - return new Request(iWrite(handle, buf, count, type.handle)); + Request req = new Request(iWrite(handle, buf, count, type.handle)); + req.addRecvBufRef(buf); + return req; } private native long iWrite(long fh, Buffer buf, int count, long type) @@ -694,7 +702,9 @@ public final class File { MPI.check(); assertDirectBuffer(buf); - return new Request(iReadShared(handle, buf, count, type.handle)); + Request req = new Request(iReadShared(handle, buf, count, type.handle)); + req.addRecvBufRef(buf); + return req; } private native long iReadShared(long fh, Buffer buf, int count, long type) @@ -713,7 +723,9 @@ public final class File { MPI.check(); assertDirectBuffer(buf); - return new Request(iWriteShared(handle, buf, count, type.handle)); + Request req = new Request(iWriteShared(handle, buf, count, type.handle)); + req.addSendBufRef(buf); + return req; } private native long iWriteShared(long fh, Buffer buf, int count, long type) diff --git a/ompi/mpi/java/java/Intracomm.java b/ompi/mpi/java/java/Intracomm.java index 4fa0f21a02..80495a5904 100644 --- a/ompi/mpi/java/java/Intracomm.java +++ b/ompi/mpi/java/java/Intracomm.java @@ -468,9 +468,11 @@ public class Intracomm extends Comm MPI.check(); op.setDatatype(type); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iScan(handle, sendbuf, recvbuf, count, + Request req = new Request(iScan(handle, sendbuf, recvbuf, count, type.handle, type.baseType, op, op.handle)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } /** @@ -490,10 +492,11 @@ public class Intracomm extends Comm MPI.check(); op.setDatatype(type); assertDirectBuffer(buf); - - return new Request(iScan( + Request req = new Request(iScan( handle, null, buf, count, type.handle, type.baseType, op, op.handle)); + req.addSendBufRef(buf); + return req; } private native long iScan( @@ -592,9 +595,11 @@ public class Intracomm extends Comm MPI.check(); op.setDatatype(type); assertDirectBuffer(sendbuf, recvbuf); - - return new Request(iExScan(handle, sendbuf, recvbuf, count, + Request req = new Request(iExScan(handle, sendbuf, recvbuf, count, type.handle, type.baseType, op, op.handle)); + req.addSendBufRef(sendbuf); + req.addRecvBufRef(recvbuf); + return req; } /** @@ -614,10 +619,11 @@ public class Intracomm extends Comm MPI.check(); op.setDatatype(type); assertDirectBuffer(buf); - - return new Request(iExScan( + Request req = new Request(iExScan( handle, null, buf, count, type.handle, type.baseType, op, op.handle)); + req.addRecvBufRef(buf); + return req; } private native long iExScan( diff --git a/ompi/mpi/java/java/Message.java b/ompi/mpi/java/java/Message.java index c2307c6994..9946a67129 100644 --- a/ompi/mpi/java/java/Message.java +++ b/ompi/mpi/java/java/Message.java @@ -152,7 +152,9 @@ public final class Message { MPI.check(); assertDirectBuffer(buf); - return new Request(imRecv(handle, buf, count, type.handle)); + 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) diff --git a/ompi/mpi/java/java/Request.java b/ompi/mpi/java/java/Request.java index 8c8bce9800..9bb21e41cc 100644 --- a/ompi/mpi/java/java/Request.java +++ b/ompi/mpi/java/java/Request.java @@ -63,12 +63,16 @@ package mpi; +import java.nio.Buffer; + /** * Request object. */ public class Request implements Freeable { protected long handle; + protected Buffer sendBuf; + protected Buffer recvBuf; static { @@ -112,6 +116,32 @@ public class Request implements Freeable private native void cancel(long request) throws MPIException; + /** + * Adds a receive buffer to this Request object. This method + * should be called by the internal api whenever a persistent + * request is created and any time a request object, that has + * an associated buffer, is returned from an opperation to protect + * the buffer from getting prematurely garbage collected. + * @param buf buffer to add to the array list + */ + protected final void addRecvBufRef(Buffer buf) + { + this.recvBuf = buf; + } + + /** + * Adds a send buffer to this Request object. This method + * should be called by the internal api whenever a persistent + * request is created and any time a request object, that has + * an associated buffer, is returned from an opperation to protect + * the buffer from getting prematurely garbage collected. + * @param buf buffer to add to the array list + */ + protected final void addSendBufRef(Buffer buf) + { + this.sendBuf = buf; + } + /** * Test if request object is null. * @return true if the request object is null, false otherwise @@ -185,7 +215,7 @@ public class Request implements Freeable } private native Status getStatus(long request) throws MPIException; - + /** * Returns true if the operation identified by the request * is complete, or false otherwise. diff --git a/ompi/mpi/java/java/Win.java b/ompi/mpi/java/java/Win.java index 850abd5974..33d5e94d72 100644 --- a/ompi/mpi/java/java/Win.java +++ b/ompi/mpi/java/java/Win.java @@ -573,10 +573,11 @@ public final class Win implements Freeable { if(!origin_addr.isDirect()) throw new IllegalArgumentException("The origin must be direct buffer."); - - return new Request(rPut(handle, origin_addr, origin_count, + Request req = new Request(rPut(handle, origin_addr, origin_count, origin_datatype.handle, target_rank, target_disp, target_count, target_datatype.handle, getBaseType(origin_datatype, target_datatype))); + req.addSendBufRef(origin_addr); + return req; } private native long rPut(long win, Buffer origin_addr, int origin_count, @@ -605,10 +606,11 @@ public final class Win implements Freeable if(!origin.isDirect()) throw new IllegalArgumentException("The origin must be direct buffer."); - - return new Request(rGet(handle, origin, orgCount, orgType.handle, + Request req = new Request(rGet(handle, origin, orgCount, orgType.handle, targetRank, targetDisp, targetCount, targetType.handle, getBaseType(orgType, targetType))); + req.addRecvBufRef(origin); + return req; } private native long rGet( @@ -638,10 +640,11 @@ public final class Win implements Freeable if(!origin.isDirect()) throw new IllegalArgumentException("The origin must be direct buffer."); - - return new Request(rAccumulate(handle, origin, orgCount, orgType.handle, + Request req = new Request(rAccumulate(handle, origin, orgCount, orgType.handle, targetRank, targetDisp, targetCount, targetType.handle, op, op.handle, getBaseType(orgType, targetType))); + req.addSendBufRef(origin); + return req; } private native long rAccumulate( @@ -715,11 +718,12 @@ public final class Win implements Freeable if(!origin.isDirect()) throw new IllegalArgumentException("The origin must be direct buffer."); - - return new Request(rGetAccumulate(handle, origin, orgCount, orgType.handle, + Request req = new Request(rGetAccumulate(handle, origin, orgCount, orgType.handle, resultAddr, resultCount, resultType.handle, targetRank, targetDisp, targetCount, targetType.handle, op, op.handle, getBaseType(orgType, targetType))); + req.addRecvBufRef(origin); + return req; } private native long rGetAccumulate(