diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2004-07-14 19:08:34 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2004-07-14 19:08:34 (GMT) |
commit | 769ee96c1fd7cdcc4de2f2b1f36e943ebf9fff8b (patch) | |
tree | d17a58cc98b8789145de837650aaba38dd7af262 /src/H5FO.c | |
parent | bc6ab7c0a6ff27d3d52707419385ccd0771ffa0c (diff) | |
download | hdf5-769ee96c1fd7cdcc4de2f2b1f36e943ebf9fff8b.zip hdf5-769ee96c1fd7cdcc4de2f2b1f36e943ebf9fff8b.tar.gz hdf5-769ee96c1fd7cdcc4de2f2b1f36e943ebf9fff8b.tar.bz2 |
[svn-r8874] Purpose:
Bug fix
Description:
Correct problems with "resurrecting" a dataset in a file. (This occurs
when a dataset which is open gets unlinked from the group hierarchy (making it
"dead" and marked for deletion in the file) and then is re-linked to the group
hierarchy). Note that the current solution applies only to datasets, further
work will fix this for groups and named datatypes also.
Also, fix the "debug" routines to be a little more helpful in certain
situations.
Additionally, fix a locking bug in the symbol table node splitting routine
which could be [one of] the cause[s] of the file corruption in flexible
parallel operation.
Platforms tested:
FreeBSD 4.10 (sleipnir) w/parallel
h5committested
Diffstat (limited to 'src/H5FO.c')
-rw-r--r-- | src/H5FO.c | 52 |
1 files changed, 48 insertions, 4 deletions
@@ -259,13 +259,11 @@ done: Mark an opened object for deletion from the file when it is closed. GLOBAL VARIABLES COMMENTS, BUGS, ASSUMPTIONS - There is currently no way to "undelete" an opened object that is marked - for deletion. EXAMPLES REVISION LOG --------------------------------------------------------------------------*/ herr_t -H5FO_mark(const H5F_t *f, haddr_t addr) +H5FO_mark(const H5F_t *f, haddr_t addr, hbool_t deleted) { H5TB_NODE *obj_node; /* TBBT node holding open object */ H5FO_open_obj_t *open_obj; /* Information about open object */ @@ -283,7 +281,7 @@ H5FO_mark(const H5F_t *f, haddr_t addr) if((obj_node=H5TB_dfind(f->shared->open_objs,&addr,NULL))!=NULL) { open_obj=H5TB_NODE_DATA(obj_node); assert(open_obj); - open_obj->deleted=1; + open_obj->deleted=deleted; } /* end if */ else ret_value=FAIL; @@ -294,6 +292,52 @@ H5FO_mark(const H5F_t *f, haddr_t addr) /*-------------------------------------------------------------------------- NAME + H5FO_marked + PURPOSE + Check if an object is marked to be deleted when it is closed + USAGE + htri_t H5FO_mark(f,addr) + const H5F_t *f; IN: File opened object is in + haddr_t addr; IN: Address of object to delete + + RETURNS + Returns a TRUE/FALSE on success, negative on failure + DESCRIPTION + Checks if the object is currently in the "opened objects" tree and + whether its marks for deletion from the file when it is closed. + GLOBAL VARIABLES + COMMENTS, BUGS, ASSUMPTIONS + EXAMPLES + REVISION LOG +--------------------------------------------------------------------------*/ +htri_t +H5FO_marked(const H5F_t *f, haddr_t addr) +{ + H5TB_NODE *obj_node; /* TBBT node holding open object */ + H5FO_open_obj_t *open_obj; /* Information about open object */ + htri_t ret_value=FAIL; /* Return value */ + + FUNC_ENTER_NOAPI_NOFUNC(H5FO_marked) + + /* Sanity check */ + assert(f); + assert(f->shared); + assert(f->shared->open_objs); + assert(H5F_addr_defined(addr)); + + /* Get the object node from the TBBT */ + if((obj_node=H5TB_dfind(f->shared->open_objs,&addr,NULL))!=NULL) { + open_obj=H5TB_NODE_DATA(obj_node); + assert(open_obj); + ret_value=open_obj->deleted; + } /* end if */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FO_marked() */ + + +/*-------------------------------------------------------------------------- + NAME H5FO_dest PURPOSE Destroy an open object info set |