[svn-r7559] Purpose:

Add feature

Description:
    Add H5Fget_freespace() routine, to check the amount of free space in a
    file.  This information is only valid until the file is closed currently,
    however (until we start recording the free space information in the file
    itself).

Platforms tested:
    FreeBSD 4.9 (sleipnir)
    h5committest
This commit is contained in:
Quincey Koziol 2003-10-07 08:32:32 -05:00
parent 259247fc32
commit f766b32d07
11 changed files with 341 additions and 9 deletions

View File

@ -452,3 +452,26 @@ nh5fget_obj_ids_c ( hid_t_f *file_id , int_f *obj_type, int_f *max_objs, hid_t_f
if ( H5Fget_obj_ids(c_file_id, c_obj_type, c_max_objs, (hid_t *)obj_ids) < 0 ) ret_value = -1;
return ret_value;
}
/*----------------------------------------------------------------------------
* Name: h5fget_freespace_c
* Purpose: Call H5Fget_freespace to get amount of free space within a file
* Inputs: file_id - identifier of the file to query
* Returns: free_space - amount of free space in file
* 0 on success, -1 on failure
* Programmer: Quincey Koziol
* Tuesday, October 7, 2003
* Modifications:
*---------------------------------------------------------------------------*/
int_f
nh5fget_freespace_c ( hid_t_f *file_id , hssize_t_f *free_space)
{
int ret_value = 0;
hid_t c_file_id;
hssize_t c_free_space;
c_file_id = (hid_t)*file_id;
if ( (c_free_space=H5Fget_freespace(c_file_id)) < 0 ) ret_value = -1;
*free_space=(hssize_t_f)c_free_space;
return ret_value;
}

View File

@ -802,4 +802,56 @@
hdferr = h5fget_obj_ids_c(file_id, obj_type, max_objs, obj_ids)
END SUBROUTINE h5fget_obj_ids_f
!----------------------------------------------------------------------
! Name: h5fget_freespace_f
!
! Purpose: Get amount of free space within a file
!
! Inputs:
! file_id - file identifier
! Outputs:
! free_space - amount of free space in file
! hdferr: - error code
! Success: 0
! Failure: -1
! Optional parameters:
! NONE
!
! Programmer: Quincey Koziol
! October 7, 2003
!
! Modifications:
!
! Comment:
!----------------------------------------------------------------------
SUBROUTINE h5fget_freespace_f(file_id, free_space, hdferr)
!
!This definition is needed for Windows DLLs
!DEC$if defined(BUILD_HDF5_DLL)
!DEC$attributes dllexport :: h5fget_freespace_f
!DEC$endif
!
IMPLICIT NONE
INTEGER(HID_T), INTENT(IN) :: file_id ! File identifier
INTEGER(HSSIZE_T), INTENT(OUT) :: free_space
!amount of free space in file
INTEGER, INTENT(OUT) :: hdferr ! Error code
INTERFACE
INTEGER FUNCTION h5fget_freespace_c(file_id, free_space)
USE H5GLOBAL
!DEC$ IF DEFINED(HDF5F90_WINDOWS)
!MS$ATTRIBUTES C,reference,alias:'_H5FGET_FREESPACE_C':: h5fget_freespace_c
!DEC$ ENDIF
INTEGER(HID_T), INTENT(IN) :: file_id
INTEGER(HSSIZE_T), INTENT(OUT) :: free_space
END FUNCTION h5fget_freespace_c
END INTERFACE
hdferr = h5fget_freespace_c(file_id, free_space)
END SUBROUTINE h5fget_freespace_f
END MODULE H5F

View File

