This source file includes following definitions.
- Java_mpi_Op_init
- Java_mpi_Op_getOp
- setBooleanArray
- getBooleanArray
- opIntercept
- ompi_java_op_getHandle
- Java_mpi_Op_free
- Java_mpi_Op_isNull
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 
  35 
  36 
  37 
  38 
  39 
  40 
  41 
  42 
  43 
  44 
  45 
  46 
  47 
  48 
  49 
  50 
  51 #include "ompi_config.h"
  52 
  53 #ifdef HAVE_TARGETCONDITIONALS_H
  54 #include <TargetConditionals.h>
  55 #endif
  56 
  57 #include "mpi.h"
  58 #include "mpi_Op.h"
  59 #include "mpiJava.h"
  60 #include "ompi/op/op.h"
  61 
  62 JNIEXPORT void JNICALL Java_mpi_Op_init(JNIEnv *env, jclass clazz)
  63 {
  64     ompi_java.OpHandle  = (*env)->GetFieldID(env, clazz, "handle", "J");
  65     ompi_java.OpCommute = (*env)->GetFieldID(env, clazz, "commute", "Z");
  66 
  67     ompi_java.OpCall = (*env)->GetMethodID(env, clazz, "call",
  68                        "(Ljava/lang/Object;Ljava/lang/Object;I)V");
  69 }
  70 
  71 JNIEXPORT void JNICALL Java_mpi_Op_getOp(JNIEnv *env, jobject jthis, jint type)
  72 {
  73     static MPI_Op Ops[] = {
  74         MPI_OP_NULL, MPI_MAX, MPI_MIN, MPI_SUM,
  75         MPI_PROD, MPI_LAND, MPI_BAND, MPI_LOR, MPI_BOR, MPI_LXOR,
  76         MPI_BXOR, MPI_MINLOC, MPI_MAXLOC, MPI_REPLACE, MPI_NO_OP
  77     };
  78     (*env)->SetLongField(env,jthis, ompi_java.OpHandle, (jlong)Ops[type]);
  79 }
  80 
  81 static jobject setBooleanArray(JNIEnv *env, void *vec, int len)
  82 {
  83     jobject obj = (*env)->NewBooleanArray(env, len);
  84 
  85     if(obj != NULL)
  86         (*env)->SetBooleanArrayRegion(env, obj, 0, len, vec);
  87 
  88     return obj;
  89 }
  90 
  91 static void getBooleanArray(JNIEnv *env, jobject obj, void *vec, int len)
  92 {
  93     (*env)->GetBooleanArrayRegion(env, obj, 0, len, vec);
  94 }
  95 
  96 static void opIntercept(void *invec, void *inoutvec, int *count,
  97                         MPI_Datatype *datatype, int baseType,
  98                         void *jnienv, void *object)
  99 {
 100     JNIEnv  *env  = jnienv;
 101     jobject jthis = object;
 102     jobject jin, jio;
 103 
 104     MPI_Aint lb, extent;
 105     int rc = MPI_Type_get_extent(*datatype, &lb, &extent);
 106 
 107     if(ompi_java_exceptionCheck(env, rc))
 108         return;
 109 
 110     int len = (*count) * extent;
 111 
 112     if(baseType == 4)
 113     {
 114         jin = setBooleanArray(env, invec, len);
 115         jio = setBooleanArray(env, inoutvec, len);
 116     }
 117     else
 118     {
 119         jin = (*env)->NewDirectByteBuffer(env, invec, len);
 120         jio = (*env)->NewDirectByteBuffer(env, inoutvec, len);
 121     }
 122 
 123     if((*env)->ExceptionCheck(env))
 124         return;
 125 
 126     (*env)->CallVoidMethod(env, jthis, ompi_java.OpCall, jin, jio, *count);
 127 
 128     if(baseType == 4)
 129         getBooleanArray(env, jio, inoutvec, len);
 130 
 131     (*env)->DeleteLocalRef(env, jin);
 132     (*env)->DeleteLocalRef(env, jio);
 133 }
 134 
 135 MPI_Op ompi_java_op_getHandle(JNIEnv *env, jobject jOp, jlong hOp, int baseType)
 136 {
 137     MPI_Op op = (MPI_Op)hOp;
 138 
 139     if(op == NULL)
 140     {
 141         
 142         int commute = (*env)->GetBooleanField(
 143                       env, jOp, ompi_java.OpCommute);
 144 
 145         int rc = MPI_Op_create((MPI_User_function*)opIntercept, commute, &op);
 146 
 147         if(ompi_java_exceptionCheck(env, rc))
 148             return NULL;
 149 
 150         (*env)->SetLongField(env, jOp, ompi_java.OpHandle, (jlong)op);
 151         ompi_op_set_java_callback(op, env, jOp, baseType);
 152     }
 153 
 154     return op;
 155 }
 156 
 157 JNIEXPORT void JNICALL Java_mpi_Op_free(JNIEnv *env, jobject jthis)
 158 {
 159     MPI_Op op = (MPI_Op)((*env)->GetLongField(env, jthis, ompi_java.OpHandle));
 160 
 161     if(op != NULL && op != MPI_OP_NULL)
 162     {
 163         int rc = MPI_Op_free(&op);
 164         ompi_java_exceptionCheck(env, rc);
 165         ((*env)->SetLongField(env,jthis,ompi_java.OpHandle,(long)MPI_OP_NULL));
 166     }
 167 }
 168 
 169 JNIEXPORT jboolean JNICALL Java_mpi_Op_isNull(JNIEnv *env, jobject jthis)
 170 {
 171     MPI_Op op = (MPI_Op)((*env)->GetLongField(env, jthis, ompi_java.OpHandle));
 172     return op == NULL || op == MPI_OP_NULL ? JNI_TRUE : JNI_FALSE;
 173 }