diff --git a/MANIFEST b/MANIFEST index ae8e0a38cf..1f26d95879 100644 --- a/MANIFEST +++ b/MANIFEST @@ -2882,6 +2882,7 @@ ./java/test/TestH5Fparams.java ./java/test/TestH5Fbasic.java ./java/test/TestH5F.java +./java/test/TestH5Fswmr.java ./java/test/TestH5Gbasic.java ./java/test/TestH5G.java ./java/test/TestH5Giterate.java diff --git a/java/src/hdf/hdf5lib/H5.java b/java/src/hdf/hdf5lib/H5.java index cd5793de12..6b2af4bfbc 100644 --- a/java/src/hdf/hdf5lib/H5.java +++ b/java/src/hdf/hdf5lib/H5.java @@ -2853,6 +2853,17 @@ public class H5 implements java.io.Serializable { public synchronized static native void H5Fclear_elink_file_cache(long file_id) throws HDF5LibraryException; /** + * H5Fstart_swmr_write will activate SWMR writing mode for a file associated with file_id. This routine will + * prepare and ensure the file is safe for SWMR writing. + * + * @param file_id + * IN: Identifier of the target file. + * + * @exception HDF5LibraryException + * - Error from the HDF-5 Library. + **/ + public synchronized static native void H5Fstart_swmr_write(long file_id) throws HDF5LibraryException; + /** * H5Fstart_mdc_logging starts logging metadata cache events if logging was previously enabled. * diff --git a/java/src/hdf/hdf5lib/HDF5Constants.java b/java/src/hdf/hdf5lib/HDF5Constants.java index 80895440df..acd3eb5267 100644 --- a/java/src/hdf/hdf5lib/HDF5Constants.java +++ b/java/src/hdf/hdf5lib/HDF5Constants.java @@ -201,6 +201,8 @@ public class HDF5Constants { public static final int H5F_ACC_RDWR = H5F_ACC_RDWR(); public static final int H5F_ACC_TRUNC = H5F_ACC_TRUNC(); public static final int H5F_ACC_DEFAULT = H5F_ACC_DEFAULT(); + public static final int H5F_ACC_SWMR_READ = H5F_ACC_SWMR_READ(); + public static final int H5F_ACC_SWMR_WRITE = H5F_ACC_SWMR_WRITE(); public static final int H5F_CLOSE_DEFAULT = H5F_CLOSE_DEFAULT(); public static final int H5F_CLOSE_SEMI = H5F_CLOSE_SEMI(); public static final int H5F_CLOSE_STRONG = H5F_CLOSE_STRONG(); @@ -984,6 +986,10 @@ public class HDF5Constants { private static native final int H5F_ACC_DEFAULT(); + private static native final int H5F_ACC_SWMR_READ(); + + private static native final int H5F_ACC_SWMR_WRITE(); + private static native final int H5F_CLOSE_DEFAULT(); private static native final int H5F_CLOSE_SEMI(); diff --git a/java/src/jni/h5Constants.c b/java/src/jni/h5Constants.c index ffde1308dd..976a22421d 100644 --- a/java/src/jni/h5Constants.c +++ b/java/src/jni/h5Constants.c @@ -363,6 +363,10 @@ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1TRUNC(JNIEnv *env, jclass cls) { return H5F_ACC_TRUNC; } JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1DEFAULT(JNIEnv *env, jclass cls) { return H5F_ACC_DEFAULT; } +JNIEXPORT jint JNICALL +Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1SWMR_1READ(JNIEnv *env, jclass cls) { return H5F_ACC_SWMR_READ; } +JNIEXPORT jint JNICALL +Java_hdf_hdf5lib_HDF5Constants_H5F_1ACC_1SWMR_1WRITE(JNIEnv *env, jclass cls) { return H5F_ACC_SWMR_WRITE; } #pragma GCC diagnostic pop JNIEXPORT jint JNICALL diff --git a/java/src/jni/h5fImp.c b/java/src/jni/h5fImp.c index d4b3a3cace..058ba26e77 100644 --- a/java/src/jni/h5fImp.c +++ b/java/src/jni/h5fImp.c @@ -536,6 +536,19 @@ Java_hdf_hdf5lib_H5_H5Fclear_1elink_1file_1cache h5libraryError(env); } /* end Java_hdf_hdf5lib_H5_H5Fclear_1elink_1file_1cache */ +/* + * Class: hdf_hdf5lib_H5 + * Method: H5Fstart_swmr_write + * Signature: (J)V + */ +JNIEXPORT void JNICALL +Java_hdf_hdf5lib_H5_H5Fstart_1swmr_1write + (JNIEnv *env, jclass cls, jlong file_id) +{ + if (H5Fstart_swmr_write((hid_t)file_id) < 0) + h5libraryError(env); +} /* end Java_hdf_hdf5lib_H5_H5Fstart_1swmr_1write */ + /* * Class: hdf_hdf5lib_H5 * Method: H5Fstart_mdc_logging diff --git a/java/src/jni/h5fImp.h b/java/src/jni/h5fImp.h index b88e49136f..7aff83511d 100644 --- a/java/src/jni/h5fImp.h +++ b/java/src/jni/h5fImp.h @@ -212,6 +212,15 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Fclear_1elink_1file_1cache (JNIEnv *, jclass, jlong); +/* + * Class: hdf_hdf5lib_H5 + * Method: H5Fstart_swmr_write + * Signature: (J)V + */ +JNIEXPORT void JNICALL +Java_hdf_hdf5lib_H5_H5Fstart_1swmr_1write + (JNIEnv *, jclass, jlong); + /* * Class: hdf_hdf5lib_H5 * Method: H5Fstart_mdc_logging diff --git a/java/test/CMakeLists.txt b/java/test/CMakeLists.txt index 8cb41f7279..b3a996b088 100644 --- a/java/test/CMakeLists.txt +++ b/java/test/CMakeLists.txt @@ -16,6 +16,7 @@ set (HDF5_JAVA_TEST_SOURCES TestH5Fparams.java TestH5Fbasic.java TestH5F.java + TestH5Fswmr.java TestH5Gbasic.java TestH5G.java TestH5Giterate.java diff --git a/java/test/JUnit-interface.txt b/java/test/JUnit-interface.txt index 05814cdcaa..7fd80f87d5 100644 --- a/java/test/JUnit-interface.txt +++ b/java/test/JUnit-interface.txt @@ -93,6 +93,8 @@ JUnit version 4.11 .testH5Fget_intent_rdonly .testH5Fget_create_plist .testH5Fget_obj_count +.testH5Fstart_swmr_write +.testH5Fswmr_read_attempts .testH5Gget_info_by_name_not_exists .testH5Gget_info_by_idx_not_exists .testH5Gget_info_by_name @@ -635,7 +637,7 @@ JUnit version 4.11 Time: XXXX -OK (633 tests) +OK (635 tests) HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs): #000: (file name) line (number) in H5Fopen(): can't set access and transfer property lists diff --git a/java/test/Makefile.am b/java/test/Makefile.am index 9f29f1c365..92ac12d376 100644 --- a/java/test/Makefile.am +++ b/java/test/Makefile.am @@ -43,6 +43,7 @@ noinst_JAVA = \ TestH5Fparams.java \ TestH5Fbasic.java \ TestH5F.java \ + TestH5Fswmr.java \ TestH5Gbasic.java \ TestH5G.java \ TestH5Giterate.java \ diff --git a/java/test/TestAll.java b/java/test/TestAll.java index e3abe21675..a4b44c35f4 100644 --- a/java/test/TestAll.java +++ b/java/test/TestAll.java @@ -23,7 +23,7 @@ import org.junit.runners.Suite; TestH5Eregister.class, TestH5Edefault.class, TestH5E.class, - TestH5Fparams.class, TestH5Fbasic.class, TestH5F.class, + TestH5Fparams.class, TestH5Fbasic.class, TestH5F.class, TestH5Fswmr.class, TestH5Gbasic.class, TestH5G.class, TestH5Giterate.class, TestH5Sbasic.class, TestH5S.class, TestH5Tparams.class, TestH5Tbasic.class, TestH5T.class, diff --git a/java/test/TestH5Fswmr.java b/java/test/TestH5Fswmr.java new file mode 100644 index 0000000000..b65ebf229c --- /dev/null +++ b/java/test/TestH5Fswmr.java @@ -0,0 +1,118 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +package test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.File; + +import hdf.hdf5lib.H5; +import hdf.hdf5lib.HDF5Constants; +import hdf.hdf5lib.exceptions.HDF5LibraryException; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TestName; + +public class TestH5Fswmr { + @Rule public TestName testname = new TestName(); + private static final String H5_FILE = "testswmr.h5"; + + long H5fid = -1; + long H5fapl = -1; + long H5fcpl = -1; + + private final void _deleteFile(String filename) { + File file = new File(filename); + + if (file.exists()) { + try {file.delete();} catch (SecurityException e) {} + } + } + + @Before + public void createH5file() + throws HDF5LibraryException, NullPointerException { + assertTrue("H5 open ids is 0",H5.getOpenIDCount()==0); + System.out.print(testname.getMethodName()); + + H5fapl = H5.H5Pcreate(HDF5Constants.H5P_FILE_ACCESS); + H5fcpl = H5.H5Pcreate(HDF5Constants.H5P_FILE_CREATE); + H5.H5Pset_libver_bounds(H5fapl, HDF5Constants.H5F_LIBVER_LATEST, HDF5Constants.H5F_LIBVER_LATEST); + + H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC, H5fcpl, H5fapl); + H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL); + } + + @After + public void deleteH5file() throws HDF5LibraryException { + if (H5fapl > 0) { + try {H5.H5Pclose(H5fapl);} catch (Exception ex) {} + H5fapl = -1; + } + if (H5fcpl > 0) { + try {H5.H5Pclose(H5fcpl);} catch (Exception ex) {} + H5fcpl = -1; + } + if (H5fid > 0) { + try {H5.H5Fclose(H5fid);} catch (Exception ex) {} + H5fid = -1; + } + _deleteFile(H5_FILE); + System.out.println(); + } + + @Test + public void testH5Fstart_swmr_write() { + try { + H5.H5Fstart_swmr_write(H5fid); + } + catch (Throwable err) { + fail("H5.H5Fstart_swmr_write: " + err); + } + } + + @Test + public void testH5Fswmr_read_attempts() { + long read_attempts = 0; + + try { + read_attempts = H5.H5Pget_metadata_read_attempts(H5fapl); + } + catch (Throwable err) { + fail("H5.testH5Fswmr_read_attempts: " + err); + } + assertTrue(read_attempts == 1); + + try { + H5.H5Pset_metadata_read_attempts(H5fapl, 20); + } + catch (Throwable err) { + fail("H5.testH5Fswmr_read_attempts: " + err); + } + try { + read_attempts = H5.H5Pget_metadata_read_attempts(H5fapl); + } + catch (Throwable err) { + fail("H5.testH5Fswmr_read_attempts: " + err); + } + assertTrue(read_attempts == 20); + } +}