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;
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(

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

@ -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(

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

@ -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);

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

@ -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;

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

@ -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(

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

@ -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)

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

@ -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;
/**

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

@ -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;
/**

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

@ -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

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

@ -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.
* <p>Java binding of the MPI operation {@code MPI_GET_COUNT}.