From 5380427050b8aacd3b364faa1628417f76132571 Mon Sep 17 00:00:00 2001 From: Nathaniel Graham Date: Wed, 7 Sep 2016 13:57:35 -0600 Subject: [PATCH] Error handling improvements This commit improves and corrects error handling. In cases where existing objects are altered after a call to ompi_java_exceptionCheck, the results of the exception check method are checked. In the case of an exception, memory is cleaned up and the code returns to Java without altering existing objects. Signed-off-by: Nathaniel Graham --- ompi/mpi/java/c/mpi_Comm.c | 31 ++++++--- ompi/mpi/java/c/mpi_Datatype.c | 8 ++- ompi/mpi/java/c/mpi_File.c | 116 +++++++++++++++++++++++---------- ompi/mpi/java/c/mpi_MPI.c | 31 ++++++++- ompi/mpi/java/c/mpi_Message.c | 15 +++-- ompi/mpi/java/c/mpi_Request.c | 51 +++++++++++---- 6 files changed, 185 insertions(+), 67 deletions(-) diff --git a/ompi/mpi/java/c/mpi_Comm.c b/ompi/mpi/java/c/mpi_Comm.c index 0258eccbae..8151087901 100644 --- a/ompi/mpi/java/c/mpi_Comm.c +++ b/ompi/mpi/java/c/mpi_Comm.c @@ -11,6 +11,8 @@ * All rights reserved. * Copyright (c) 2015 Research Organization for Information Science * and Technology (RIST). All rights reserved. + * Copyright (c) 2016 Los Alamos National Security, LLC. All rights + * reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -205,7 +207,10 @@ JNIEXPORT jlongArray JNICALL Java_mpi_Comm_iDup( MPI_Comm newcomm; MPI_Request request; int rc = MPI_Comm_idup((MPI_Comm)comm, &newcomm, &request); - ompi_java_exceptionCheck(env, rc); + + if(ompi_java_exceptionCheck(env, rc)) + return NULL; + jlongArray jcr = (*env)->NewLongArray(env, 2); jlong *cr = (jlong*)(*env)->GetPrimitiveArrayCritical(env, jcr, NULL); cr[0] = (jlong)newcomm; @@ -332,6 +337,7 @@ JNIEXPORT void JNICALL Java_mpi_Comm_recv( jobject buf, jboolean db, jint offset, jint count, jlong jType, jint bType, jint source, jint tag, jlongArray jStatus) { + jboolean exception; MPI_Comm comm = (MPI_Comm)jComm; MPI_Datatype type = (MPI_Datatype)jType; @@ -341,10 +347,12 @@ JNIEXPORT void JNICALL Java_mpi_Comm_recv( MPI_Status status; int rc = MPI_Recv(ptr, count, type, source, tag, comm, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseWritePtr(ptr,item,env,buf,db,offset,count,type,bType); - ompi_java_status_set(env, jStatus, &status); + + if(!exception) + ompi_java_status_set(env, jStatus, &status); } JNIEXPORT void JNICALL Java_mpi_Comm_sendRecv( @@ -355,6 +363,7 @@ JNIEXPORT void JNICALL Java_mpi_Comm_sendRecv( jlong rjType, jint rBType, jint source, jint rTag, jlongArray jStatus) { + jboolean exception; MPI_Comm comm = (MPI_Comm)jComm; MPI_Datatype sType = (MPI_Datatype)sjType; MPI_Datatype rType = (MPI_Datatype)rjType; @@ -369,10 +378,12 @@ JNIEXPORT void JNICALL Java_mpi_Comm_sendRecv( int rc = MPI_Sendrecv(sPtr, sCount, sType, dest, sTag, rPtr, rCount, rType, source, rTag, comm, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseReadPtr(sPtr, sItem, sBuf, sdb); ompi_java_releaseWritePtr(rPtr,rItem,env,rBuf,rdb,rOff,rCount,rType,rBType); - ompi_java_status_set(env, jStatus, &status); + + if(!exception) + ompi_java_status_set(env, jStatus, &status); } JNIEXPORT void JNICALL Java_mpi_Comm_sendRecvReplace( @@ -392,8 +403,9 @@ JNIEXPORT void JNICALL Java_mpi_Comm_sendRecvReplace( int rc = MPI_Sendrecv_replace(ptr, count, type, dest, sTag, source, rTag, comm, &status); - ompi_java_exceptionCheck(env, rc); - ompi_java_status_set(env, jStatus, &status); + if(!ompi_java_exceptionCheck(env, rc)) + ompi_java_status_set(env, jStatus, &status); + ompi_java_releaseWritePtr(ptr,item,env,buf,db,offset,count,type,bType); } @@ -662,8 +674,9 @@ JNIEXPORT void JNICALL Java_mpi_Comm_probe( { MPI_Status status; int rc = MPI_Probe(source, tag, (MPI_Comm)comm, &status); - ompi_java_exceptionCheck(env, rc); - ompi_java_status_set(env, jStatus, &status); + + if(!ompi_java_exceptionCheck(env, rc)) + ompi_java_status_set(env, jStatus, &status); } JNIEXPORT jint JNICALL Java_mpi_Comm_getTopology( diff --git a/ompi/mpi/java/c/mpi_Datatype.c b/ompi/mpi/java/c/mpi_Datatype.c index 5c675407c0..f3165bce39 100644 --- a/ompi/mpi/java/c/mpi_Datatype.c +++ b/ompi/mpi/java/c/mpi_Datatype.c @@ -9,6 +9,8 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2016 Los Alamos National Security, LLC. All rights + * reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -92,7 +94,8 @@ JNIEXPORT void JNICALL Java_mpi_Datatype_getLbExtent( { MPI_Aint lb, extent; int rc = MPI_Type_get_extent((MPI_Datatype)type, &lb, &extent); - ompi_java_exceptionCheck(env, rc); + if(ompi_java_exceptionCheck(env, rc)) + return; jint *lbExt = (*env)->GetIntArrayElements(env, jLbExt, NULL); lbExt[0] = (jint)lb; @@ -105,7 +108,8 @@ JNIEXPORT void JNICALL Java_mpi_Datatype_getTrueLbExtent( { MPI_Aint lb, extent; int rc = MPI_Type_get_true_extent((MPI_Datatype)type, &lb, &extent); - ompi_java_exceptionCheck(env, rc); + if(ompi_java_exceptionCheck(env, rc)) + return; jint *lbExt = (*env)->GetIntArrayElements(env, jLbExt, NULL); lbExt[0] = (jint)lb; diff --git a/ompi/mpi/java/c/mpi_File.c b/ompi/mpi/java/c/mpi_File.c index c1c34d5acc..fe15a70b84 100644 --- a/ompi/mpi/java/c/mpi_File.c +++ b/ompi/mpi/java/c/mpi_File.c @@ -9,6 +9,8 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2016 Los Alamos National Security, LLC. All rights + * reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -137,6 +139,7 @@ JNIEXPORT void JNICALL Java_mpi_File_readAt( jobject buf, jboolean db, jint off, jint count, jlong jType, jint bType, jlongArray stat) { + jboolean exception; MPI_Datatype type = (MPI_Datatype)jType; void *ptr; ompi_java_buffer_t *item; @@ -146,9 +149,11 @@ JNIEXPORT void JNICALL Java_mpi_File_readAt( int rc = MPI_File_read_at((MPI_File)fh, (MPI_Offset)fileOffset, ptr, count, type, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseWritePtr(ptr, item, env, buf, db, off, count, type, bType); - ompi_java_status_set(env, stat, &status); + + if(!exception) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_readAtAll( @@ -156,6 +161,7 @@ JNIEXPORT void JNICALL Java_mpi_File_readAtAll( jobject buf, jboolean db, jint off, jint count, jlong jType, jint bType, jlongArray stat) { + jboolean exception; MPI_Datatype type = (MPI_Datatype)jType; void *ptr; ompi_java_buffer_t *item; @@ -165,9 +171,11 @@ JNIEXPORT void JNICALL Java_mpi_File_readAtAll( int rc = MPI_File_read_at_all((MPI_File)fh, (MPI_Offset)fileOffset, ptr, count, type, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseWritePtr(ptr, item, env, buf, db, off, count, type, bType); - ompi_java_status_set(env, stat, &status); + + if(!exception) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_writeAt( @@ -175,6 +183,7 @@ JNIEXPORT void JNICALL Java_mpi_File_writeAt( jobject buf, jboolean db, jint off, jint count, jlong jType, jint bType, jlongArray stat) { + jboolean exception; MPI_Datatype type = (MPI_Datatype)jType; void *ptr; ompi_java_buffer_t *item; @@ -184,9 +193,11 @@ JNIEXPORT void JNICALL Java_mpi_File_writeAt( int rc = MPI_File_write_at((MPI_File)fh, (MPI_Offset)fileOffset, ptr, count, type, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseReadPtr(ptr, item, buf, db); - ompi_java_status_set(env, stat, &status); + + if(!exception) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_writeAtAll( @@ -194,6 +205,7 @@ JNIEXPORT void JNICALL Java_mpi_File_writeAtAll( jobject buf, jboolean db, jint off, jint count, jlong jType, jint bType, jlongArray stat) { + jboolean exception; MPI_Datatype type = (MPI_Datatype)jType; void *ptr; ompi_java_buffer_t *item; @@ -203,9 +215,11 @@ JNIEXPORT void JNICALL Java_mpi_File_writeAtAll( int rc = MPI_File_write_at_all((MPI_File)fh, (MPI_Offset)fileOffset, ptr, count, (MPI_Datatype)type, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseReadPtr(ptr, item, buf, db); - ompi_java_status_set(env, stat, &status); + + if(!exception) + ompi_java_status_set(env, stat, &status); } JNIEXPORT jlong JNICALL Java_mpi_File_iReadAt( @@ -240,60 +254,72 @@ JNIEXPORT void JNICALL Java_mpi_File_read( JNIEnv *env, jobject jthis, jlong fh, jobject buf, jboolean db, jint off, jint count, jlong jType, jint bType, jlongArray stat) { + jboolean exception; MPI_Datatype type = (MPI_Datatype)jType; void *ptr; ompi_java_buffer_t *item; ompi_java_getWritePtr(&ptr, &item, env, buf, db, count, type); MPI_Status status; int rc = MPI_File_read((MPI_File)fh, ptr, count, type, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseWritePtr(ptr, item, env, buf, db, off, count, type, bType); - ompi_java_status_set(env, stat, &status); + + if(!exception) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_readAll( JNIEnv *env, jobject jthis, jlong fh, jobject buf, jboolean db, jint off, jint count, jlong jType, jint bType, jlongArray stat) { + jboolean exception; MPI_Datatype type = (MPI_Datatype)jType; void *ptr; ompi_java_buffer_t *item; ompi_java_getWritePtr(&ptr, &item, env, buf, db, count, type); MPI_Status status; int rc = MPI_File_read_all((MPI_File)fh, ptr, count, type, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseWritePtr(ptr, item, env, buf, db, off, count, type, bType); - ompi_java_status_set(env, stat, &status); + + if(!exception) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_write( JNIEnv *env, jobject jthis, jlong fh, jobject buf, jboolean db, jint off, jint count, jlong jType, jint bType, jlongArray stat) { + jboolean exception; MPI_Datatype type = (MPI_Datatype)jType; void *ptr; ompi_java_buffer_t *item; ompi_java_getReadPtr(&ptr, &item, env, buf, db, off, count, type, bType); MPI_Status status; int rc = MPI_File_write((MPI_File)fh, ptr, count, type, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseReadPtr(ptr, item, buf, db); - ompi_java_status_set(env, stat, &status); + + if(!exception) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_writeAll( JNIEnv *env, jobject jthis, jlong fh, jobject buf, jboolean db, jint off, jint count, jlong jType, jint bType, jlongArray stat) { + jboolean exception; MPI_Datatype type = (MPI_Datatype)jType; void *ptr; ompi_java_buffer_t *item; ompi_java_getReadPtr(&ptr, &item, env, buf, db, off, count, type, bType); MPI_Status status; int rc = MPI_File_write_all((MPI_File)fh, ptr, count, type, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseReadPtr(ptr, item, buf, db); - ompi_java_status_set(env, stat, &status); + + if(!exception) + ompi_java_status_set(env, stat, &status); } JNIEXPORT jlong JNICALL Java_mpi_File_iRead( @@ -353,30 +379,36 @@ JNIEXPORT void JNICALL Java_mpi_File_readShared( JNIEnv *env, jobject jthis, jlong fh, jobject buf, jboolean db, jint off, jint count, jlong jType, jint bType, jlongArray stat) { + jboolean exception; MPI_Datatype type = (MPI_Datatype)jType; void *ptr; ompi_java_buffer_t *item; ompi_java_getWritePtr(&ptr, &item, env, buf, db, count, type); MPI_Status status; int rc = MPI_File_read_shared((MPI_File)fh, ptr, count, type, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseWritePtr(ptr, item, env, buf, db, off, count, type, bType); - ompi_java_status_set(env, stat, &status); + + if(!exception) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_writeShared( JNIEnv *env, jobject jthis, jlong fh, jobject buf, jboolean db, jint off, jint count, jlong jType, jint bType, jlongArray stat) { + jboolean exception; MPI_Datatype type = (MPI_Datatype)jType; void *ptr; ompi_java_buffer_t *item; ompi_java_getReadPtr(&ptr, &item, env, buf, db, off, count, type, bType); MPI_Status status; int rc = MPI_File_write_shared((MPI_File)fh, ptr, count, type, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseReadPtr(ptr, item, buf, db); - ompi_java_status_set(env, stat, &status); + + if(!exception) + ompi_java_status_set(env, stat, &status); } JNIEXPORT jlong JNICALL Java_mpi_File_iReadShared( @@ -411,30 +443,36 @@ JNIEXPORT void JNICALL Java_mpi_File_readOrdered( JNIEnv *env, jobject jthis, jlong fh, jobject buf, jboolean db, jint off, jint count, jlong jType, jint bType, jlongArray stat) { + jboolean exception; MPI_Datatype type = (MPI_Datatype)jType; void *ptr; ompi_java_buffer_t *item; ompi_java_getWritePtr(&ptr, &item, env, buf, db, count, type); MPI_Status status; int rc = MPI_File_read_ordered((MPI_File)fh, ptr, count, type, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseWritePtr(ptr, item, env, buf, db, off, count, type, bType); - ompi_java_status_set(env, stat, &status); + + if(!exception) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_writeOrdered( JNIEnv *env, jobject jthis, jlong fh, jobject buf, jboolean db, jint off, jint count, jlong jType, jint bType, jlongArray stat) { + jboolean exception; MPI_Datatype type = (MPI_Datatype)jType; void *ptr; ompi_java_buffer_t *item; ompi_java_getReadPtr(&ptr, &item, env, buf, db, off, count, type, bType); MPI_Status status; int rc = MPI_File_write_ordered((MPI_File)fh, ptr, count, type, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releaseReadPtr(ptr, item, buf, db); - ompi_java_status_set(env, stat, &status); + + if(!exception) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_seekShared( @@ -470,8 +508,9 @@ JNIEXPORT void JNICALL Java_mpi_File_readAtAllEnd( MPI_Status status; void *ptr = (*env)->GetDirectBufferAddress(env, buf); int rc = MPI_File_read_at_all_end((MPI_File)fh, ptr, &status); - ompi_java_exceptionCheck(env, rc); - ompi_java_status_set(env, stat, &status); + + if(!ompi_java_exceptionCheck(env, rc)) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_writeAtAllBegin( @@ -491,8 +530,9 @@ JNIEXPORT void JNICALL Java_mpi_File_writeAtAllEnd( MPI_Status status; void *ptr = (*env)->GetDirectBufferAddress(env, buf); int rc = MPI_File_write_at_all_end((MPI_File)fh, ptr, &status); - ompi_java_exceptionCheck(env, rc); - ompi_java_status_set(env, stat, &status); + + if(!ompi_java_exceptionCheck(env, rc)) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_readAllBegin( @@ -513,8 +553,9 @@ JNIEXPORT void JNICALL Java_mpi_File_readAllEnd( MPI_Status status; void *ptr = (*env)->GetDirectBufferAddress(env, buf); int rc = MPI_File_read_all_end((MPI_File)fh, ptr, &status); - ompi_java_exceptionCheck(env, rc); - ompi_java_status_set(env, stat, &status); + + if(!ompi_java_exceptionCheck(env, rc)) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_writeAllBegin( @@ -535,8 +576,9 @@ JNIEXPORT void JNICALL Java_mpi_File_writeAllEnd( MPI_Status status; void *ptr = (*env)->GetDirectBufferAddress(env, buf); int rc = MPI_File_write_all_end((MPI_File)fh, ptr, &status); - ompi_java_exceptionCheck(env, rc); - ompi_java_status_set(env, stat, &status); + + if(!ompi_java_exceptionCheck(env, rc)) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_readOrderedBegin( @@ -557,8 +599,9 @@ JNIEXPORT void JNICALL Java_mpi_File_readOrderedEnd( MPI_Status status; void *ptr = (*env)->GetDirectBufferAddress(env, buf); int rc = MPI_File_read_ordered_end((MPI_File)fh, ptr, &status); - ompi_java_exceptionCheck(env, rc); - ompi_java_status_set(env, stat, &status); + + if(!ompi_java_exceptionCheck(env, rc)) + ompi_java_status_set(env, stat, &status); } JNIEXPORT void JNICALL Java_mpi_File_writeOrderedBegin( @@ -579,8 +622,9 @@ JNIEXPORT void JNICALL Java_mpi_File_writeOrderedEnd( MPI_Status status; void *ptr = (*env)->GetDirectBufferAddress(env, buf); int rc = MPI_File_write_ordered_end((MPI_File)fh, ptr, &status); - ompi_java_exceptionCheck(env, rc); - ompi_java_status_set(env, stat, &status); + + if(!ompi_java_exceptionCheck(env, rc)) + ompi_java_status_set(env, stat, &status); } JNIEXPORT jint JNICALL Java_mpi_File_getTypeExtent( diff --git a/ompi/mpi/java/c/mpi_MPI.c b/ompi/mpi/java/c/mpi_MPI.c index 3ad7296591..ef5d1f5bc1 100644 --- a/ompi/mpi/java/c/mpi_MPI.c +++ b/ompi/mpi/java/c/mpi_MPI.c @@ -10,7 +10,7 @@ * 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 + * Copyright (c) 2015-2016 Los Alamos National Security, LLC. All rights * reserved. * Copyright (c) 2015-2016 Cisco Systems, Inc. All rights reserved. * Copyright (c) 2015 Intel, Inc. All rights reserved. @@ -316,7 +316,14 @@ JNIEXPORT jobjectArray JNICALL Java_mpi_MPI_Init_1jni( } int rc = MPI_Init(&len, &sargs); - ompi_java_exceptionCheck(env, rc); + + if(ompi_java_exceptionCheck(env, rc)) { + for(i = 0; i < len; i++) + free (sargs[i]); + free(sargs); + return NULL; + } + mca_base_var_register("ompi", "mpi", "java", "eager", "Java buffers eager size", MCA_BASE_VAR_TYPE_INT, NULL, 0, 0, @@ -360,7 +367,13 @@ JNIEXPORT jint JNICALL Java_mpi_MPI_InitThread_1jni( int provided; int rc = MPI_Init_thread(&len, &sargs, required, &provided); - ompi_java_exceptionCheck(env, rc); + + if(ompi_java_exceptionCheck(env, rc)) { + for(i = 0; i < len; i++) + free (sargs[i]); + free(sargs); + return -1; + } findClasses(env); initFreeList(); @@ -1126,6 +1139,18 @@ void ompi_java_releasePtrArray(JNIEnv *env, jlongArray array, (*env)->ReleaseLongArrayElements(env, array, jptr, 0); } +/* This method checks whether an MPI or JNI exception has occurred. + * If an exception occurs, the C code will continue running. Once + * code execution returns to Java code, an exception is immediately + * thrown. Since an exception has occurred somewhere in the C code, + * the object that is returned from C may not be valid. This is not + * an issue, however, as the assignment opperation will not be + * executed. The results of this method need not be checked if the + * only following code cleans up memory and then returns to Java. + * If existing objects are changed after a call to this method, the + * results need to be checked and, if an error has occurred, the + * code should instead cleanup any memory and return. + */ jboolean ompi_java_exceptionCheck(JNIEnv *env, int rc) { jboolean jni_exception; diff --git a/ompi/mpi/java/c/mpi_Message.c b/ompi/mpi/java/c/mpi_Message.c index a51e112ff4..b78dc78264 100644 --- a/ompi/mpi/java/c/mpi_Message.c +++ b/ompi/mpi/java/c/mpi_Message.c @@ -9,6 +9,8 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2016 Los Alamos National Security, LLC. All rights + * reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -41,8 +43,10 @@ JNIEXPORT jlong JNICALL Java_mpi_Message_mProbe( MPI_Message message; MPI_Status status; int rc = MPI_Mprobe(source, tag, comm, &message, &status); - ompi_java_exceptionCheck(env, rc); - ompi_java_status_set(env, jStatus, &status); + + if(!ompi_java_exceptionCheck(env, rc)) + ompi_java_status_set(env, jStatus, &status); + return (jlong)message; } @@ -75,9 +79,10 @@ JNIEXPORT jlong JNICALL Java_mpi_Message_mRecv( MPI_Status status; int rc = MPI_Mrecv(ptr, count, type, &message, &status); - ompi_java_exceptionCheck(env, rc); - - ompi_java_status_set(env, jStatus, &status); + + if(!ompi_java_exceptionCheck(env, rc)) + ompi_java_status_set(env, jStatus, &status); + ompi_java_releaseWritePtr(ptr, item, env, buf, db, off, count, type, bType); return (jlong)message; } diff --git a/ompi/mpi/java/c/mpi_Request.c b/ompi/mpi/java/c/mpi_Request.c index 4ad9e2c307..81e1d46816 100644 --- a/ompi/mpi/java/c/mpi_Request.c +++ b/ompi/mpi/java/c/mpi_Request.c @@ -9,6 +9,8 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2016 Los Alamos National Security, LLC. All rights + * reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -145,8 +147,10 @@ JNIEXPORT jlong JNICALL Java_mpi_Request_waitStatus( MPI_Request req = (MPI_Request)handle; MPI_Status status; int rc = MPI_Wait(&req, &status); - ompi_java_exceptionCheck(env, rc); - ompi_java_status_set(env, stat, &status); + + if(!ompi_java_exceptionCheck(env, rc)) + ompi_java_status_set(env, stat, &status); + return (jlong)req; } @@ -166,8 +170,10 @@ JNIEXPORT jobject JNICALL Java_mpi_Request_testStatus( int flag; MPI_Status status; int rc = MPI_Test(&req, &flag, &status); - ompi_java_exceptionCheck(env, rc); - (*env)->SetLongField(env, jthis, ompi_java.ReqHandle, (jlong)req); + + if(!ompi_java_exceptionCheck(env, rc)) + (*env)->SetLongField(env, jthis, ompi_java.ReqHandle, (jlong)req); + return flag ? ompi_java_status_new(env, &status) : NULL; } @@ -178,8 +184,10 @@ JNIEXPORT jobject JNICALL Java_mpi_Request_getStatus( int flag; MPI_Status status; int rc = MPI_Request_get_status(req, &flag, &status); - ompi_java_exceptionCheck(env, rc); - (*env)->SetLongField(env, jthis, ompi_java.ReqHandle, (jlong)req); + + if(!ompi_java_exceptionCheck(env, rc)) + (*env)->SetLongField(env, jthis, ompi_java.ReqHandle, (jlong)req); + return flag ? ompi_java_status_new(env, &status) : NULL; } @@ -189,14 +197,17 @@ JNIEXPORT jboolean JNICALL Java_mpi_Request_test( MPI_Request req = (MPI_Request)handle; int flag; int rc = MPI_Test(&req, &flag, MPI_STATUS_IGNORE); - ompi_java_exceptionCheck(env, rc); - (*env)->SetLongField(env, jthis, ompi_java.ReqHandle, (jlong)req); + + if(!ompi_java_exceptionCheck(env, rc)) + (*env)->SetLongField(env, jthis, ompi_java.ReqHandle, (jlong)req); + return flag ? JNI_TRUE : JNI_FALSE; } JNIEXPORT void JNICALL Java_mpi_Request_waitAnyStatus( JNIEnv *env, jclass clazz, jlongArray requests, jobject stat) { + jboolean exception; int count = (*env)->GetArrayLength(env, requests); jlong* jReq; MPI_Request *cReq; @@ -204,9 +215,11 @@ JNIEXPORT void JNICALL Java_mpi_Request_waitAnyStatus( int index; MPI_Status status; int rc = MPI_Waitany(count, cReq, &index, &status); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); - ompi_java_status_setIndex(env, stat, &status, index); + + if(!exception) + ompi_java_status_setIndex(env, stat, &status, index); } JNIEXPORT jint JNICALL Java_mpi_Request_waitAny( @@ -333,6 +346,7 @@ JNIEXPORT jobjectArray JNICALL Java_mpi_Request_waitSomeStatus( JNIEXPORT jintArray JNICALL Java_mpi_Request_waitSome( JNIEnv *env, jclass clazz, jlongArray requests) { + jboolean exception; int incount = (*env)->GetArrayLength(env, requests); jlong* jReq; MPI_Request *cReq; @@ -340,8 +354,14 @@ JNIEXPORT jintArray JNICALL Java_mpi_Request_waitSome( int *indices = (int*)calloc(incount, sizeof(int)); int outcount; int rc = MPI_Waitsome(incount, cReq, &outcount, indices, MPI_STATUSES_IGNORE); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); + + if(exception) { + free(indices); + return NULL; + } + jintArray jindices = NULL; if(outcount != MPI_UNDEFINED) @@ -376,6 +396,7 @@ JNIEXPORT jobjectArray JNICALL Java_mpi_Request_testSomeStatus( JNIEXPORT jintArray JNICALL Java_mpi_Request_testSome( JNIEnv *env, jclass clazz, jlongArray requests) { + jboolean exception; int incount = (*env)->GetArrayLength(env, requests); jlong* jReq; MPI_Request *cReq; @@ -383,8 +404,14 @@ JNIEXPORT jintArray JNICALL Java_mpi_Request_testSome( int *indices = (int*)calloc(incount, sizeof(int)); int outcount; int rc = MPI_Testsome(incount, cReq, &outcount, indices, MPI_STATUSES_IGNORE); - ompi_java_exceptionCheck(env, rc); + exception = ompi_java_exceptionCheck(env, rc); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); + + if(exception) { + free(indices); + return NULL; + } + jintArray jindices = NULL; if(outcount != MPI_UNDEFINED)