summaryrefslogtreecommitdiffstats
path: root/test/trefer_shutdown.c
diff options
context:
space:
mode:
authorJerome Soumagne <jsoumagne@hdfgroup.org>2020-01-15 23:16:25 (GMT)
committerJerome Soumagne <jsoumagne@hdfgroup.org>2020-01-15 23:23:33 (GMT)
commita7648879d729c1b75bd32f3a151831e9cbfbe31c (patch)
tree55858f4147269ece35f5c7ec508412d194d9a188 /test/trefer_shutdown.c
parent9c398c804be54b3999794459df0a6648b3f0e9b1 (diff)
downloadhdf5-a7648879d729c1b75bd32f3a151831e9cbfbe31c.zip
hdf5-a7648879d729c1b75bd32f3a151831e9cbfbe31c.tar.gz
hdf5-a7648879d729c1b75bd32f3a151831e9cbfbe31c.tar.bz2
Add test for reference shutdown issue
Diffstat (limited to 'test/trefer_shutdown.c')
-rw-r--r--test/trefer_shutdown.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/test/trefer_shutdown.c b/test/trefer_shutdown.c
new file mode 100644
index 0000000..89a44b3
--- /dev/null
+++ b/test/trefer_shutdown.c
@@ -0,0 +1,83 @@
+#include "h5test.h"
+
+int
+main(int argc, char **argv)
+{
+ H5R_ref_t write_ref, read_ref;
+ hid_t fid;
+ hid_t did;
+ hid_t sid;
+ int i;
+
+ if ((fid = H5Fcreate("HDFFV-10992.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
+ HDfprintf(stderr, "H5Fcreate failed\n");
+ return 1;
+ }
+
+ if ((sid = H5Screate(H5S_SCALAR)) < 0) {
+ HDfprintf(stderr, "H5Screate failed\n");
+ return 1;
+ }
+
+ /* Create a dataset of object references */
+ if ((did = H5Dcreate2(fid, "dset", H5T_STD_REF, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
+ HDfprintf(stderr, "H5Dcreate failed\n");
+ return 1;
+ }
+
+ for (i = 0; i < 100; i++) {
+ /* Create reference to the root group */
+ if (H5Rcreate_object(fid, "/dset", H5P_DEFAULT, &write_ref) < 0) {
+ HDfprintf(stderr, "H5Rcreate_object failed\n");
+ return 1;
+ }
+ }
+
+ /* Write reference to dataset */
+ if (H5Dwrite(did, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, &write_ref) < 0) {
+ HDfprintf(stderr, "H5Dwrite failed\n");
+ return 1;
+ }
+
+ for (i = 0; i < 500; i++) {
+ /* Read reference back into different reference buffer */
+ if (H5Dread(did, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, &read_ref) < 0) {
+ HDfprintf(stderr, "H5Dread failed\n");
+ return 1;
+ }
+ }
+
+ /*
+ * "Forget" to call H5Rdestroy on reference objects. If H5Rdestroy
+ * is called at least once on either reference object, or both
+ * objects, the infinite loop goes away. If H5Rdestroy is never
+ * called, the infinite loop will appear.
+ */
+#if 0
+ if (H5Rdestroy(&write_ref) < 0) {
+ HDfprintf(stderr, "H5Rdestroy on reference write buffer failed\n");
+ return 1;
+ }
+ if (H5Rdestroy(&read_ref) < 0) {
+ HDfprintf(stderr, "H5Rdestroy on reference read buffer failed\n");
+ return 1;
+ }
+#endif
+
+ if (H5Sclose(sid) < 0) {
+ HDfprintf(stderr, "H5Sclose failed\n");
+ return 1;
+ }
+
+ if (H5Dclose(did) < 0) {
+ HDfprintf(stderr, "H5Dclose failed\n");
+ return 1;
+ }
+
+ if (H5Fclose(fid) < 0) {
+ HDfprintf(stderr, "H5Fclose failed\n");
+ return 1;
+ }
+
+ return 0;
+}