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 }