diff options
author | lrknox <lrknox> | 2017-04-13 17:42:27 (GMT) |
---|---|---|
committer | lrknox <lrknox> | 2017-04-13 17:42:27 (GMT) |
commit | 32e706e2cc1cb73cc6cacf78e9174b7afa5e5430 (patch) | |
tree | 1fb96d63d689ad331ffc19f00478d8eab8726508 | |
parent | c96423b6431f0ab9efbefa03481258f598b85a7e (diff) | |
parent | 906c1819188755a04fde6cc0ad7346775a6e61b8 (diff) | |
download | hdf5-32e706e2cc1cb73cc6cacf78e9174b7afa5e5430.zip hdf5-32e706e2cc1cb73cc6cacf78e9174b7afa5e5430.tar.gz hdf5-32e706e2cc1cb73cc6cacf78e9174b7afa5e5430.tar.bz2 |
Merge branch 'develop' into hdf5_1_10_1
-rw-r--r-- | java/src/hdf/hdf5lib/H5.java | 3 | ||||
-rw-r--r-- | java/src/jni/h5dImp.c | 91 | ||||
-rw-r--r-- | java/src/jni/h5dImp.h | 9 | ||||
-rw-r--r-- | test/fheap.c | 13 |
4 files changed, 114 insertions, 2 deletions
diff --git a/java/src/hdf/hdf5lib/H5.java b/java/src/hdf/hdf5lib/H5.java index 03d7b6b..1f0dd3a 100644 --- a/java/src/hdf/hdf5lib/H5.java +++ b/java/src/hdf/hdf5lib/H5.java @@ -1796,6 +1796,9 @@ public class H5 implements java.io.Serializable { return H5Dread_short(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf, true); } + public synchronized static native int H5DreadVL(long dataset_id, long mem_type_id, long mem_space_id, + long file_space_id, long xfer_plist_id, Object[] buf) throws HDF5LibraryException, NullPointerException; + public synchronized static native int H5Dread_string(long dataset_id, long mem_type_id, long mem_space_id, long file_space_id, long xfer_plist_id, String[] buf) throws HDF5LibraryException, NullPointerException; diff --git a/java/src/jni/h5dImp.c b/java/src/jni/h5dImp.c index d869601..66efed0 100644 --- a/java/src/jni/h5dImp.c +++ b/java/src/jni/h5dImp.c @@ -53,6 +53,7 @@ extern jobject visit_callback; /* Local Prototypes */ /********************/ +static herr_t H5DreadVL_asstr (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t file_sid, hid_t xfer_plist_id, jobjectArray buf); static herr_t H5DreadVL_str (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t file_sid, hid_t xfer_plist_id, jobjectArray buf); static herr_t H5DreadVL_array (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t file_sid, hid_t xfer_plist_id, jobjectArray buf); static herr_t H5DwriteVL_str (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t file_sid, hid_t xfer_plist_id, jobjectArray buf); @@ -992,6 +993,96 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1double /* * Class: hdf_hdf5lib_H5 + * Method: H5DreadVL + * Signature: (JJJJJ[Ljava/lang/String;)I + */ +JNIEXPORT jint JNICALL +Java_hdf_hdf5lib_H5_H5DreadVL + (JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id, + jlong file_space_id, jlong xfer_plist_id, jobjectArray buf) +{ + herr_t status = -1; + htri_t isVlenStr=0; + + if (buf == NULL) { + h5nullArgument(env, "H5DreadVL: buf is NULL"); + } /* end if */ + else { + isVlenStr = H5Tdetect_class((hid_t)mem_type_id, H5T_STRING); + + if (isVlenStr) + h5badArgument(env, "H5DreadVL: type is not variable length non-string"); + else + status = H5DreadVL_asstr(env, (hid_t)dataset_id, (hid_t)mem_type_id, + (hid_t)mem_space_id, (hid_t)file_space_id, + (hid_t)xfer_plist_id, buf); + } /* end else */ + + return (jint)status; +} /* end Java_hdf_hdf5lib_H5_H5Dread_1VLStrings */ + +herr_t +H5DreadVL_asstr + (JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t file_sid, hid_t xfer_plist_id, jobjectArray buf) +{ + jint i; + jint n; + jstring jstr; + h5str_t h5str; + hvl_t *rdata; + size_t size; + size_t max_len = 0; + herr_t status = -1; + + n = ENVPTR->GetArrayLength(ENVPAR buf); + rdata = (hvl_t*)HDcalloc((size_t)n, sizeof(hvl_t)); + if (rdata == NULL) { + h5JNIFatalError(env, "H5DreadVL_notstr: failed to allocate buff for read"); + } /* end if */ + else { + status = H5Dread(did, tid, mem_sid, file_sid, xfer_plist_id, rdata); + + if (status < 0) { + H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, rdata); + HDfree(rdata); + h5JNIFatalError(env, "H5DreadVL_notstr: failed to read data"); + } /* end if */ + else { + max_len = 1; + for (i=0; i < n; i++) { + if ((rdata + i)->len > max_len) + max_len = (rdata + i)->len; + } + + size = H5Tget_size(tid) * max_len; + HDmemset(&h5str, 0, sizeof(h5str_t)); + h5str_new(&h5str, 4 * size); + + if (h5str.s == NULL) { + H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, rdata); + HDfree(rdata); + h5JNIFatalError(env, "H5DreadVL_notstr: failed to allocate buf"); + } /* end if */ + else { + for (i=0; i < n; i++) { + h5str.s[0] = '\0'; + h5str_sprintf(&h5str, did, tid, rdata+i, 0); + jstr = ENVPTR->NewStringUTF(ENVPAR h5str.s); + ENVPTR->SetObjectArrayElement(ENVPAR buf, i, jstr); + } /* end for */ + h5str_free(&h5str); + + H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, rdata); + HDfree(rdata); + } /* end else */ + } /* end else */ + } /* end else */ + + return status; +} + +/* + * Class: hdf_hdf5lib_H5 * Method: H5Dread_string * Signature: (JJJJJ[Ljava/lang/String;)I */ diff --git a/java/src/jni/h5dImp.h b/java/src/jni/h5dImp.h index 22b8f63..3cf24fe 100644 --- a/java/src/jni/h5dImp.h +++ b/java/src/jni/h5dImp.h @@ -204,6 +204,15 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1double /* * Class: hdf_hdf5lib_H5 + * Method: H5DreadVL + * Signature: (JJJJJ[Ljava/lang/String;)I + */ +JNIEXPORT jint JNICALL +Java_hdf_hdf5lib_H5_H5DreadVL +(JNIEnv*, jclass, jlong, jlong, jlong, jlong, jlong, jobjectArray); + +/* + * Class: hdf_hdf5lib_H5 * Method: H5Dread_string * Signature: (JJJJJ[Ljava/lang/String;)I */ diff --git a/test/fheap.c b/test/fheap.c index 11ee760..4be6cb9 100644 --- a/test/fheap.c +++ b/test/fheap.c @@ -16386,14 +16386,23 @@ main(void) /* * Caution when turning on ExpressMode 0: - * It will activate testing with different combinations of + * It will activate testing with different combinations of * page buffering and file space strategy and the * running time will be long. + * For parallel build, the last two tests for page buffering + * are skipped because this feature is disabled in parallel. + * Activate full testing when this feature is re-enabled + * in the future for parallel build. */ if(ExpressMode > 1) HDprintf("***Express test mode on. Some tests may be skipped\n"); - else if(ExpressMode == 0) + else if(ExpressMode == 0) { +#ifdef H5_HAVE_PARALLEL + num_pb_fs = NUM_PB_FS - 2; +#else num_pb_fs = NUM_PB_FS; +#endif + } /* Initialize heap creation parameters */ init_small_cparam(&small_cparam); |