This source file includes following definitions.
- Java_mpi_Datatype_init
- Java_mpi_Datatype_getDatatype
- Java_mpi_Datatype_getLbExtent
- Java_mpi_Datatype_getTrueLbExtent
- Java_mpi_Datatype_getSize
- Java_mpi_Datatype_commit
- Java_mpi_Datatype_free
- Java_mpi_Datatype_dup
- Java_mpi_Datatype_getContiguous
- Java_mpi_Datatype_getVector
- Java_mpi_Datatype_getHVector
- Java_mpi_Datatype_getIndexed
- Java_mpi_Datatype_getHIndexed
- Java_mpi_Datatype_getStruct
- Java_mpi_Datatype_getResized
- Java_mpi_Datatype_setName
- Java_mpi_Datatype_getName
- typeCopyAttr
- typeDeleteAttr
- Java_mpi_Datatype_createKeyval_1jni
- Java_mpi_Datatype_freeKeyval_1jni
- Java_mpi_Datatype_setAttr
- Java_mpi_Datatype_getAttr
- Java_mpi_Datatype_deleteAttr
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 #include "ompi_config.h"
51
52 #include <stdlib.h>
53 #ifdef HAVE_TARGETCONDITIONALS_H
54 #include <TargetConditionals.h>
55 #endif
56
57 #include "mpi.h"
58 #include "mpi_Datatype.h"
59 #include "mpiJava.h"
60
61 MPI_Datatype Dts[] = { MPI_DATATYPE_NULL,
62 MPI_UINT8_T,
63 MPI_UINT16_T,
64 MPI_INT16_T,
65 MPI_UINT8_T,
66
67 MPI_INT32_T,
68 MPI_INT64_T,
69 MPI_FLOAT,
70 MPI_DOUBLE,
71 MPI_PACKED,
72 MPI_2INT,
73 MPI_SHORT_INT,
74 MPI_LONG_INT,
75 MPI_FLOAT_INT,
76 MPI_DOUBLE_INT,
77 MPI_C_FLOAT_COMPLEX,
78 MPI_C_DOUBLE_COMPLEX
79 };
80
81 JNIEXPORT void JNICALL Java_mpi_Datatype_init(JNIEnv *e, jclass clazz)
82 {
83 ompi_java.DatatypeHandle = (*e)->GetFieldID(e, clazz, "handle", "J");
84 ompi_java.DatatypeBaseType = (*e)->GetFieldID(e, clazz, "baseType", "I");
85 ompi_java.DatatypeBaseSize = (*e)->GetFieldID(e, clazz, "baseSize", "I");
86 }
87
88 JNIEXPORT jlong JNICALL Java_mpi_Datatype_getDatatype(
89 JNIEnv *e, jobject jthis, jint type)
90 {
91 return (jlong)Dts[type];
92 }
93
94 JNIEXPORT void JNICALL Java_mpi_Datatype_getLbExtent(
95 JNIEnv *env, jobject jthis, jlong type, jintArray jLbExt)
96 {
97 MPI_Aint lb, extent;
98 int rc = MPI_Type_get_extent((MPI_Datatype)type, &lb, &extent);
99 if(ompi_java_exceptionCheck(env, rc))
100 return;
101
102 jint *lbExt = (*env)->GetIntArrayElements(env, jLbExt, NULL);
103 lbExt[0] = (jint)lb;
104 lbExt[1] = (jint)extent;
105 (*env)->ReleaseIntArrayElements(env, jLbExt, lbExt, 0);
106 }
107
108 JNIEXPORT void JNICALL Java_mpi_Datatype_getTrueLbExtent(
109 JNIEnv *env, jobject jthis, jlong type, jintArray jLbExt)
110 {
111 MPI_Aint lb, extent;
112 int rc = MPI_Type_get_true_extent((MPI_Datatype)type, &lb, &extent);
113 if(ompi_java_exceptionCheck(env, rc))
114 return;
115
116 jint *lbExt = (*env)->GetIntArrayElements(env, jLbExt, NULL);
117 lbExt[0] = (jint)lb;
118 lbExt[1] = (jint)extent;
119 (*env)->ReleaseIntArrayElements(env, jLbExt, lbExt, 0);
120 }
121
122 JNIEXPORT jint JNICALL Java_mpi_Datatype_getSize(
123 JNIEnv *env, jobject jthis, jlong type)
124 {
125 int rc, result;
126 rc = MPI_Type_size((MPI_Datatype)type, &result);
127 ompi_java_exceptionCheck(env, rc);
128 return result;
129 }
130
131 JNIEXPORT void JNICALL Java_mpi_Datatype_commit(
132 JNIEnv *env, jobject jthis, jlong handle)
133 {
134 MPI_Datatype type = (MPI_Datatype)handle;
135 int rc = MPI_Type_commit(&type);
136 ompi_java_exceptionCheck(env, rc);
137 }
138
139 JNIEXPORT jlong JNICALL Java_mpi_Datatype_free(
140 JNIEnv *env, jobject jthis, jlong handle)
141 {
142 MPI_Datatype type = (MPI_Datatype)handle;
143
144 if(type != MPI_DATATYPE_NULL)
145 {
146 int rc = MPI_Type_free(&type);
147 ompi_java_exceptionCheck(env, rc);
148 }
149
150 return (jlong)type;
151 }
152
153 JNIEXPORT jlong JNICALL Java_mpi_Datatype_dup(
154 JNIEnv *env, jobject jthis, jlong oldType)
155 {
156 MPI_Datatype newType;
157 int rc = MPI_Type_dup((MPI_Datatype)oldType, &newType);
158 ompi_java_exceptionCheck(env, rc);
159 return (jlong)newType;
160 }
161
162 JNIEXPORT jlong JNICALL Java_mpi_Datatype_getContiguous(
163 JNIEnv *env, jclass clazz, jint count, jlong oldType)
164 {
165 MPI_Datatype type;
166 int rc = MPI_Type_contiguous(count, (MPI_Datatype)oldType, &type);
167 ompi_java_exceptionCheck(env, rc);
168 return (jlong)type;
169 }
170
171 JNIEXPORT jlong JNICALL Java_mpi_Datatype_getVector(
172 JNIEnv *env, jclass clazz, jint count,
173 jint blockLength, jint stride, jlong oldType)
174 {
175 MPI_Datatype type;
176
177 int rc = MPI_Type_vector(count, blockLength, stride,
178 (MPI_Datatype)oldType, &type);
179
180 ompi_java_exceptionCheck(env, rc);
181 return (jlong)type;
182 }
183
184 JNIEXPORT jlong JNICALL Java_mpi_Datatype_getHVector(
185 JNIEnv *env, jclass clazz, jint count,
186 jint blockLength, jint stride, jlong oldType)
187 {
188 MPI_Datatype type;
189
190 int rc = MPI_Type_create_hvector(count, blockLength, stride,
191 (MPI_Datatype)oldType, &type);
192
193 ompi_java_exceptionCheck(env, rc);
194 return (jlong)type;
195 }
196
197 JNIEXPORT jlong JNICALL Java_mpi_Datatype_getIndexed(
198 JNIEnv *env, jclass clazz, jintArray blockLengths,
199 jintArray disps, jlong oldType)
200 {
201 MPI_Datatype type;
202 int count = (*env)->GetArrayLength(env, blockLengths);
203
204 jint *jBlockLengths, *jDispl;
205 int *cBlockLengths, *cDispl;
206 ompi_java_getIntArray(env, blockLengths, &jBlockLengths, &cBlockLengths);
207 ompi_java_getIntArray(env, disps, &jDispl, &cDispl);
208
209 int rc = MPI_Type_indexed(count, cBlockLengths, cDispl,
210 (MPI_Datatype)oldType, &type);
211
212 ompi_java_exceptionCheck(env, rc);
213 ompi_java_forgetIntArray(env, blockLengths, jBlockLengths, cBlockLengths);
214 ompi_java_forgetIntArray(env, disps, jDispl, cDispl);
215 return (jlong)type;
216 }
217
218 JNIEXPORT jlong JNICALL Java_mpi_Datatype_getHIndexed(
219 JNIEnv *env, jclass clazz, jintArray blockLengths,
220 jintArray disps, jlong oldType)
221 {
222 MPI_Datatype type;
223 int count = (*env)->GetArrayLength(env, blockLengths);
224 jint *jBlockLengths;
225 int *cBlockLengths;
226 ompi_java_getIntArray(env, blockLengths, &jBlockLengths, &cBlockLengths);
227
228 jint *jDisps = (*env)->GetIntArrayElements(env, disps, NULL);
229 MPI_Aint *cDisps = (MPI_Aint*)calloc(count, sizeof(MPI_Aint));
230 int i;
231
232 for(i = 0; i < count; i++)
233 cDisps[i] = jDisps[i];
234
235 int rc = MPI_Type_create_hindexed(count, cBlockLengths, cDisps,
236 (MPI_Datatype)oldType, &type);
237
238 ompi_java_exceptionCheck(env, rc);
239 free(cDisps);
240 ompi_java_forgetIntArray(env, blockLengths, jBlockLengths, cBlockLengths);
241 (*env)->ReleaseIntArrayElements(env, disps, jDisps, JNI_ABORT);
242 return (jlong)type;
243 }
244
245 JNIEXPORT jlong JNICALL Java_mpi_Datatype_getStruct(
246 JNIEnv *env, jclass clazz, jintArray blockLengths,
247 jintArray disps, jobjectArray datatypes)
248 {
249 int count = (*env)->GetArrayLength(env, blockLengths);
250 jint *jBlockLengths;
251 int *cBlockLengths;
252 ompi_java_getIntArray(env, blockLengths, &jBlockLengths, &cBlockLengths);
253
254 jint *jDisps = (*env)->GetIntArrayElements(env, disps, NULL);
255 MPI_Aint *cDisps = (MPI_Aint*)calloc(count, sizeof(MPI_Aint));
256
257 MPI_Datatype *cTypes = (MPI_Datatype*)calloc(count, sizeof(MPI_Datatype));
258 int i;
259
260 for(i = 0; i < count; i++)
261 {
262 cDisps[i] = jDisps[i];
263 jobject type = (*env)->GetObjectArrayElement(env, datatypes, i);
264
265 cTypes[i] = (MPI_Datatype)(*env)->GetLongField(
266 env, type, ompi_java.DatatypeHandle);
267
268 (*env)->DeleteLocalRef(env, type);
269 }
270
271 MPI_Datatype type;
272 int rc = MPI_Type_create_struct(count, cBlockLengths, cDisps, cTypes, &type);
273 ompi_java_exceptionCheck(env, rc);
274
275 free(cDisps);
276 free(cTypes);
277 ompi_java_forgetIntArray(env, blockLengths, jBlockLengths, cBlockLengths);
278 (*env)->ReleaseIntArrayElements(env, disps, jDisps, JNI_ABORT);
279 return (jlong)type;
280 }
281
282 JNIEXPORT jlong JNICALL Java_mpi_Datatype_getResized(
283 JNIEnv *env, jclass clazz, jlong oldType, jint lb, jint extent)
284 {
285 MPI_Datatype type;
286 int rc = MPI_Type_create_resized((MPI_Datatype)oldType, lb, extent, &type);
287 ompi_java_exceptionCheck(env, rc);
288 return (jlong)type;
289 }
290
291 JNIEXPORT void JNICALL Java_mpi_Datatype_setName(
292 JNIEnv *env, jobject jthis, jlong handle, jstring jname)
293 {
294 const char *name = (*env)->GetStringUTFChars(env, jname, NULL);
295 int rc = MPI_Type_set_name((MPI_Datatype)handle, (char*)name);
296 ompi_java_exceptionCheck(env, rc);
297 (*env)->ReleaseStringUTFChars(env, jname, name);
298 }
299
300 JNIEXPORT jstring JNICALL Java_mpi_Datatype_getName(
301 JNIEnv *env, jobject jthis, jlong handle)
302 {
303 char name[MPI_MAX_OBJECT_NAME];
304 int len;
305 int rc = MPI_Type_get_name((MPI_Datatype)handle, name, &len);
306
307 if(ompi_java_exceptionCheck(env, rc))
308 return NULL;
309
310 return (*env)->NewStringUTF(env, name);
311 }
312
313 static int typeCopyAttr(MPI_Datatype oldType, int keyval, void *extraState,
314 void *attrValIn, void *attrValOut, int *flag)
315 {
316 return ompi_java_attrCopy(attrValIn, attrValOut, flag);
317 }
318
319 static int typeDeleteAttr(MPI_Datatype oldType, int keyval,
320 void *attrVal, void *extraState)
321 {
322 return ompi_java_attrDelete(attrVal);
323 }
324
325 JNIEXPORT jint JNICALL Java_mpi_Datatype_createKeyval_1jni(
326 JNIEnv *env, jclass clazz)
327 {
328 int rc, keyval;
329 rc = MPI_Type_create_keyval(typeCopyAttr, typeDeleteAttr, &keyval, NULL);
330 ompi_java_exceptionCheck(env, rc);
331 return keyval;
332 }
333
334 JNIEXPORT void JNICALL Java_mpi_Datatype_freeKeyval_1jni(
335 JNIEnv *env, jclass clazz, jint keyval)
336 {
337 int rc = MPI_Type_free_keyval((int*)(&keyval));
338 ompi_java_exceptionCheck(env, rc);
339 }
340
341 JNIEXPORT void JNICALL Java_mpi_Datatype_setAttr(
342 JNIEnv *env, jobject jthis, jlong type, jint keyval, jbyteArray jval)
343 {
344 void *cval = ompi_java_attrSet(env, jval);
345 int rc = MPI_Type_set_attr((MPI_Datatype)type, keyval, cval);
346 ompi_java_exceptionCheck(env, rc);
347 }
348
349 JNIEXPORT jobject JNICALL Java_mpi_Datatype_getAttr(
350 JNIEnv *env, jobject jthis, jlong type, jint keyval)
351 {
352 int flag;
353 void *val;
354 int rc = MPI_Type_get_attr((MPI_Datatype)type, keyval, &val, &flag);
355
356 if(ompi_java_exceptionCheck(env, rc) || !flag)
357 return NULL;
358
359 return ompi_java_attrGet(env, val);
360 }
361
362 JNIEXPORT void JNICALL Java_mpi_Datatype_deleteAttr(
363 JNIEnv *env, jobject jthis, jlong type, jint keyval)
364 {
365 int rc = MPI_Type_delete_attr((MPI_Datatype)type, keyval);
366 ompi_java_exceptionCheck(env, rc);
367 }