summaryrefslogtreecommitdiffstats
path: root/test/external.c
diff options
context:
space:
mode:
authorRaymond Lu <songyulu@hdfgroup.org>2007-11-05 22:13:43 (GMT)
committerRaymond Lu <songyulu@hdfgroup.org>2007-11-05 22:13:43 (GMT)
commitf877f94c13de1df96866aa420496f2c0a9fab60d (patch)
tree79b382ff5bab009122eb3c4f4711fa92283caabd /test/external.c
parentf0124823867f2ce6a807c396a71ef28156c53ed7 (diff)
downloadhdf5-f877f94c13de1df96866aa420496f2c0a9fab60d.zip
hdf5-f877f94c13de1df96866aa420496f2c0a9fab60d.tar.gz
hdf5-f877f94c13de1df96866aa420496f2c0a9fab60d.tar.bz2
[svn-r14238] Bug fix: It's reported by the CGNS people. When an external link was opened twice, the library
had some trouble to close in the end. The problem came from the field "holding_file" of H5O_loc_t. It's used to indicate special links like external links. The fix is to turn it off whenever H5O_open is called. Later the caller function should turn it on when it needs to. Tested on kagiso, linew, and smirom.
Diffstat (limited to 'test/external.c')
-rw-r--r--test/external.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/test/external.c b/test/external.c
index 44e586d..59e6be8 100644
--- a/test/external.c
+++ b/test/external.c
@@ -21,10 +21,13 @@
*/
#include "h5test.h"
+#define LINKED_FILE "extlink_file.h5"
+
const char *FILENAME[] = {
"extern_1",
"extern_2",
"extern_3",
+ "extern_4",
NULL
};
@@ -814,6 +817,95 @@ test_3 (hid_t fapl)
/*-------------------------------------------------------------------------
+ * Function: test_4
+ *
+ * Purpose: Tests opening an external link twice. It exposed a bug
+ * in the library. This function tests the fix.
+ *
+ * Return: Success: 0
+ *
+ * Failure: number of errors
+ *
+ * Programmer: Raymond Lu
+ * 5 November 2007
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_4 (hid_t fapl)
+{
+ hid_t fid, gid, xid, xid2;
+ char filename[1024]; /*file name */
+ char pathname[1024];
+ char linked_pathname[1024];
+ char *srcdir = getenv("srcdir"); /*where the src code is located*/
+
+ TESTING("opening external link twice");
+
+ h5_fixname(FILENAME[3], fapl, filename, sizeof filename);
+
+ if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+ goto error;
+
+ if((gid = H5Gopen(fid, "/", H5P_DEFAULT)) < 0)
+ goto error;
+
+ pathname[0] = '\0';
+ /* Generate correct name for test file by prepending the source path */
+ if(srcdir && ((HDstrlen(srcdir) + HDstrlen(LINKED_FILE) + 1) < sizeof(pathname))) {
+ HDstrcpy(pathname, srcdir);
+ HDstrcat(pathname, "/");
+ }
+ HDstrcat(pathname, LINKED_FILE);
+
+ /* Create an external link to an existing file*/
+ if(H5Lcreate_external(pathname, "/group", gid, " link", H5P_DEFAULT, H5P_DEFAULT) < 0)
+ goto error;
+
+ if(H5Gclose(gid) < 0)
+ goto error;
+
+ if(H5Fclose(fid) < 0)
+ goto error;
+
+ /* Reopen the file */
+ if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+ goto error;
+
+ /* Open the external link */
+ if((xid = H5Gopen(fid, "/ link", H5P_DEFAULT)) < 0)
+ goto error;
+
+ /* Open the external link twice */
+ if((xid2 = H5Gopen(xid, ".", H5P_DEFAULT)) < 0)
+ goto error;
+
+ if(H5Gclose(xid2) < 0)
+ goto error;
+
+ if(H5Gclose(xid) < 0)
+ goto error;
+
+ if(H5Fclose(fid) < 0)
+ goto error;
+
+ PASSED();
+ return 0;
+
+ error:
+ H5E_BEGIN_TRY {
+ H5Gclose(gid);
+ H5Gclose(xid);
+ H5Gclose(xid2);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+ return 1;
+}
+
+
+/*-------------------------------------------------------------------------
* Function: main
*
* Purpose: Runs external dataset tests.
@@ -861,6 +953,7 @@ main (void)
nerrors += test_1h();
nerrors += test_2(fapl);
nerrors += test_3(fapl);
+ nerrors += test_4(fapl);
if (nerrors>0) goto error;
if (H5Fclose(file) < 0) goto error;