@ -39,6 +39,7 @@ H5_DLL int HD5packFstring(char *src, char *dest, int len);
# define nh5fget_access_plist_c FNAME(H5FGET_ACCESS_PLIST_C)
# define nh5fget_obj_count_c FNAME(H5FGET_OBJ_COUNT_C)
# define nh5fget_obj_ids_c FNAME(H5FGET_OBJ_IDS_C)
# define nh5fget_freespace_c FNAME(H5FGET_FREESPACE_C)
#else /* !DF_CAPFNAMES */
# define nh5fcreate_c FNAME(h5fcreate_c)
# define nh5fflush_c FNAME(h5fflush_c)
@ -52,6 +53,7 @@ H5_DLL int HD5packFstring(char *src, char *dest, int len);
# define nh5fget_access_plist_c FNAME(h5fget_access_plist_c)
# define nh5fget_obj_count_c FNAME(h5fget_obj_count_c)
# define nh5fget_obj_ids_c FNAME(h5fget_obj_ids_c)
# define nh5fget_freespace_c FNAME(h5fget_freespace_c)
#endif /* DF_CAPFNAMES */
#endif /* H5Ff90_FNAMES */
@ -78,6 +80,7 @@ H5_DLL int_f nh5fget_access_plist_c (hid_t_f *file_id, hid_t_f *access_id);
H5_DLL int_f nh5fget_obj_count_c (hid_t_f *file_id, int_f *obj_type, int_f *obj_count);
H5_DLL int_f nh5fget_obj_ids_c (hid_t_f *file_id, int_f *obj_type, int_f *max_objs, int_f *obj_ids);
H5_DLL int_f nh5fget_freespace_c (hid_t_f *file_id, hssize_t_f *free_space);
H5_DLL int_f nh5fflush_c (hid_t_f *obj_id, int_f *scope);
/*
@ -677,11 +680,11 @@ H5_DLL int_f nh5tset_cset_c ( hid_t_f *type_id, int_f * cset);
H5_DLL int_f nh5tget_strpad_c ( hid_t_f *type_id, int_f * strpad);
H5_DLL int_f nh5tset_strpad_c ( hid_t_f *type_id, int_f * strpad);
H5_DLL int_f nh5tget_nmembers_c ( hid_t_f *type_id , int_f * num_members);
H5_DLL int_f nh5tget_member_name_c ( hid_t_f *type_id ,int_f* index, _fcd member_name, int_f *namelen);
H5_DLL int_f nh5tget_member_name_c ( hid_t_f *type_id ,int_f* idx, _fcd member_name, int_f *namelen);
H5_DLL int_f nh5tget_member_dims_c ( hid_t_f *type_id ,int_f* field_idx, int_f * dims, size_t_f * field_dims, int_f * perm );
H5_DLL int_f nh5tget_member_offset_c ( hid_t_f *type_id ,int_f* member_no, size_t_f* offset);
H5_DLL int_f nh5tget_member_type_c ( hid_t_f *type_id ,int_f* field_idx, hid_t_f * datatype);
H5_DLL int_f nh5tget_member_index_c ( hid_t_f *type_id ,_fcd name, int_f* namelen, int_f *index);
H5_DLL int_f nh5tget_member_index_c ( hid_t_f *type_id ,_fcd name, int_f* namelen, int_f *idx);
H5_DLL int_f nh5tinsert_c(hid_t_f *type_id, _fcd name, int_f* namelen, size_t_f *offset, hid_t_f * field_id);
H5_DLL int_f nh5tpack_c(hid_t_f * type_id);
@ -810,7 +813,6 @@ H5_DLL int_f nh5tis_variable_str_c ( hid_t_f *type_id , int_f *flag );
# define nh5pget_size_c FNAME(H5PGET_SIZE_C)
# define nh5pget_nprops_c FNAME(H5PGET_NPROPS_C)
# define nh5pget_class_parent_c FNAME(H5PGET_CLASS_PARENT_C)
# define nh5pequal_c FNAME(H5PEQUAL_C)
# define nh5pisa_class_c FNAME(H5PISA_CLASS_C)
# define nh5pcopy_prop_c FNAME(H5PCOPY_PROP_C)
# define nh5premove_c FNAME(H5PREMOVE_C)
@ -917,7 +919,6 @@ H5_DLL int_f nh5tis_variable_str_c ( hid_t_f *type_id , int_f *flag );
# define nh5pget_size_c FNAME(h5pget_size_c)
# define nh5pget_nprops_c FNAME(h5pget_nprops_c)
# define nh5pget_class_parent_c FNAME(h5pget_class_parent_c)
# define nh5pequal_c FNAME(h5pequal_c)
# define nh5pisa_class_c FNAME(h5pisa_class_c)
# define nh5pcopy_prop_c FNAME(h5pcopy_prop_c)
# define nh5premove_c FNAME(h5premove_c)
@ -1071,7 +1072,6 @@ H5_DLL int_f nh5pset_alloc_time_c(hid_t_f *plist, int_f *flag);
H5_DLL int_f nh5pget_alloc_time_c(hid_t_f *plist, int_f *flag);
H5_DLL int_f nh5pset_fill_time_c(hid_t_f *plist, int_f *flag);
H5_DLL int_f nh5pget_fill_time_c(hid_t_f *plist, int_f *flag);
H5_DLL int_f nh5pget_buffer_c(hid_t_f *plist, hsize_t_f *size);
H5_DLL int_f nh5pset_meta_block_size_c(hid_t_f *plist, hsize_t_f *size);
H5_DLL int_f nh5pget_meta_block_size_c(hid_t_f *plist, hsize_t_f *size);
@ -1111,7 +1111,6 @@ H5_DLL int_f nh5pexist_c(hid_t_f *prp_id, _fcd name, int_f *name_len);
H5_DLL int_f nh5pget_size_c(hid_t_f *prp_id, _fcd name, int_f *name_len, size_t_f *size);
H5_DLL int_f nh5pget_nprops_c(hid_t_f *prp_id, size_t_f *nprops);
H5_DLL int_f nh5pget_class_parent_c(hid_t_f *prp_id, hid_t_f *parent_id);
H5_DLL int_f nh5pequal_c(hid_t_f *plist1_id, hid_t_f *plist2_id, int_f *c_flag);
H5_DLL int_f nh5pisa_class_c(hid_t_f *plist, hid_t_f *pclass);
H5_DLL int_f nh5pcopy_prop_c(hid_t_f *dst_id, hid_t_f *src_id, _fcd name, int_f *name_len);
H5_DLL int_f nh5premove_c(hid_t_f *plid, _fcd name, int_f *name_len);
@ -1208,9 +1207,9 @@ H5_DLL int_f nh5iget_name_c(hid_t_f *obj_id, _fcd buf, size_t_f *buf_size, size_
#endif
#endif
H5_DLL int_f nh5eclear_c();
H5_DLL int_f nh5eclear_c(void);
H5_DLL int_f nh5eprint_c1(_fcd name, int_f* namelen);
H5_DLL int_f nh5eprint_c2();
H5_DLL int_f nh5eprint_c2(void);
H5_DLL int_f nh5eget_major_c(int_f* error_no, _fcd name);
H5_DLL int_f nh5eget_minor_c(int_f* error_no, _fcd name);
H5_DLL int_f nh5eset_auto_c(int_f* printflag);

View File

@ -26,6 +26,7 @@
INTEGER :: mounting_total_error = 0
INTEGER :: reopen_total_error = 0
INTEGER :: fclose_total_error = 0
INTEGER :: fspace_total_error = 0
INTEGER :: dataset_total_error = 0
INTEGER :: extend_dataset_total_error = 0
INTEGER :: refobj_total_error = 0
@ -104,6 +105,14 @@
write(*, fmt = e_format) error_string
total_error = total_error + fclose_total_error
error_string = failure
CALL file_space(cleanup, fspace_total_error)
IF (fspace_total_error == 0) error_string = success
write(*, fmt = '(21a)', advance = 'no') ' File free space test'
write(*, fmt = '(49x,a)', advance = 'no') ' '
write(*, fmt = e_format) error_string
total_error = total_error + fspace_total_error
! write(*,*)
! write(*,*) '========================================='

View File

@ -669,5 +669,79 @@
END SUBROUTINE file_close
!
! The following subroutine tests h5fget_freespace_f
!
SUBROUTINE file_space(cleanup, total_error)
USE HDF5 ! This module contains all necessary modules
IMPLICIT NONE
LOGICAL, INTENT(IN) :: cleanup
INTEGER, INTENT(OUT) :: total_error
INTEGER :: error
!
CHARACTER(LEN=10), PARAMETER :: filename = "file_space"
CHARACTER(LEN=3), PARAMETER :: grpname = "grp"
CHARACTER(LEN=80) :: fix_filename
INTEGER(HID_T) :: fid ! File identifiers
INTEGER(HSSIZE_T) :: free_space
INTEGER(HID_T) :: group_id ! Group identifier
CALL h5eset_auto_f(0, error)
CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
if (error .ne. 0) then
write(*,*) "Cannot modify filename"
stop
endif
CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, fid, error)
CALL check("h5fcreate_f",error,total_error)
CALL h5fget_freespace_f(fid, free_space, error)
CALL check("h5fget_freespace_f",error,total_error)
if(error .eq.0 .and. free_space .ne. 0) then
total_error = total_error + 1
write(*,*) "Wrong amount of free space reported, ", free_space
endif
! Create group in the file.
CALL h5gcreate_f(fid, grpname, group_id, error)
CALL check("h5gcreate_f",error,total_error)
! Close group
CALL h5gclose_f(group_id, error)
CALL check("h5gclose_f", error, total_error)
! Check the free space now
CALL h5fget_freespace_f(fid, free_space, error)
CALL check("h5fget_freespace_f",error,total_error)
if(error .eq.0 .and. free_space .ne. 0) then
total_error = total_error + 1
write(*,*) "Wrong amount of free space reported, ", free_space
endif
!Unlink the group
CALL h5gunlink_f(fid, grpname, error)
CALL check("h5gunlink_f", error, total_error)
! Check the free space now
CALL h5fget_freespace_f(fid, free_space, error)
CALL check("h5fget_freespace_f",error,total_error)
if(error .eq.0 .and. free_space .ne. 976) then
total_error = total_error + 1
write(*,*) "Wrong amount of free space reported, ", free_space
endif
CALL h5fclose_f(fid, error)
CALL check("h5fclose_f",error,total_error)
if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
CALL check("h5_cleanup_f", error, total_error)
RETURN
END SUBROUTINE file_space

View File

@ -41,7 +41,9 @@ New Features
Library:
--------
- Added backward compatbility with v1.6 for new Error API. SLU -
- Added new H5Fget_freespace() routine to query the free space in a
given file. QAK 2003/10/06
- Added backward compatability with v1.6 for new Error API. SLU -
2003/09/24
- Changed 'objno' field in H5G_stat_t structure from 'unsigned long[2]'
to 'haddr_t'. QAK - 2003/08/08

View File

@ -4498,3 +4498,42 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
} /* H5F_sieve_overlap_clear() */
/*-------------------------------------------------------------------------
* Function: H5Fget_freespace
*
* Purpose: Retrieves the amount of free space (of a given type) in the
* file. If TYPE is 'H5FD_MEM_DEFAULT', then the amount of free
* space for all types is returned.
*
* Return: Success: Amount of free space for type
* Failure: Negative
*
* Programmer: Quincey Koziol
* koziol@ncsa.uiuc.edu
* Oct 6, 2003
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
hssize_t
H5Fget_freespace(hid_t file_id)
{
H5F_t *file=NULL; /* File object for file ID */
hssize_t ret_value; /* Return value */
FUNC_ENTER_API(H5Fget_freespace, FAIL)
/* Check args */
if(NULL==(file=H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
/* Go get the actual amount of free space in the file */
if((ret_value = H5FD_get_freespace(file->shared->lf))<0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to check free space for file")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Fget_freespace() */

View File

@ -3372,3 +3372,50 @@ herr_t H5FD_get_vfd_handle(H5FD_t *file, hid_t fapl, void** file_handle)
done:
FUNC_LEAVE_NOAPI(ret_value)
}
/*-------------------------------------------------------------------------
* Function: H5FD_get_freespace
*
* Purpose: Retrieve the amount of free space in a file.
*
* Return: Success: Amount of free space in file
* Failure: Negative
*
* Programmer: Quincey Koziol
* Monday, October 6, 2003
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
hssize_t
H5FD_get_freespace(H5FD_t *file)
{
H5FD_free_t *free_node; /* Pointer to node on free list */
H5FD_mem_t type; /* Type of memory */
hssize_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(H5FD_get_freespace, FAIL)
/* check args */
assert(file);
assert(file->cls);
/* Initialize return value */
ret_value=0;
/* Iterate over all the types of memory, to retrieve amount of free space for each */
for (type=H5FD_MEM_DEFAULT; type<H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,type)) {
/* Iterate through the free list, accumulating the amount of free space for this type */
free_node = file->fl[type];
while(free_node) {
ret_value+=free_node->size;
free_node=free_node->next;
} /* end while */
} /* end for */
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5FD_get_freespace() */

View File

@ -69,5 +69,6 @@ H5_DLL herr_t H5FD_write(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t a
H5_DLL herr_t H5FD_flush(H5FD_t *file, hid_t dxpl_id, unsigned closing);
H5_DLL herr_t H5FD_get_fileno(const H5FD_t *file, unsigned long *filenum);
H5_DLL herr_t H5FD_get_vfd_handle(H5FD_t *file, hid_t fapl, void** file_handle);
H5_DLL hssize_t H5FD_get_freespace(H5FD_t *file);
#endif /* !_H5FDprivate_H */

View File

@ -112,6 +112,7 @@ H5_DLL int H5Fget_obj_ids(hid_t file_id, unsigned types, int max_objs, hid_t *ob
H5_DLL herr_t H5Fget_vfd_handle(hid_t file_id, hid_t fapl, void** file_handle);
H5_DLL herr_t H5Fmount(hid_t loc, const char *name, hid_t child, hid_t plist);
H5_DLL herr_t H5Funmount(hid_t loc, const char *name);
H5_DLL hssize_t H5Fget_freespace(hid_t file_id);
#ifdef __cplusplus
}

View File

@ -970,6 +970,90 @@ test_file_perm(void)
} /* end test_file_perm() */
/****************************************************************
**
** test_file_freespace(): low-level file test routine.
** This test checks the free space available in a file in various
** situations.
**
*****************************************************************/
static void
test_file_freespace(void)
{
hid_t file; /* File opened with read-write permission */
hssize_t free_space; /* Amount of free space in file */
hid_t dspace; /* Dataspace ID */
hid_t dset; /* Dataset ID */
hid_t dcpl; /* Dataset creation property list */
unsigned u; /* Local index variable */
char name[32]; /* Dataset name */
herr_t ret;
/* Output message about test being performed */
MESSAGE(5, ("Testing Low-Level File Free Space\n"));
/* Create the file (with read-write permission) */
file = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
CHECK(file, FAIL, "H5Fcreate");
/* Check that the free space is 0 */
free_space = H5Fget_freespace(file);
CHECK(free_space, FAIL, "H5Fget_freespace");
VERIFY(free_space, 0, "H5Fget_freespace");
/* Create dataspace for datasets */
dspace = H5Screate(H5S_SCALAR);
CHECK(dspace, FAIL, "H5Screate");
/* Create a dataset creation property list */
dcpl = H5Pcreate(H5P_DATASET_CREATE);
CHECK(dcpl, FAIL, "H5Pcreate");
/* Set the space allocation time to early */
ret = H5Pset_alloc_time(dcpl,H5D_ALLOC_TIME_EARLY);
CHECK(ret, FAIL, "H5Pset_alloc_time");
/* Create datasets in file */
for(u=0; u<10; u++) {
sprintf(name,"Dataset %u",u);
dset = H5Dcreate(file, name, H5T_NATIVE_INT, dspace, dcpl);
CHECK(dset, FAIL, "H5Dcreate");
ret = H5Dclose(dset);
CHECK(ret, FAIL, "H5Dclose");
} /* end for */
/* Close dataspace */
ret = H5Sclose(dspace);
CHECK(ret, FAIL, "H5Sclose");
/* Close dataset creation property list */
ret=H5Pclose(dcpl);
CHECK(ret, FAIL, "H5Pclose");
/* Check that there is the right amount of free space in the file */
free_space = H5Fget_freespace(file);
CHECK(free_space, FAIL, "H5Fget_freespace");
VERIFY(free_space, 168, "H5Fget_freespace");
/* Delete datasets in file */
for(u=0; u<10; u++) {
sprintf(name,"Dataset %u",u);
ret = H5Gunlink(file, name);
CHECK(ret, FAIL, "H5Gunlink");
} /* end for */
/* Check that there is the right amount of free space in the file */
free_space = H5Fget_freespace(file);
CHECK(free_space, FAIL, "H5Fget_freespace");
VERIFY(free_space, 3584, "H5Fget_freespace");
/* Close file */
ret = H5Fclose(file);
CHECK(ret, FAIL, "H5Fclose");
} /* end test_file_freespace() */
/****************************************************************
**
** test_file(): Main low-level file I/O test routine.
@ -987,6 +1071,7 @@ test_file(void)
test_file_close(); /* Test file close behavior */
#endif /* H5_NO_SHARED_WRITING */
test_file_perm(); /* Test file access permissions */
test_file_freespace(); /* Test file free space information */
} /* test_file() */