1
1

Avoid use Status member in Request.

This commit was SVN r31287.
Этот коммит содержится в:
Oscar Vega-Gisbert 2014-03-29 18:13:38 +00:00
родитель 71bdb8c439
Коммит 845818de59
10 изменённых файлов: 103 добавлений и 139 удалений

Просмотреть файл

@ -40,7 +40,8 @@ typedef struct {
jfieldID OpCommute; jfieldID OpCommute;
jmethodID OpCall; jmethodID OpCall;
jfieldID ReqHandle; jfieldID ReqHandle;
jfieldID ReqStatus; jclass StatusClass;
jfieldID StatusData;
jclass ExceptionClass; jclass ExceptionClass;
jmethodID ExceptionInit; jmethodID ExceptionInit;
jclass IntegerClass; jclass IntegerClass;
@ -108,8 +109,9 @@ int ompi_java_attrDelete(void *attrVal);
MPI_Op ompi_java_op_getHandle( MPI_Op ompi_java_op_getHandle(
JNIEnv *env, jobject jOp, jlong hOp, int baseType); JNIEnv *env, jobject jOp, jlong hOp, int baseType);
jlongArray ompi_java_status_new( jobject ompi_java_status_new(JNIEnv *env, MPI_Status *status);
JNIEnv *env, MPI_Status *status); jobject ompi_java_status_newIndex(JNIEnv *env, MPI_Status *status, int index);
void ompi_java_status_set( void ompi_java_status_set(
JNIEnv *env, jlongArray jData, MPI_Status *status); JNIEnv *env, jlongArray jData, MPI_Status *status);
void ompi_java_status_setIndex( void ompi_java_status_setIndex(

Просмотреть файл

@ -715,14 +715,14 @@ JNIEXPORT jint JNICALL Java_mpi_Comm_packSize(
return size; 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) JNIEnv *env, jobject jthis, jlong comm, jint source, jint tag)
{ {
int flag; int flag;
MPI_Status status; MPI_Status status;
int rc = MPI_Iprobe(source, tag, (MPI_Comm)comm, &flag, &status); int rc = MPI_Iprobe(source, tag, (MPI_Comm)comm, &flag, &status);
ompi_java_exceptionCheck(env, rc); 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( JNIEXPORT void JNICALL Java_mpi_Comm_probe(

Просмотреть файл

@ -395,6 +395,7 @@ void ompi_java_findClasses(JNIEnv *env)
ompi_java.DistGraphNeighborsClass = ompi_java_findClass( ompi_java.DistGraphNeighborsClass = ompi_java_findClass(
env, "mpi/DistGraphNeighbors"); env, "mpi/DistGraphNeighbors");
ompi_java.StatusClass = ompi_java_findClass(env, "mpi/Status");
ompi_java.ExceptionClass = ompi_java_findClass(env, "mpi/MPIException"); ompi_java.ExceptionClass = ompi_java_findClass(env, "mpi/MPIException");
ompi_java.ExceptionInit = (*env)->GetMethodID( ompi_java.ExceptionInit = (*env)->GetMethodID(
@ -425,6 +426,7 @@ void ompi_java_deleteClasses(JNIEnv *env)
(*env)->DeleteGlobalRef(env, ompi_java.ShiftParmsClass); (*env)->DeleteGlobalRef(env, ompi_java.ShiftParmsClass);
(*env)->DeleteGlobalRef(env, ompi_java.GraphParmsClass); (*env)->DeleteGlobalRef(env, ompi_java.GraphParmsClass);
(*env)->DeleteGlobalRef(env, ompi_java.DistGraphNeighborsClass); (*env)->DeleteGlobalRef(env, ompi_java.DistGraphNeighborsClass);
(*env)->DeleteGlobalRef(env, ompi_java.StatusClass);
(*env)->DeleteGlobalRef(env, ompi_java.ExceptionClass); (*env)->DeleteGlobalRef(env, ompi_java.ExceptionClass);
(*env)->DeleteGlobalRef(env, ompi_java.IntegerClass); (*env)->DeleteGlobalRef(env, ompi_java.IntegerClass);
(*env)->DeleteGlobalRef(env, ompi_java.LongClass); (*env)->DeleteGlobalRef(env, ompi_java.LongClass);

Просмотреть файл

@ -46,7 +46,7 @@ JNIEXPORT jlong JNICALL Java_mpi_Message_mProbe(
return (jlong)message; 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) JNIEnv *env, jobject jthis, jint source, jint tag, jlong jComm)
{ {
MPI_Comm comm = (MPI_Comm)jComm; MPI_Comm comm = (MPI_Comm)jComm;

Просмотреть файл

@ -58,7 +58,6 @@
JNIEXPORT void JNICALL Java_mpi_Request_init(JNIEnv *env, jclass c) JNIEXPORT void JNICALL Java_mpi_Request_init(JNIEnv *env, jclass c)
{ {
ompi_java.ReqHandle = (*env)->GetFieldID(env, c, "handle", "J"); 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) 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); free(jIdx);
} }
static void setStatuses(JNIEnv *env, jobjectArray objReqs, static jobjectArray newStatuses(JNIEnv *env, MPI_Status *statuses, int count)
MPI_Status *statuses, int count)
{ {
jobjectArray array = (*env)->NewObjectArray(env,
count, ompi_java.StatusClass, NULL);
int i; int i;
for(i = 0; i < count; i++) for(i = 0; i < count; i++)
{ {
/* Copy final native status to Java statuses. */ jobject st = ompi_java_status_new(env, statuses + i);
jobject rq = (*env)->GetObjectArrayElement(env, objReqs, i); (*env)->SetObjectArrayElement(env, array, i, st);
jobject st = (*env)->GetObjectField(env, rq, ompi_java.ReqStatus);
ompi_java_status_set(env, st, statuses + i);
(*env)->DeleteLocalRef(env, st); (*env)->DeleteLocalRef(env, st);
(*env)->DeleteLocalRef(env, rq);
}
} }
static void setStatusesIndices( return array;
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; int i;
for(i = 0; i < count; i++) for(i = 0; i < count; i++)
{ {
/* Copy final native status to Java statuses. */ jobject st = ompi_java_status_newIndex(env, statuses + i, indices[i]);
jobject rq = (*env)->GetObjectArrayElement(env, objReqs, i); (*env)->SetObjectArrayElement(env, array, i, st);
jobject st = (*env)->GetObjectField(env, rq, ompi_java.ReqStatus);
ompi_java_status_setIndex(env, st, statuses + i, indices[i]);
(*env)->DeleteLocalRef(env, st); (*env)->DeleteLocalRef(env, st);
(*env)->DeleteLocalRef(env, rq);
} }
return array;
} }
JNIEXPORT jlong JNICALL Java_mpi_Request_getNull(JNIEnv *env, jclass clazz) 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; return (jlong)req;
} }
JNIEXPORT jboolean JNICALL Java_mpi_Request_testStatus( JNIEXPORT jobject JNICALL Java_mpi_Request_testStatus(
JNIEnv *env, jobject jthis, jlong handle, jlongArray jStatus) JNIEnv *env, jobject jthis, jlong handle)
{ {
MPI_Request req = (MPI_Request)handle; MPI_Request req = (MPI_Request)handle;
int flag; int flag;
@ -166,12 +168,7 @@ JNIEXPORT jboolean JNICALL Java_mpi_Request_testStatus(
int rc = MPI_Test(&req, &flag, &status); int rc = MPI_Test(&req, &flag, &status);
ompi_java_exceptionCheck(env, rc); ompi_java_exceptionCheck(env, rc);
(*env)->SetLongField(env, jthis, ompi_java.ReqHandle, (jlong)req); (*env)->SetLongField(env, jthis, ompi_java.ReqHandle, (jlong)req);
return flag ? ompi_java_status_new(env, &status) : NULL;
if(!flag)
return JNI_FALSE;
ompi_java_status_set(env, jStatus, &status);
return JNI_TRUE;
} }
JNIEXPORT jboolean JNICALL Java_mpi_Request_test( JNIEXPORT jboolean JNICALL Java_mpi_Request_test(
@ -215,8 +212,8 @@ JNIEXPORT jint JNICALL Java_mpi_Request_waitAny(
return index; return index;
} }
JNIEXPORT jboolean JNICALL Java_mpi_Request_testAnyStatus( JNIEXPORT jobject JNICALL Java_mpi_Request_testAnyStatus(
JNIEnv *env, jclass clazz, jlongArray requests, jobject jStatus) JNIEnv *env, jclass clazz, jlongArray requests)
{ {
int count = (*env)->GetArrayLength(env, requests); int count = (*env)->GetArrayLength(env, requests);
jlong* jReq; jlong* jReq;
@ -227,12 +224,7 @@ JNIEXPORT jboolean JNICALL Java_mpi_Request_testAnyStatus(
int rc = MPI_Testany(count, cReq, &index, &flag, &status); int rc = MPI_Testany(count, cReq, &index, &flag, &status);
ompi_java_exceptionCheck(env, rc); ompi_java_exceptionCheck(env, rc);
ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq);
return flag ? ompi_java_status_newIndex(env, &status, index) : NULL;
if(!flag)
return JNI_FALSE;
ompi_java_status_setIndex(env, jStatus, &status, index);
return JNI_TRUE;
} }
JNIEXPORT jint JNICALL Java_mpi_Request_testAny( JNIEXPORT jint JNICALL Java_mpi_Request_testAny(
@ -250,8 +242,8 @@ JNIEXPORT jint JNICALL Java_mpi_Request_testAny(
return index; return index;
} }
JNIEXPORT void JNICALL Java_mpi_Request_waitAllStatus( JNIEXPORT jobjectArray JNICALL Java_mpi_Request_waitAllStatus(
JNIEnv *env, jclass clazz, jlongArray requests, jobjectArray objReqs) JNIEnv *env, jclass clazz, jlongArray requests)
{ {
int count = (*env)->GetArrayLength(env, requests); int count = (*env)->GetArrayLength(env, requests);
jlong* jReq; jlong* jReq;
@ -261,8 +253,9 @@ JNIEXPORT void JNICALL Java_mpi_Request_waitAllStatus(
int rc = MPI_Waitall(count, cReq, statuses); int rc = MPI_Waitall(count, cReq, statuses);
ompi_java_exceptionCheck(env, rc); ompi_java_exceptionCheck(env, rc);
ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq);
setStatuses(env, objReqs, statuses, count); jobjectArray jStatuses = newStatuses(env, statuses, count);
free(statuses); free(statuses);
return jStatuses;
} }
JNIEXPORT void JNICALL Java_mpi_Request_waitAll( 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); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq);
} }
JNIEXPORT int JNICALL Java_mpi_Request_testAllStatus( JNIEXPORT jobjectArray JNICALL Java_mpi_Request_testAllStatus(
JNIEnv *env, jclass clazz, jlongArray requests, jobjectArray objReqs) JNIEnv *env, jclass clazz, jlongArray requests)
{ {
int count = (*env)->GetArrayLength(env, requests); int count = (*env)->GetArrayLength(env, requests);
jlong* jReq; jlong* jReq;
@ -289,12 +282,9 @@ JNIEXPORT int JNICALL Java_mpi_Request_testAllStatus(
int rc = MPI_Testall(count, cReq, &flag, statuses); int rc = MPI_Testall(count, cReq, &flag, statuses);
ompi_java_exceptionCheck(env, rc); ompi_java_exceptionCheck(env, rc);
ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq);
jobjectArray jStatuses = flag ? newStatuses(env, statuses, count) : NULL;
if(flag)
setStatuses(env, objReqs, statuses, count);
free(statuses); free(statuses);
return flag ? count : -1; return jStatuses;
} }
JNIEXPORT jboolean JNICALL Java_mpi_Request_testAll( JNIEXPORT jboolean JNICALL Java_mpi_Request_testAll(
@ -311,8 +301,8 @@ JNIEXPORT jboolean JNICALL Java_mpi_Request_testAll(
return flag ? JNI_TRUE : JNI_FALSE; return flag ? JNI_TRUE : JNI_FALSE;
} }
JNIEXPORT jint JNICALL Java_mpi_Request_waitSomeStatus( JNIEXPORT jobjectArray JNICALL Java_mpi_Request_waitSomeStatus(
JNIEnv *env, jclass clazz, jlongArray requests, jobjectArray objReqs) JNIEnv *env, jclass clazz, jlongArray requests)
{ {
int incount = (*env)->GetArrayLength(env, requests); int incount = (*env)->GetArrayLength(env, requests);
jlong* jReq; jlong* jReq;
@ -324,10 +314,10 @@ JNIEXPORT jint JNICALL Java_mpi_Request_waitSomeStatus(
int rc = MPI_Waitsome(incount, cReq, &outcount, indices, statuses); int rc = MPI_Waitsome(incount, cReq, &outcount, indices, statuses);
ompi_java_exceptionCheck(env, rc); ompi_java_exceptionCheck(env, rc);
ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq);
setStatusesIndices(env, objReqs, statuses, indices, outcount); jobjectArray jStatuses = newStatusesIndices(env, statuses, indices, outcount);
free(statuses); free(statuses);
free(indices); free(indices);
return outcount; return jStatuses;
} }
JNIEXPORT jintArray JNICALL Java_mpi_Request_waitSome( JNIEXPORT jintArray JNICALL Java_mpi_Request_waitSome(
@ -354,8 +344,8 @@ JNIEXPORT jintArray JNICALL Java_mpi_Request_waitSome(
return jindices; return jindices;
} }
JNIEXPORT int JNICALL Java_mpi_Request_testSomeStatus( JNIEXPORT jobjectArray JNICALL Java_mpi_Request_testSomeStatus(
JNIEnv *env, jclass clazz, jlongArray requests, jobjectArray objReqs) JNIEnv *env, jclass clazz, jlongArray requests)
{ {
int incount = (*env)->GetArrayLength(env, requests); int incount = (*env)->GetArrayLength(env, requests);
jlong* jReq; jlong* jReq;
@ -367,10 +357,10 @@ JNIEXPORT int JNICALL Java_mpi_Request_testSomeStatus(
int rc = MPI_Testsome(incount, cReq, &outcount, indices, statuses); int rc = MPI_Testsome(incount, cReq, &outcount, indices, statuses);
ompi_java_exceptionCheck(env, rc); ompi_java_exceptionCheck(env, rc);
ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq); ompi_java_releasePtrArray(env, requests, jReq, (void**)cReq);
setStatusesIndices(env, objReqs, statuses, indices, outcount); jobjectArray jStatuses = newStatusesIndices(env, statuses, indices, outcount);
free(statuses); free(statuses);
free(indices); free(indices);
return outcount; return jStatuses;
} }
JNIEXPORT jintArray JNICALL Java_mpi_Request_testSome( JNIEXPORT jintArray JNICALL Java_mpi_Request_testSome(

Просмотреть файл

@ -66,6 +66,11 @@ static void getStatus(MPI_Status *status, jint source, jint tag,
status->_ucount = ucount; 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( JNIEXPORT jint JNICALL Java_mpi_Status_getCount(
JNIEnv *env, jobject jthis, jint source, jint tag, JNIEnv *env, jobject jthis, jint source, jint tag,
jint error, jint cancelled, jlong ucount, jlong jType) jint error, jint cancelled, jlong ucount, jlong jType)
@ -104,11 +109,22 @@ JNIEXPORT jint JNICALL Java_mpi_Status_getElements(
return count; 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); jlongArray jData = (*env)->NewLongArray(env, 6);
ompi_java_status_set(env, jData, status); 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) void ompi_java_status_set(JNIEnv *env, jlongArray jData, MPI_Status *status)

Просмотреть файл

@ -894,11 +894,10 @@ private native int packSize(long comm, int incount, long type)
public final Status iProbe(int source, int tag) throws MPIException public final Status iProbe(int source, int tag) throws MPIException
{ {
MPI.check(); MPI.check();
long[] status = iProbe(handle, source, tag); return iProbe(handle, source, tag);
return status == null ? null : new Status(status);
} }
private native long[] iProbe(long comm, int source, int tag) private native Status iProbe(long comm, int source, int tag)
throws MPIException; throws MPIException;
/** /**

Просмотреть файл

@ -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 public Status imProbe(int source, int tag, Comm comm) throws MPIException
{ {
MPI.check(); MPI.check();
long[] status = imProbe(source, tag, comm.handle); return imProbe(source, tag, comm.handle);
return status == null ? null : new Status(status);
} }
private native long[] imProbe(int source, int tag, long comm) private native Status imProbe(int source, int tag, long comm)
throws MPIException; throws MPIException;
/** /**

Просмотреть файл

@ -66,12 +66,6 @@ package mpi;
*/ */
public class Request implements Freeable 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; protected long handle;
static static
@ -134,8 +128,9 @@ public final boolean isNull()
public final Status waitStatus() throws MPIException public final Status waitStatus() throws MPIException
{ {
MPI.check(); MPI.check();
handle = waitStatus(handle, status); Status status = new Status();
return newStatus(); handle = waitStatus(handle, status.data);
return status;
} }
private native long waitStatus(long request, long[] stat) throws MPIException; 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 public final Status testStatus() throws MPIException
{ {
MPI.check(); MPI.check();
return testStatus(handle, status) ? newStatus() : null; return testStatus(handle);
} }
private native boolean testStatus(long request, long[] status) private native Status testStatus(long request) throws MPIException;
throws MPIException;
/** /**
* Returns true if the operation identified by the request * Returns true if the operation identified by the request
@ -205,10 +199,10 @@ public static Status waitAnyStatus(Request[] requests) throws MPIException
{ {
MPI.check(); MPI.check();
long[] r = getHandles(requests); long[] r = getHandles(requests);
long[] status = Status.newData(); Status status = new Status();
waitAnyStatus(r, status); waitAnyStatus(r, status.data);
setHandles(requests, r); setHandles(requests, r);
return new Status(status); return status;
} }
private static native void waitAnyStatus(long[] requests, long[] status) private static native void waitAnyStatus(long[] requests, long[] status)
@ -252,20 +246,12 @@ public static Status testAnyStatus(Request[] requests) throws MPIException
{ {
MPI.check(); MPI.check();
long[] r = getHandles(requests); long[] r = getHandles(requests);
long[] status = requests.length==0 ? Status.newData() : requests[0].status; Status status = testAnyStatus(r);
boolean completed = testAnyStatus(r, status);
setHandles(requests, r); setHandles(requests, r);
return status;
if(!completed)
return null;
else if(requests.length == 0)
return new Status(status);
else
return requests[0].newStatus();
} }
private static native boolean testAnyStatus(long[] requests, long[] status) private static native Status testAnyStatus(long[] requests) throws MPIException;
throws MPIException;
/** /**
* Tests for completion of either one or none of the operations * 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(); MPI.check();
long[] r = getHandles(requests); long[] r = getHandles(requests);
waitAllStatus(r, requests); Status[] status = waitAllStatus(r);
setHandles(requests, 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; throws MPIException;
/** /**
@ -343,12 +329,12 @@ public static Status[] testAllStatus(Request[] requests) throws MPIException
{ {
MPI.check(); MPI.check();
long[] r = getHandles(requests); long[] r = getHandles(requests);
int count = testAllStatus(r, requests); Status[] status = testAllStatus(r);
setHandles(requests, 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; throws MPIException;
/** /**
@ -389,12 +375,12 @@ public static Status[] waitSomeStatus(Request[] requests) throws MPIException
{ {
MPI.check(); MPI.check();
long[] r = getHandles(requests); long[] r = getHandles(requests);
int count = waitSomeStatus(r, requests); Status[] status = waitSomeStatus(r);
setHandles(requests, 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; throws MPIException;
/** /**
@ -433,12 +419,12 @@ public static Status[] testSomeStatus(Request[] requests) throws MPIException
{ {
MPI.check(); MPI.check();
long[] r = getHandles(requests); long[] r = getHandles(requests);
int count = testSomeStatus(r, requests); Status[] status = testSomeStatus(r);
setHandles(requests, 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; throws MPIException;
/** /**
@ -477,24 +463,4 @@ protected static void setHandles(Request[] r, long[] h)
r[i].handle = h[i]; 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 } // Request

Просмотреть файл

@ -52,6 +52,13 @@ public final class Status
{ {
protected final long[] data; protected final long[] data;
static
{
init();
}
private static native void init();
/** /**
* Status objects must be created only by the MPI methods. * Status objects must be created only by the MPI methods.
*/ */
@ -60,23 +67,6 @@ protected Status()
data = new long[6]; 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. * Returns the number of received entries.
* <p>Java binding of the MPI operation {@code MPI_GET_COUNT}. * <p>Java binding of the MPI operation {@code MPI_GET_COUNT}.