[svn-r11295] Purpose:

Bug fix

Description:
    Fix "strong" file closing to handle a dangling dataset which uses a
dangling named datatype.

Platforms tested:
    FreeBSD 4.11 (sleipnir)
    Too minor too require h5committest
This commit is contained in:
Quincey Koziol 2005-08-25 12:16:02 -05:00
parent 4a6e1b6ba9
commit ab6656c52c
2 changed files with 110 additions and 7 deletions

View File

@ -2677,8 +2677,21 @@ H5F_try_close(H5F_t *f)
hid_t objs[128]; /* Array of objects to close */
unsigned u; /* Local index variable */
/* Get the list of IDs of open dataset, group, named datatype & attribute objects */
while((obj_count = H5F_get_obj_ids(f, H5F_OBJ_LOCAL|H5F_OBJ_DATASET|H5F_OBJ_GROUP|H5F_OBJ_DATATYPE|H5F_OBJ_ATTR, (int)(sizeof(objs)/sizeof(objs[0])), objs)) != 0) {
/* Get the list of IDs of open dataset, group, & attribute objects */
while((obj_count = H5F_get_obj_ids(f, H5F_OBJ_LOCAL|H5F_OBJ_DATASET|H5F_OBJ_GROUP|H5F_OBJ_ATTR, (int)(sizeof(objs)/sizeof(objs[0])), objs)) != 0) {
/* Try to close all the open objects in this file */
for(u = 0; u < obj_count; u++)
if(H5I_dec_ref(objs[u]) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CLOSEERROR, FAIL, "can't close object")
} /* end while */
/* Get the list of IDs of open named datatype objects */
/* (Do this separately from the dataset & attribute IDs, because
* they could be using one of the named datatypes and then the
* open named datatype ID will get closed twice.
*/
while((obj_count = H5F_get_obj_ids(f, H5F_OBJ_LOCAL|H5F_OBJ_DATATYPE, (int)(sizeof(objs)/sizeof(objs[0])), objs)) != 0) {
/* Try to close all the open objects in this file */
for(u = 0; u < obj_count; u++)

View File

@ -225,7 +225,7 @@ error:
/*-------------------------------------------------------------------------
* Function: test_dangle_datatype
* Function: test_dangle_datatype1
*
* Purpose: Check for dangling datatype IDs causing problems on library
* shutdown
@ -241,7 +241,7 @@ error:
*-------------------------------------------------------------------------
*/
static int
test_dangle_datatype(H5F_close_degree_t degree)
test_dangle_datatype1(H5F_close_degree_t degree)
{
char filename[1024];
hid_t fid; /* File ID */
@ -320,6 +320,93 @@ error:
return 1;
}
/*-------------------------------------------------------------------------
* Function: test_dangle_datatype2
*
* Purpose: Check for dangling datatype IDs causing problems on library
* shutdown
*
* Return: Success: zero
* Failure: non-zero
*
* Programmer: Quincey Koziol
* Thursday, August 25, 2005
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static int
test_dangle_datatype2(H5F_close_degree_t degree)
{
char filename[1024];
hid_t fid; /* File ID */
hid_t fapl; /* File access property list */
hid_t did; /* Dataset ID */
hid_t sid; /* Dataspace ID */
hid_t tid; /* Datatype ID */
TESTING(" dangling named datatype ID used by dataset");
if(H5open()<0)
TEST_ERROR;
/* Create file access property list */
if((fapl=H5Pcreate(H5P_FILE_ACCESS))<0)
TEST_ERROR;
/* Set file close degree */
if(H5Pset_fclose_degree(fapl,degree)<0)
TEST_ERROR;
h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof filename);
if((fid = H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0)
TEST_ERROR;
if((tid = H5Tcopy (H5T_NATIVE_INT))<0)
TEST_ERROR;
if(H5Tcommit(fid,TYPENAME,tid)<0)
TEST_ERROR;
/* Create a dataset that uses the named datatype & leave it open */
if((sid = H5Screate(H5S_SCALAR)) < 0)
TEST_ERROR;
if((did = H5Dcreate(fid, DSETNAME, tid, sid, H5P_DEFAULT)) < 0)
TEST_ERROR;
if(H5Sclose(sid)<0)
TEST_ERROR;
if(degree==H5F_CLOSE_SEMI) {
H5E_BEGIN_TRY {
if(H5Fclose(fid)>=0)
TEST_ERROR;
} H5E_END_TRY;
} /* end if */
else
if(H5Fclose(fid)<0)
TEST_ERROR;
if(H5Pclose(fapl)<0)
TEST_ERROR;
if(H5close()<0)
TEST_ERROR;
if(h5_get_file_size(filename)==0)
TEST_ERROR;
/* Clean up temporary file */
HDremove(filename);
PASSED();
return 0;
error:
return 1;
}
/*-------------------------------------------------------------------------
* Function: test_dangle_attribute
@ -453,21 +540,24 @@ main(void)
puts("Testing dangling objects with weak file close:");
nerrors += test_dangle_dataset(H5F_CLOSE_WEAK);
nerrors += test_dangle_group(H5F_CLOSE_WEAK);
nerrors += test_dangle_datatype(H5F_CLOSE_WEAK);
nerrors += test_dangle_datatype1(H5F_CLOSE_WEAK);
nerrors += test_dangle_datatype2(H5F_CLOSE_WEAK);
nerrors += test_dangle_attribute(H5F_CLOSE_WEAK);
/* Run tests w/semi file close */
puts("Testing dangling objects with semi file close:");
nerrors += test_dangle_dataset(H5F_CLOSE_SEMI);
nerrors += test_dangle_group(H5F_CLOSE_SEMI);
nerrors += test_dangle_datatype(H5F_CLOSE_SEMI);
nerrors += test_dangle_datatype1(H5F_CLOSE_SEMI);
nerrors += test_dangle_datatype2(H5F_CLOSE_SEMI);
nerrors += test_dangle_attribute(H5F_CLOSE_SEMI);
/* Run tests w/strong file close */
puts("Testing dangling objects with strong file close:");
nerrors += test_dangle_dataset(H5F_CLOSE_STRONG);
nerrors += test_dangle_group(H5F_CLOSE_STRONG);
nerrors += test_dangle_datatype(H5F_CLOSE_STRONG);
nerrors += test_dangle_datatype1(H5F_CLOSE_STRONG);
nerrors += test_dangle_datatype2(H5F_CLOSE_STRONG);
nerrors += test_dangle_attribute(H5F_CLOSE_STRONG);
/* Check for errors */