From 845818de593df0cf60d8142b1f1e23d5f7b50ae6 Mon Sep 17 00:00:00 2001 From: Oscar Vega-Gisbert Date: Sat, 29 Mar 2014 18:13:38 +0000 Subject: [PATCH] Avoid use Status member in Request. This commit was SVN r31287. --- ompi/mpi/java/c/mpiJava.h | 8 +-- ompi/mpi/java/c/mpi_Comm.c | 4 +- ompi/mpi/java/c/mpi_MPI.c | 4 +- ompi/mpi/java/c/mpi_Message.c | 2 +- ompi/mpi/java/c/mpi_Request.c | 90 +++++++++++++++------------------ ompi/mpi/java/c/mpi_Status.c | 20 +++++++- ompi/mpi/java/java/Comm.java | 5 +- ompi/mpi/java/java/Message.java | 5 +- ompi/mpi/java/java/Request.java | 80 +++++++++-------------------- ompi/mpi/java/java/Status.java | 24 +++------ 10 files changed, 103 insertions(+), 139 deletions(-) diff --git a/ompi/mpi/java/c/mpiJava.h b/ompi/mpi/java/c/mpiJava.h index 411d96e653..b0d8451e67 100644 --- a/ompi/mpi/java/c/mpiJava.h +++ b/ompi/mpi/java/c/mpiJava.h @@ -40,7 +40,8 @@ typedef struct { jfieldID OpCommute; jmethodID OpCall; jfieldID ReqHandle; - jfieldID ReqStatus; + jclass StatusClass; + jfieldID StatusData; jclass ExceptionClass; jmethodID ExceptionInit; jclass IntegerClass; @@ -108,8 +109,9 @@ int ompi_java_attrDelete(void *attrVal); MPI_Op ompi_java_op_getHandle( JNIEnv *env, jobject jOp, jlong hOp, int baseType); -jlongArray ompi_java_status_new( - JNIEnv *env, MPI_Status *status); +jobject ompi_java_status_new(JNIEnv *env, MPI_Status *status); +jobject ompi_java_status_newIndex(JNIEnv *env, MPI_Status *status, int index); + void ompi_java_status_set( JNIEnv *env, jlongArray jData, MPI_Status *status); void ompi_java_status_setIndex( diff --git a/ompi/mpi/java/c/mpi_Comm.c b/ompi/mpi/java/c/mpi_Comm.c index 363274170a..26088441da 100644 --- a/ompi/mpi/java/c/mpi_Comm.c +++ b/ompi/mpi/java/c/mpi_Comm.c @@ -715,14 +715,14 @@ JNIEXPORT jint JNICALL Java_mpi_Comm_packSize( return size; } -JNIEXPORT jlongArray JNICALL Java_mpi_Comm_iProbe( +JNIEXPORT jobject JNICALL Java_mpi_Comm_iProbe( JNIEnv *env, jobject jthis, jlong comm, jint source, jint tag) { int flag; MPI_Status status; int rc = MPI_Iprobe(source, tag, (MPI_Comm)comm, &flag, &status); ompi_java_exceptionCheck(env, rc); - return !flag ? NULL : ompi_java_status_new(env, &status); + return flag ? ompi_java_status_new(env, &status) : NULL; } JNIEXPORT void JNICALL Java_mpi_Comm_probe( diff --git a/ompi/mpi/java/c/mpi_MPI.c b/ompi/mpi/java/c/mpi_MPI.c index b6b465f52a..38d0b395a8 100644 --- a/ompi/mpi/java/c/mpi_MPI.c +++ b/ompi/mpi/java/c/mpi_MPI.c @@ -395,7 +395,8 @@ void ompi_java_findClasses(JNIEnv *env) ompi_java.DistGraphNeighborsClass = ompi_java_findClass( env, "mpi/DistGraphNeighbors"); - ompi_java.ExceptionClass = ompi_java_findClass(env, "mpi/MPIException"); + ompi_java.StatusClass = ompi_java_findClass(env, "mpi/Status"); + ompi_java.ExceptionClass = ompi_java_findClass(env, "mpi/MPIException"); ompi_java.ExceptionInit = (*env)->GetMethodID( env, ompi_java.ExceptionClass, @@ -425,6 +426,7 @@ void ompi_java_deleteClasses(JNIEnv *env) (*env)->DeleteGlobalRef(env, ompi_java.ShiftParmsClass); (*env)->DeleteGlobalRef(env, ompi_java.GraphParmsClass); (*env)->DeleteGlobalRef(env, ompi_java.DistGraphNeighborsClass); + (*env)->DeleteGlobalRef(env, ompi_java.StatusClass); (*env)->DeleteGlobalRef(env, ompi_java.ExceptionClass); (*env)->DeleteGlobalRef(env, ompi_java.IntegerClass); (*env)->DeleteGlobalRef(env, ompi_java.LongClass); diff --git a/ompi/mpi/java/c/mpi_Message.c b/ompi/mpi/java/c/mpi_Message.c index c5ab479270..ef305176d3 100644 --- a/ompi/mpi/java/c/mpi_Message.c +++ b/ompi/mpi/java/c/mpi_Message.c @@ -46,7 +46,7 @@ JNIEXPORT jlong JNICALL Java_mpi_Message_mProbe( return (jlong)message; } -JNIEXPORT jlongArray JNICALL Java_mpi_Message_imProbe( +JNIEXPORT jobject JNICALL Java_mpi_Message_imProbe( JNIEnv *env, jobject jthis, jint source, jint tag, jlong jComm) { MPI_Comm comm = (MPI_Comm)jComm; diff --git a/ompi/mpi/java/c/mpi_Request.c b/ompi/mpi/java/c/mpi_Request.c index 08c5d2ac9c..2a54790ecc 100644 --- a/ompi/mpi/java/c/mpi_Request.c +++ b/ompi/mpi/java/c/mpi_Request.c @@ -58,7 +58,6 @@ JNIEXPORT void JNICALL Java_mpi_Request_init(JNIEnv *env, jclass c) { ompi_java.ReqHandle = (*env)->GetFieldID(env, c, "handle", "J"); - ompi_java.ReqStatus = (*env)->GetFieldID(env, c, "status", "[J"); } static void setIndices(JNIEnv *env, jintArray indices, int *cIdx, int count) @@ -84,35 +83,38 @@ static void setIndices(JNIEnv *env, jintArray indices, int *cIdx, int count) free(jIdx); } -static void setStatuses(JNIEnv *env, jobjectArray objReqs, - MPI_Status *statuses, int count) +static jobjectArray newStatuses(JNIEnv *env, MPI_Status *statuses, int count) { + jobjectArray array = (*env)->NewObjectArray(env, + count, ompi_java.StatusClass, NULL); int i; for(i = 0; i < count; i++) { - /* Copy final native status to Java statuses. */ - jobject rq = (*env)->GetObjectArrayElement(env, objReqs, i); - jobject st = (*env)->GetObjectField(env, rq, ompi_java.ReqStatus); - ompi_java_status_set(env, st, statuses + i); + jobject st = ompi_java_status_new(env, statuses + i); + (*env)->SetObjectArrayElement(env, array, i, st); (*env)->DeleteLocalRef(env, st); - (*env)->DeleteLocalRef(env, rq); } + + return array; } -static void setStatusesIndices( - JNIEnv *env, jobjectArray objReqs, - MPI_Status *statuses, int *indices, int count) +static jobjectArray newStatusesIndices( + JNIEnv *env, MPI_Status *statuses, int *indices, int count) { + if(count < 0) + return NULL; + + jobjectArray array = (*env)->NewObjectArray(env, + count, ompi_java.StatusClass, NULL); int i; for(i = 0; i < count; i++) { - /* Copy final native status to Java statuses. */ - jobject rq = (*env)->GetObjectArrayElement(env, objReqs, i); - jobject st = (*env)->GetObjectField(env, rq, ompi_java.ReqStatus); - ompi_java_status_setIndex(env, st, statuses + i, indices[i]); + jobject st = ompi_java_status_newIndex(env, statuses + i, indices[i]); + (*env)->SetObjectArrayElement(env, array, i, st); (*env)->DeleteLocalRef(env, st); - (*env)->DeleteLocalRef(env, rq); } + + return array; } JNIEXPORT jlong JNICALL Java_mpi_Request_getNull(JNIEnv *env, jclass clazz) @@ -157,8 +159,8 @@ JNIEXPORT jlong JNICALL Java_mpi_Request_waitFor( return (jlong)req; } -JNIEXPORT jboolean JNICALL Java_mpi_Request_testStatus( - JNIEnv *env, jobject jthis, jlong handle, jlongArray jStatus) +JNIEXPORT jobject JNICALL Java_mpi_Request_testStatus( + JNIEnv *env, jobject jthis, jlong handle) { MPI_Request req = (MPI_Request)handle; int flag; @@ -166,12 +168,7 @@ JNIEXPORT jboolean JNICALL Java_mpi_Request_testStatus( int rc = MPI_Test(&req, &flag, &status); ompi_java_exceptionCheck(env, rc); (*env)->SetLongField(env, jthis, ompi_java.ReqHandle, (jlong)req); - - if(!flag) - return JNI_FALSE; - - ompi_java_status_set(env, jStatus, &status); - return JNI_TRUE; + return flag ? ompi_java_status_new(env, &status) : NULL; } JNIEXPORT jboolean JNICALL Java_mpi_Request_test( @@ -215,8 +212,8 @@ JNIEXPORT jint JNICALL Java_mpi_Request_waitAny( return index; } -JNIEXPORT jboolean JNICALL Java_mpi_Request_testAnyStatus( - JNIEnv *env, jclass clazz, jlongArray requests, jobject jStatus) +JNIEXPORT jobject JNICALL Java_mpi_Request_testAnyStatus( + JNIEnv *env, jclass clazz, jlongArray requests) { int count = (*env)->GetArrayLength(env, requests); jlong* jReq; @@ -227,12 +224,7 @@ JNIEXPORT jboolean JNICALL Java_mpi_Request_testAnyStatus( int rc = MPI_Testany(count, cReq, &index, &flag, &status); ompi_java_exceptionCheck(env, rc); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); - - if(!flag) - return JNI_FALSE; - - ompi_java_status_setIndex(env, jStatus, &status, index); - return JNI_TRUE; + return flag ? ompi_java_status_newIndex(env, &status, index) : NULL; } JNIEXPORT jint JNICALL Java_mpi_Request_testAny( @@ -250,8 +242,8 @@ JNIEXPORT jint JNICALL Java_mpi_Request_testAny( return index; } -JNIEXPORT void JNICALL Java_mpi_Request_waitAllStatus( - JNIEnv *env, jclass clazz, jlongArray requests, jobjectArray objReqs) +JNIEXPORT jobjectArray JNICALL Java_mpi_Request_waitAllStatus( + JNIEnv *env, jclass clazz, jlongArray requests) { int count = (*env)->GetArrayLength(env, requests); jlong* jReq; @@ -261,8 +253,9 @@ JNIEXPORT void JNICALL Java_mpi_Request_waitAllStatus( int rc = MPI_Waitall(count, cReq, statuses); ompi_java_exceptionCheck(env, rc); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); - setStatuses(env, objReqs, statuses, count); + jobjectArray jStatuses = newStatuses(env, statuses, count); free(statuses); + return jStatuses; } JNIEXPORT void JNICALL Java_mpi_Request_waitAll( @@ -277,8 +270,8 @@ JNIEXPORT void JNICALL Java_mpi_Request_waitAll( ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); } -JNIEXPORT int JNICALL Java_mpi_Request_testAllStatus( - JNIEnv *env, jclass clazz, jlongArray requests, jobjectArray objReqs) +JNIEXPORT jobjectArray JNICALL Java_mpi_Request_testAllStatus( + JNIEnv *env, jclass clazz, jlongArray requests) { int count = (*env)->GetArrayLength(env, requests); jlong* jReq; @@ -289,12 +282,9 @@ JNIEXPORT int JNICALL Java_mpi_Request_testAllStatus( int rc = MPI_Testall(count, cReq, &flag, statuses); ompi_java_exceptionCheck(env, rc); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); - - if(flag) - setStatuses(env, objReqs, statuses, count); - + jobjectArray jStatuses = flag ? newStatuses(env, statuses, count) : NULL; free(statuses); - return flag ? count : -1; + return jStatuses; } JNIEXPORT jboolean JNICALL Java_mpi_Request_testAll( @@ -311,8 +301,8 @@ JNIEXPORT jboolean JNICALL Java_mpi_Request_testAll( return flag ? JNI_TRUE : JNI_FALSE; } -JNIEXPORT jint JNICALL Java_mpi_Request_waitSomeStatus( - JNIEnv *env, jclass clazz, jlongArray requests, jobjectArray objReqs) +JNIEXPORT jobjectArray JNICALL Java_mpi_Request_waitSomeStatus( + JNIEnv *env, jclass clazz, jlongArray requests) { int incount = (*env)->GetArrayLength(env, requests); jlong* jReq; @@ -324,10 +314,10 @@ JNIEXPORT jint JNICALL Java_mpi_Request_waitSomeStatus( int rc = MPI_Waitsome(incount, cReq, &outcount, indices, statuses); ompi_java_exceptionCheck(env, rc); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); - setStatusesIndices(env, objReqs, statuses, indices, outcount); + jobjectArray jStatuses = newStatusesIndices(env, statuses, indices, outcount); free(statuses); free(indices); - return outcount; + return jStatuses; } JNIEXPORT jintArray JNICALL Java_mpi_Request_waitSome( @@ -354,8 +344,8 @@ JNIEXPORT jintArray JNICALL Java_mpi_Request_waitSome( return jindices; } -JNIEXPORT int JNICALL Java_mpi_Request_testSomeStatus( - JNIEnv *env, jclass clazz, jlongArray requests, jobjectArray objReqs) +JNIEXPORT jobjectArray JNICALL Java_mpi_Request_testSomeStatus( + JNIEnv *env, jclass clazz, jlongArray requests) { int incount = (*env)->GetArrayLength(env, requests); jlong* jReq; @@ -367,10 +357,10 @@ JNIEXPORT int JNICALL Java_mpi_Request_testSomeStatus( int rc = MPI_Testsome(incount, cReq, &outcount, indices, statuses); ompi_java_exceptionCheck(env, rc); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); - setStatusesIndices(env, objReqs, statuses, indices, outcount); + jobjectArray jStatuses = newStatusesIndices(env, statuses, indices, outcount); free(statuses); free(indices); - return outcount; + return jStatuses; } JNIEXPORT jintArray JNICALL Java_mpi_Request_testSome( diff --git a/ompi/mpi/java/c/mpi_Status.c b/ompi/mpi/java/c/mpi_Status.c index 536ee7dc71..dc6e9799e7 100644 --- a/ompi/mpi/java/c/mpi_Status.c +++ b/ompi/mpi/java/c/mpi_Status.c @@ -66,6 +66,11 @@ static void getStatus(MPI_Status *status, jint source, jint tag, status->_ucount = ucount; } +JNIEXPORT void JNICALL Java_mpi_Status_init(JNIEnv *env, jclass clazz) +{ + ompi_java.StatusData = (*env)->GetFieldID(env, clazz, "data", "[J"); +} + JNIEXPORT jint JNICALL Java_mpi_Status_getCount( JNIEnv *env, jobject jthis, jint source, jint tag, jint error, jint cancelled, jlong ucount, jlong jType) @@ -104,11 +109,22 @@ JNIEXPORT jint JNICALL Java_mpi_Status_getElements( return count; } -jlongArray ompi_java_status_new(JNIEnv *env, MPI_Status *status) +jobject ompi_java_status_new(JNIEnv *env, MPI_Status *status) { jlongArray jData = (*env)->NewLongArray(env, 6); ompi_java_status_set(env, jData, status); - return jData; + jobject jStatus = (*env)->AllocObject(env, ompi_java.StatusClass); + (*env)->SetObjectField(env, jStatus, ompi_java.StatusData, jData); + return jStatus; +} + +jobject ompi_java_status_newIndex(JNIEnv *env, MPI_Status *status, int index) +{ + jlongArray jData = (*env)->NewLongArray(env, 6); + ompi_java_status_setIndex(env, jData, status, index); + jobject jStatus = (*env)->AllocObject(env, ompi_java.StatusClass); + (*env)->SetObjectField(env, jStatus, ompi_java.StatusData, jData); + return jStatus; } void ompi_java_status_set(JNIEnv *env, jlongArray jData, MPI_Status *status) diff --git a/ompi/mpi/java/java/Comm.java b/ompi/mpi/java/java/Comm.java index 5edef9652f..fcd8c4def8 100644 --- a/ompi/mpi/java/java/Comm.java +++ b/ompi/mpi/java/java/Comm.java @@ -894,11 +894,10 @@ private native int packSize(long comm, int incount, long type) public final Status iProbe(int source, int tag) throws MPIException { MPI.check(); - long[] status = iProbe(handle, source, tag); - return status == null ? null : new Status(status); + return iProbe(handle, source, tag); } -private native long[] iProbe(long comm, int source, int tag) +private native Status iProbe(long comm, int source, int tag) throws MPIException; /** diff --git a/ompi/mpi/java/java/Message.java b/ompi/mpi/java/java/Message.java index 4a8a67a46a..b3647de60c 100644 --- a/ompi/mpi/java/java/Message.java +++ b/ompi/mpi/java/java/Message.java @@ -100,11 +100,10 @@ private native long mProbe(int source, int tag, long comm, long[] status) public Status imProbe(int source, int tag, Comm comm) throws MPIException { MPI.check(); - long[] status = imProbe(source, tag, comm.handle); - return status == null ? null : new Status(status); + return imProbe(source, tag, comm.handle); } -private native long[] imProbe(int source, int tag, long comm) +private native Status imProbe(int source, int tag, long comm) throws MPIException; /** diff --git a/ompi/mpi/java/java/Request.java b/ompi/mpi/java/java/Request.java index 2a0ce1ce7f..b9ddee9f81 100644 --- a/ompi/mpi/java/java/Request.java +++ b/ompi/mpi/java/java/Request.java @@ -66,12 +66,6 @@ package mpi; */ public class Request implements Freeable { -// Auxiliary status data. -// It's used to avoid creating status objects in the C side. -// It also avoids setting objects attributes in the C side. -// Calling java methods and setting object attributes from C is very slow. -private long[] status = Status.newData(); - protected long handle; static @@ -134,8 +128,9 @@ public final boolean isNull() public final Status waitStatus() throws MPIException { MPI.check(); - handle = waitStatus(handle, status); - return newStatus(); + Status status = new Status(); + handle = waitStatus(handle, status.data); + return status; } private native long waitStatus(long request, long[] stat) throws MPIException; @@ -166,11 +161,10 @@ private native long waitFor(long request) throws MPIException; public final Status testStatus() throws MPIException { MPI.check(); - return testStatus(handle, status) ? newStatus() : null; + return testStatus(handle); } -private native boolean testStatus(long request, long[] status) - throws MPIException; +private native Status testStatus(long request) throws MPIException; /** * Returns true if the operation identified by the request @@ -205,10 +199,10 @@ public static Status waitAnyStatus(Request[] requests) throws MPIException { MPI.check(); long[] r = getHandles(requests); - long[] status = Status.newData(); - waitAnyStatus(r, status); + Status status = new Status(); + waitAnyStatus(r, status.data); setHandles(requests, r); - return new Status(status); + return status; } private static native void waitAnyStatus(long[] requests, long[] status) @@ -252,20 +246,12 @@ public static Status testAnyStatus(Request[] requests) throws MPIException { MPI.check(); long[] r = getHandles(requests); - long[] status = requests.length==0 ? Status.newData() : requests[0].status; - boolean completed = testAnyStatus(r, status); + Status status = testAnyStatus(r); setHandles(requests, r); - - if(!completed) - return null; - else if(requests.length == 0) - return new Status(status); - else - return requests[0].newStatus(); + return status; } -private static native boolean testAnyStatus(long[] requests, long[] status) - throws MPIException; +private static native Status testAnyStatus(long[] requests) throws MPIException; /** * Tests for completion of either one or none of the operations @@ -303,12 +289,12 @@ public static Status[] waitAllStatus(Request[] requests) throws MPIException { MPI.check(); long[] r = getHandles(requests); - waitAllStatus(r, requests); + Status[] status = waitAllStatus(r); setHandles(requests, r); - return newStatuses(requests, requests.length); + return status; } -private static native void waitAllStatus(long[] requests, Request[] objReqs) +private static native Status[] waitAllStatus(long[] requests) throws MPIException; /** @@ -343,12 +329,12 @@ public static Status[] testAllStatus(Request[] requests) throws MPIException { MPI.check(); long[] r = getHandles(requests); - int count = testAllStatus(r, requests); + Status[] status = testAllStatus(r); setHandles(requests, r); - return newStatuses(requests, count); + return status; } -private static native int testAllStatus(long[] requests, Request[] objReqs) +private static native Status[] testAllStatus(long[] requests) throws MPIException; /** @@ -389,12 +375,12 @@ public static Status[] waitSomeStatus(Request[] requests) throws MPIException { MPI.check(); long[] r = getHandles(requests); - int count = waitSomeStatus(r, requests); + Status[] status = waitSomeStatus(r); setHandles(requests, r); - return newStatuses(requests, count); + return status; } -private static native int waitSomeStatus(long[] requests, Request[] objReqs) +private static native Status[] waitSomeStatus(long[] requests) throws MPIException; /** @@ -433,12 +419,12 @@ public static Status[] testSomeStatus(Request[] requests) throws MPIException { MPI.check(); long[] r = getHandles(requests); - int count = testSomeStatus(r, requests); + Status[] status = testSomeStatus(r); setHandles(requests, r); - return newStatuses(requests, count); + return status; } -private static native int testSomeStatus(long[] requests, Request[] objReqs) +private static native Status[] testSomeStatus(long[] requests) throws MPIException; /** @@ -477,24 +463,4 @@ protected static void setHandles(Request[] r, long[] h) r[i].handle = h[i]; } -private static Status[] newStatuses(Request[] r, int count) -{ - if(count < 0) - return null; - - Status[] s = new Status[count]; - - for(int i = 0; i < count; i++) - s[i] = r[i].newStatus(); - - return s; -} - -private Status newStatus() -{ - Status s = new Status(status); - status = Status.newData(); - return s; -} - } // Request diff --git a/ompi/mpi/java/java/Status.java b/ompi/mpi/java/java/Status.java index 2490121635..393fcd3518 100644 --- a/ompi/mpi/java/java/Status.java +++ b/ompi/mpi/java/java/Status.java @@ -52,6 +52,13 @@ public final class Status { protected final long[] data; +static +{ + init(); +} + +private static native void init(); + /** * Status objects must be created only by the MPI methods. */ @@ -60,23 +67,6 @@ protected Status() data = new long[6]; } -/** - * Status objects must be created only by the MPI methods. - */ -protected Status(long[] data) -{ - assert data.length == 6; - this.data = data; -} - -/** - * Creates the status data. - */ -protected static long[] newData() -{ - return new long[6]; -} - /** * Returns the number of received entries. *

Java binding of the MPI operation {@code MPI_GET_COUNT}.