summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--release_docs/RELEASE.txt2
-rw-r--r--src/H5F.c8
-rw-r--r--src/H5FD.c63
-rw-r--r--src/H5FDcore.c14
-rw-r--r--src/H5FDdirect.c14
-rw-r--r--src/H5FDfamily.c18
-rw-r--r--src/H5FDlog.c14
-rw-r--r--src/H5FDmpio.c14
-rw-r--r--src/H5FDmpiposix.c14
-rw-r--r--src/H5FDmulti.c163
-rw-r--r--src/H5FDprivate.h4
-rw-r--r--src/H5FDpublic.h8
-rw-r--r--src/H5FDsec2.c14
-rw-r--r--src/H5FDstdio.c19
-rw-r--r--src/H5FDstream.c14
-rw-r--r--src/H5Fsuper.c12
-rw-r--r--src/H5MF.c7
-rw-r--r--test/istore.c2
-rw-r--r--test/vfd.c61
-rw-r--r--tools/h5dump/h5dump.c1
-rw-r--r--tools/h5dump/h5dumpgentest.c4
-rw-r--r--tools/testfiles/tmulti-l.h5bin2048 -> 2048 bytes
-rw-r--r--tools/testfiles/tmulti-o.h5bin2048 -> 2048 bytes
-rw-r--r--tools/testfiles/tmulti-r.h5bin600 -> 2048 bytes
-rw-r--r--tools/testfiles/tmulti-s.h5bin2048 -> 2048 bytes
-rw-r--r--tools/testfiles/tsplit_file-m.h5bin2048 -> 2048 bytes
-rw-r--r--tools/testfiles/tsplit_file-r.h5bin600 -> 2048 bytes
27 files changed, 345 insertions, 125 deletions
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt
index 5c8b8de..ba34fec 100644
--- a/release_docs/RELEASE.txt
+++ b/release_docs/RELEASE.txt
@@ -552,6 +552,8 @@ Bug Fixes since HDF5-1.6.0 release
Library
-------
+ - Fixed the MULTI driver problem (Bug #731) that corruptted the data.
+ SLU - 2007/1/12
- Fixed file corruption bug which could write an incorrect number of
messages to an object's header under certain circumstances.
Generally, the sequence of actions to generate this bug looks
diff --git a/src/H5F.c b/src/H5F.c
index cb809e0..a073e9a 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -766,7 +766,7 @@ H5F_locate_signature(H5FD_t *file, hid_t dxpl_id)
/* Find the least N such that 2^N is larger than the file size */
if (HADDR_UNDEF==(addr=H5FD_get_eof(file)) ||
- HADDR_UNDEF==(eoa=H5FD_get_eoa(file)))
+ HADDR_UNDEF==(eoa=H5FD_get_eoa(file, H5FD_MEM_SUPER)))
HGOTO_ERROR(H5E_IO, H5E_CANTINIT, HADDR_UNDEF, "unable to obtain EOF/EOA value")
for (maxpow=0; addr; maxpow++)
addr>>=1;
@@ -778,7 +778,7 @@ H5F_locate_signature(H5FD_t *file, hid_t dxpl_id)
*/
for (n=8; n<maxpow; n++) {
addr = (8==n) ? 0 : (haddr_t)1 << n;
- if (H5FD_set_eoa(file, addr+H5F_SIGNATURE_LEN) < 0)
+ if (H5FD_set_eoa(file, H5FD_MEM_SUPER, addr+H5F_SIGNATURE_LEN) < 0)
HGOTO_ERROR(H5E_IO, H5E_CANTINIT, HADDR_UNDEF, "unable to set EOA value for file signature")
if (H5FD_read(file, H5FD_MEM_SUPER, dxpl_id, addr, (size_t)H5F_SIGNATURE_LEN, buf) < 0)
HGOTO_ERROR(H5E_IO, H5E_CANTINIT, HADDR_UNDEF, "unable to read file signature")
@@ -791,7 +791,7 @@ H5F_locate_signature(H5FD_t *file, hid_t dxpl_id)
* failure.
*/
if (n>=maxpow) {
- (void)H5FD_set_eoa(file, eoa); /* Ignore return value */
+ (void)H5FD_set_eoa(file, H5FD_MEM_SUPER, eoa); /* Ignore return value */
HGOTO_ERROR(H5E_IO, H5E_CANTINIT, HADDR_UNDEF, "unable to find a valid file signature")
}
@@ -2718,7 +2718,7 @@ H5F_get_eoa(const H5F_t *f)
assert(f->shared);
/* Dispatch to driver */
- if (HADDR_UNDEF==(ret_value=H5FD_get_eoa(f->shared->lf)))
+ if (HADDR_UNDEF==(ret_value=H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)))
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, HADDR_UNDEF, "driver get_eoa request failed")
done:
diff --git a/src/H5FD.c b/src/H5FD.c
index 6264c3d..95dad3e 100644
--- a/src/H5FD.c
+++ b/src/H5FD.c
@@ -2117,7 +2117,7 @@ H5FD_update_eoa(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
assert(type >= H5FD_MEM_DEFAULT && type < H5FD_MEM_NTYPES);
assert(size > 0);
- eoa = file->cls->get_eoa(file);
+ eoa = file->cls->get_eoa(file, type);
#ifdef H5F_DEBUG
if(file->alignment * file->threshold != 1 && H5DEBUG(F))
@@ -2138,7 +2138,7 @@ H5FD_update_eoa(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
eoa += wasted;
- if(file->cls->set_eoa(file, eoa) < 0)
+ if(file->cls->set_eoa(file, type, eoa) < 0)
HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "file allocation request failed")
} /* end if */
@@ -2149,7 +2149,7 @@ H5FD_update_eoa(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
ret_value = eoa;
eoa += size;
- if(file->cls->set_eoa(file, eoa) < 0)
+ if(file->cls->set_eoa(file, type, eoa) < 0)
HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "file allocation request failed")
/* Free the wasted memory */
@@ -2440,9 +2440,9 @@ HDfprintf(stderr, "%s: type = %u, addr = %a, size = %Hu\n", FUNC, (unsigned)type
if(file->cls->get_eoa) {
haddr_t eoa;
- eoa = file->cls->get_eoa(file);
+ eoa = file->cls->get_eoa(file, type);
if(eoa == (last->addr+last->size)) {
- if(file->cls->set_eoa(file, last->addr) < 0)
+ if(file->cls->set_eoa(file, type, last->addr) < 0)
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "set end of space allocation request failed")
/* Remove this free block from the list */
@@ -2618,7 +2618,7 @@ H5FD_can_extend(const H5FD_t *file, H5FD_mem_t type, haddr_t addr, hsize_t size,
FUNC_ENTER_NOAPI(H5FD_can_extend, FAIL)
/* Retrieve the end of the address space */
- if(HADDR_UNDEF==(eoa=H5FD_get_eoa(file)))
+ if(HADDR_UNDEF==(eoa=H5FD_get_eoa(file, type)))
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver get_eoa request failed")
/* Check if the block is exactly at the end of the file */
@@ -2713,7 +2713,7 @@ HDfprintf(stderr, "%s: type = %u, addr = %a, size = %Hu, extra_requested = %Hu\n
#endif /* H5FD_ALLOC_DEBUG */
/* Retrieve the end of the address space */
- if(HADDR_UNDEF==(eoa=H5FD_get_eoa(file)))
+ if(HADDR_UNDEF==(eoa=H5FD_get_eoa(file, type)))
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver get_eoa request failed")
/* Map request type to free list */
@@ -2760,7 +2760,7 @@ HDfprintf(stderr, "%s: type = %u, addr = %a, size = %Hu, extra_requested = %Hu\n
/* Extend the file */
eoa += extra_requested;
- if(file->cls->set_eoa(file, eoa) < 0)
+ if(file->cls->set_eoa(file, type, eoa) < 0)
HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, FAIL, "file allocation request failed")
/* Update the metadata and/or small data block */
@@ -2835,11 +2835,14 @@ done:
* Friday, July 30, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
haddr_t
-H5FDget_eoa(H5FD_t *file)
+H5FDget_eoa(H5FD_t *file, H5FD_mem_t type)
{
haddr_t ret_value;
@@ -2849,9 +2852,11 @@ H5FDget_eoa(H5FD_t *file)
/* Check args */
if(!file || !file->cls)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, HADDR_UNDEF, "invalid file pointer")
+ if(type<H5FD_MEM_DEFAULT || type >= H5FD_MEM_NTYPES)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, HADDR_UNDEF, "invalid file type")
/* The real work */
- if(HADDR_UNDEF==(ret_value=H5FD_get_eoa(file)))
+ if(HADDR_UNDEF==(ret_value=H5FD_get_eoa(file, type)))
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, HADDR_UNDEF, "file get eoa request failed")
done:
@@ -2872,11 +2877,14 @@ done:
* Wednesday, August 4, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
haddr_t
-H5FD_get_eoa(const H5FD_t *file)
+H5FD_get_eoa(const H5FD_t *file, H5FD_mem_t type)
{
haddr_t ret_value;
@@ -2884,7 +2892,7 @@ H5FD_get_eoa(const H5FD_t *file)
assert(file && file->cls);
/* Dispatch to driver */
- if(HADDR_UNDEF==(ret_value=(file->cls->get_eoa)(file)))
+ if(HADDR_UNDEF==(ret_value=(file->cls->get_eoa)(file, type)))
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, HADDR_UNDEF, "driver get_eoa request failed")
done:
@@ -2916,11 +2924,14 @@ done:
* Friday, July 30, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
herr_t
-H5FDset_eoa(H5FD_t *file, haddr_t addr)
+H5FDset_eoa(H5FD_t *file, H5FD_mem_t type, haddr_t addr)
{
herr_t ret_value=SUCCEED; /* Return value */
@@ -2930,12 +2941,14 @@ H5FDset_eoa(H5FD_t *file, haddr_t addr)
/* Check args */
if(!file || !file->cls)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file pointer")
+ if(type<H5FD_MEM_DEFAULT || type >= H5FD_MEM_NTYPES)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, HADDR_UNDEF, "invalid file type")
if(!H5F_addr_defined(addr) || addr>file->maxaddr)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid end-of-address value")
/* The real work */
- if(H5FD_set_eoa(file, addr) < 0)
+ if(H5FD_set_eoa(file, type, addr) < 0)
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "file set eoa request failed")
done:
@@ -2956,11 +2969,14 @@ done:
* Wednesday, August 4, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
herr_t
-H5FD_set_eoa(H5FD_t *file, haddr_t addr)
+H5FD_set_eoa(H5FD_t *file, H5FD_mem_t UNUSED type, haddr_t addr)
{
herr_t ret_value=SUCCEED; /* Return value */
@@ -2970,7 +2986,7 @@ H5FD_set_eoa(H5FD_t *file, haddr_t addr)
assert(H5F_addr_defined(addr) && addr<=file->maxaddr);
/* Dispatch to driver */
- if((file->cls->set_eoa)(file, addr) < 0)
+ if((file->cls->set_eoa)(file, type, addr) < 0)
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver set_eoa request failed")
done:
@@ -3801,6 +3817,12 @@ done:
* Programmer: Quincey Koziol
* Monday, October 6, 2003
*
+ * Modifications:
+ * Raymond Lu
+ * 5 January 2007
+ * Due to the complexity EOA for Multi driver, this function
+ * is made failed for now.
+ *
*-------------------------------------------------------------------------
*/
hssize_t
@@ -3812,7 +3834,7 @@ H5FD_get_freespace(const H5FD_t *file)
hsize_t ma_size = 0; /* Size of "metadata aggregator" */
haddr_t sda_addr = HADDR_UNDEF; /* Base "small data aggregator" address */
hsize_t sda_size = 0; /* Size of "small data aggregator" */
- haddr_t eoa; /* End of allocated space in the file */
+ haddr_t eoa = 0; /* End of allocated space in the file */
hssize_t ret_value = 0; /* Return value */
FUNC_ENTER_NOAPI(H5FD_get_freespace, FAIL)
@@ -3821,8 +3843,13 @@ H5FD_get_freespace(const H5FD_t *file)
HDassert(file);
HDassert(file->cls);
+ /* Multi driver doesn't support this function because of the complexity.
+ * It doesn't have eoa for the whole file. */
+ if(file->driver_id == H5FD_MULTI)
+ HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "Multi driver doesn't support this function")
+
/* Retrieve the 'eoa' for the file */
- eoa = file->cls->get_eoa(file);
+ eoa = file->cls->get_eoa(file, H5FD_MEM_DEFAULT);
/* Check for aggregating metadata allocations */
if(file->feature_flags & H5FD_FEAT_AGGREGATE_METADATA) {
diff --git a/src/H5FDcore.c b/src/H5FDcore.c
index 72ed14d..4c0d906 100644
--- a/src/H5FDcore.c
+++ b/src/H5FDcore.c
@@ -90,8 +90,8 @@ static H5FD_t *H5FD_core_open(const char *name, unsigned flags, hid_t fapl_id,
haddr_t maxaddr);
static herr_t H5FD_core_close(H5FD_t *_file);
static int H5FD_core_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
-static haddr_t H5FD_core_get_eoa(const H5FD_t *_file);
-static herr_t H5FD_core_set_eoa(H5FD_t *_file, haddr_t addr);
+static haddr_t H5FD_core_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_core_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
static haddr_t H5FD_core_get_eof(const H5FD_t *_file);
static herr_t H5FD_core_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
static herr_t H5FD_core_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
@@ -570,11 +570,14 @@ done:
* Monday, August 2, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static haddr_t
-H5FD_core_get_eoa(const H5FD_t *_file)
+H5FD_core_get_eoa(const H5FD_t *_file, H5FD_mem_t type)
{
haddr_t ret_value; /* Return value */
@@ -605,11 +608,14 @@ done:
* Thursday, July 29, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5FD_core_set_eoa(H5FD_t *_file, haddr_t addr)
+H5FD_core_set_eoa(H5FD_t *_file, H5FD_mem_t UNUSED type, haddr_t addr)
{
H5FD_core_t *file = (H5FD_core_t*)_file;
herr_t ret_value=SUCCEED; /* Return value */
diff --git a/src/H5FDdirect.c b/src/H5FDdirect.c
index b981e13..6a68743 100644
--- a/src/H5FDdirect.c
+++ b/src/H5FDdirect.c
@@ -160,8 +160,8 @@ static H5FD_t *H5FD_direct_open(const char *name, unsigned flags, hid_t fapl_id,
static herr_t H5FD_direct_close(H5FD_t *_file);
static int H5FD_direct_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
static herr_t H5FD_direct_query(const H5FD_t *_f1, unsigned long *flags);
-static haddr_t H5FD_direct_get_eoa(const H5FD_t *_file);
-static herr_t H5FD_direct_set_eoa(H5FD_t *_file, haddr_t addr);
+static haddr_t H5FD_direct_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_direct_set_eoa(H5FD_t *_file, H5FD_mem_t UNUSED type, haddr_t addr);
static haddr_t H5FD_direct_get_eof(const H5FD_t *_file);
static herr_t H5FD_direct_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
static herr_t H5FD_direct_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
@@ -717,11 +717,14 @@ done:
* Wednesday, 20 September 2006
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static haddr_t
-H5FD_direct_get_eoa(const H5FD_t *_file)
+H5FD_direct_get_eoa(const H5FD_t *_file, H5FD_mem_t UNUSED type)
{
const H5FD_direct_t *file = (const H5FD_direct_t*)_file;
haddr_t ret_value; /* Return value */
@@ -751,11 +754,14 @@ done:
* Wednesday, 20 September 2006
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5FD_direct_set_eoa(H5FD_t *_file, haddr_t addr)
+H5FD_direct_set_eoa(H5FD_t *_file, H5FD_mem_t UNUSED type, haddr_t addr)
{
H5FD_direct_t *file = (H5FD_direct_t*)_file;
herr_t ret_value=SUCCEED; /* Return value */
diff --git a/src/H5FDfamily.c b/src/H5FDfamily.c
index 8b678b5..249edbb 100644
--- a/src/H5FDfamily.c
+++ b/src/H5FDfamily.c
@@ -97,8 +97,8 @@ static H5FD_t *H5FD_family_open(const char *name, unsigned flags,
static herr_t H5FD_family_close(H5FD_t *_file);
static int H5FD_family_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
static herr_t H5FD_family_query(const H5FD_t *_f1, unsigned long *flags);
-static haddr_t H5FD_family_get_eoa(const H5FD_t *_file);
-static herr_t H5FD_family_set_eoa(H5FD_t *_file, haddr_t eoa);
+static haddr_t H5FD_family_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_family_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa);
static haddr_t H5FD_family_get_eof(const H5FD_t *_file);
static herr_t H5FD_family_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
static herr_t H5FD_family_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
@@ -1012,11 +1012,14 @@ done:
* Wednesday, August 4, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static haddr_t
-H5FD_family_get_eoa(const H5FD_t *_file)
+H5FD_family_get_eoa(const H5FD_t *_file, H5FD_mem_t UNUSED type)
{
const H5FD_family_t *file = (const H5FD_family_t*)_file;
haddr_t ret_value; /* Return value */
@@ -1044,11 +1047,14 @@ done:
* Wednesday, August 4, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5FD_family_set_eoa(H5FD_t *_file, haddr_t eoa)
+H5FD_family_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa)
{
H5FD_family_t *file = (H5FD_family_t*)_file;
haddr_t addr=eoa;
@@ -1087,11 +1093,11 @@ H5FD_family_set_eoa(H5FD_t *_file, haddr_t eoa)
/* Set the EOA marker for the member */
H5_CHECK_OVERFLOW(file->memb_size,hsize_t,haddr_t);
if (addr>(haddr_t)file->memb_size) {
- if(H5FD_set_eoa(file->memb[u], (haddr_t)file->memb_size)<0)
+ if(H5FD_set_eoa(file->memb[u], type, (haddr_t)file->memb_size)<0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to set file eoa")
addr -= file->memb_size;
} else {
- if(H5FD_set_eoa(file->memb[u], addr)<0)
+ if(H5FD_set_eoa(file->memb[u], type, addr)<0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to set file eoa")
addr = 0;
}
diff --git a/src/H5FDlog.c b/src/H5FDlog.c
index 06212e8..ce48d16 100644
--- a/src/H5FDlog.c
+++ b/src/H5FDlog.c
@@ -181,8 +181,8 @@ static herr_t H5FD_log_close(H5FD_t *_file);
static int H5FD_log_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
static herr_t H5FD_log_query(const H5FD_t *_f1, unsigned long *flags);
static haddr_t H5FD_log_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
-static haddr_t H5FD_log_get_eoa(const H5FD_t *_file);
-static herr_t H5FD_log_set_eoa(H5FD_t *_file, haddr_t addr);
+static haddr_t H5FD_log_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_log_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
static haddr_t H5FD_log_get_eof(const H5FD_t *_file);
static herr_t H5FD_log_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
static herr_t H5FD_log_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
@@ -886,11 +886,14 @@ done:
* Monday, August 2, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static haddr_t
-H5FD_log_get_eoa(const H5FD_t *_file)
+H5FD_log_get_eoa(const H5FD_t *_file, H5FD_mem_t UNUSED type)
{
const H5FD_log_t *file = (const H5FD_log_t*)_file;
haddr_t ret_value; /* Return value */
@@ -920,11 +923,14 @@ done:
* Thursday, July 29, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5FD_log_set_eoa(H5FD_t *_file, haddr_t addr)
+H5FD_log_set_eoa(H5FD_t *_file, H5FD_mem_t UNUSED type, haddr_t addr)
{
H5FD_log_t *file = (H5FD_log_t*)_file;
herr_t ret_value=SUCCEED; /* Return value */
diff --git a/src/H5FDmpio.c b/src/H5FDmpio.c
index 8178b7a..b2bca34 100644
--- a/src/H5FDmpio.c
+++ b/src/H5FDmpio.c
@@ -72,8 +72,8 @@ static H5FD_t *H5FD_mpio_open(const char *name, unsigned flags, hid_t fapl_id,
haddr_t maxaddr);
static herr_t H5FD_mpio_close(H5FD_t *_file);
static herr_t H5FD_mpio_query(const H5FD_t *_f1, unsigned long *flags);
-static haddr_t H5FD_mpio_get_eoa(const H5FD_t *_file);
-static herr_t H5FD_mpio_set_eoa(H5FD_t *_file, haddr_t addr);
+static haddr_t H5FD_mpio_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_mpio_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
static haddr_t H5FD_mpio_get_eof(const H5FD_t *_file);
static herr_t H5FD_mpio_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
static herr_t H5FD_mpio_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
@@ -1175,11 +1175,14 @@ done:
* Friday, August 6, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static haddr_t
-H5FD_mpio_get_eoa(const H5FD_t *_file)
+H5FD_mpio_get_eoa(const H5FD_t *_file, H5FD_mem_t UNUSED type)
{
const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file;
haddr_t ret_value; /* Return value */
@@ -1212,11 +1215,14 @@ done:
* Friday, August 6, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5FD_mpio_set_eoa(H5FD_t *_file, haddr_t addr)
+H5FD_mpio_set_eoa(H5FD_t *_file, H5FD_mem_t UNUSED type, haddr_t addr)
{
H5FD_mpio_t *file = (H5FD_mpio_t*)_file;
herr_t ret_value=SUCCEED; /* Return value */
diff --git a/src/H5FDmpiposix.c b/src/H5FDmpiposix.c
index df76070..548bdc7 100644
--- a/src/H5FDmpiposix.c
+++ b/src/H5FDmpiposix.c
@@ -181,8 +181,8 @@ static H5FD_t *H5FD_mpiposix_open(const char *name, unsigned flags, hid_t fapl_i
static herr_t H5FD_mpiposix_close(H5FD_t *_file);
static int H5FD_mpiposix_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
static herr_t H5FD_mpiposix_query(const H5FD_t *_f1, unsigned long *flags);
-static haddr_t H5FD_mpiposix_get_eoa(const H5FD_t *_file);
-static herr_t H5FD_mpiposix_set_eoa(H5FD_t *_file, haddr_t addr);
+static haddr_t H5FD_mpiposix_get_eoa(const H5FD_t *_file, H5FD_mem_t UNUSED type);
+static herr_t H5FD_mpiposix_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
static haddr_t H5FD_mpiposix_get_eof(const H5FD_t *_file);
static herr_t H5FD_mpiposix_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
static herr_t H5FD_mpiposix_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
@@ -951,11 +951,14 @@ done:
* Thursday, July 11, 2002
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static haddr_t
-H5FD_mpiposix_get_eoa(const H5FD_t *_file)
+H5FD_mpiposix_get_eoa(const H5FD_t *_file, H5FD_mem_t UNUSED type)
{
const H5FD_mpiposix_t *file = (const H5FD_mpiposix_t*)_file;
haddr_t ret_value; /* Return value */
@@ -987,11 +990,14 @@ done:
* Thursday, July 11, 2002
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5FD_mpiposix_set_eoa(H5FD_t *_file, haddr_t addr)
+H5FD_mpiposix_set_eoa(H5FD_t *_file, H5FD_mem_t UNUSED type, haddr_t addr)
{
H5FD_mpiposix_t *file = (H5FD_mpiposix_t*)_file;
herr_t ret_value=SUCCEED; /* Return value */
diff --git a/src/H5FDmulti.c b/src/H5FDmulti.c
index b4c4277..6131db1 100644
--- a/src/H5FDmulti.c
+++ b/src/H5FDmulti.c
@@ -106,7 +106,9 @@ typedef struct H5FD_multi_t {
H5FD_multi_fapl_t fa; /*driver-specific file access properties*/
haddr_t memb_next[H5FD_MEM_NTYPES];/*addr of next member */
H5FD_t *memb[H5FD_MEM_NTYPES]; /*member pointers */
- haddr_t eoa; /*end of allocated addresses */
+ /*haddr_t eoa;*/ /*end of allocated addresses. Took it out
+ *because individual files have their own
+ *eoa. */
unsigned flags; /*file open flags saved for debugging */
char *name; /*name passed to H5Fopen or H5Fcreate */
} H5FD_multi_t;
@@ -137,8 +139,8 @@ static H5FD_t *H5FD_multi_open(const char *name, unsigned flags,
static herr_t H5FD_multi_close(H5FD_t *_file);
static int H5FD_multi_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
static herr_t H5FD_multi_query(const H5FD_t *_f1, unsigned long *flags);
-static haddr_t H5FD_multi_get_eoa(const H5FD_t *_file);
-static herr_t H5FD_multi_set_eoa(H5FD_t *_file, haddr_t eoa);
+static haddr_t H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_multi_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa);
static haddr_t H5FD_multi_get_eof(const H5FD_t *_file);
static herr_t H5FD_multi_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
static haddr_t H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
@@ -777,8 +779,10 @@ H5FD_multi_sb_encode(H5FD_t *_file, char *name/*out*/,
name[8] = '\0';
assert(7==H5FD_MEM_NTYPES);
- for (m=H5FD_MEM_SUPER; m<H5FD_MEM_NTYPES; m=(H5FD_mem_t)(m+1))
+
+ for (m=H5FD_MEM_SUPER; m<H5FD_MEM_NTYPES; m=(H5FD_mem_t)(m+1)) {
buf[m-1] = (unsigned char)file->fa.memb_map[m];
+ }
buf[6] = 0;
buf[7] = 0;
@@ -792,7 +796,7 @@ H5FD_multi_sb_encode(H5FD_t *_file, char *name/*out*/,
p = buf+8;
assert(sizeof(haddr_t)<=8);
UNIQUE_MEMBERS(file->fa.memb_map, mt) {
- memb_eoa = H5FDget_eoa(file->memb[mt]);
+ memb_eoa = H5FDget_eoa(file->memb[mt], mt);
memcpy(p, &(file->fa.memb_addr[mt]), sizeof(haddr_t));
p += sizeof(haddr_t);
memcpy(p, &memb_eoa, sizeof(haddr_t));
@@ -872,11 +876,13 @@ H5FD_multi_sb_decode(H5FD_t *_file, const char *name, const unsigned char *buf)
* Read the map and count the unique members.
*/
memset(map, 0, sizeof map);
+
for (i=0; i<6; i++) {
map[i+1] = (H5FD_mem_t)buf[i];
if (file->fa.memb_map[i+1]!=map[i+1])
map_changed=TRUE;
}
+
UNIQUE_MEMBERS(map, mt) {
nseen++;
} END_MEMBERS;
@@ -964,7 +970,7 @@ H5FD_multi_sb_decode(H5FD_t *_file, const char *name, const unsigned char *buf)
/* Set the EOA marker for all open files */
UNIQUE_MEMBERS(file->fa.memb_map, mt) {
if (file->memb[mt])
- if(H5FDset_eoa(file->memb[mt], memb_eoa[mt])<0)
+ if(H5FDset_eoa(file->memb[mt], mt, memb_eoa[mt])<0)
H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, "set_eoa() failed", -1)
} END_MEMBERS;
@@ -1435,18 +1441,81 @@ H5FD_multi_query(const H5FD_t *_f, unsigned long *flags /* out */)
* Wednesday, August 4, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
+ * If the TYPE is H5FD_MEM_DEFAULT, simply find the biggest
+ * EOA of individual file because the EOA for the whole file
+ * is meaningless.
*
*-------------------------------------------------------------------------
*/
static haddr_t
-H5FD_multi_get_eoa(const H5FD_t *_file)
+H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type)
{
const H5FD_multi_t *file = (const H5FD_multi_t*)_file;
+ haddr_t eoa = 0;
+ haddr_t memb_eoa = 0;
+ static const char *func="H5FD_multi_eof"; /* Function Name for error reporting */
/* Clear the error stack */
H5Eclear_stack(H5E_DEFAULT);
- return file->eoa;
+ /* The library used to have EOA for the whole file. But it's
+ * taken out because it makes little sense for MULTI files.
+ * However, the library sometimes queries it through H5F_get_eoa.
+ * Here the code finds the biggest EOA for individual file if
+ * the query is from H5F_get_eoa (TYPE is H5FD_MEM_DEFAULT).
+ */
+ if(H5FD_MEM_DEFAULT == type) {
+ UNIQUE_MEMBERS(file->fa.memb_map, mt) {
+ if (file->memb[mt]) {
+ /* Retrieve EOA */
+ H5E_BEGIN_TRY {
+ memb_eoa = H5FDget_eoa(file->memb[mt], mt);
+ } H5E_END_TRY;
+
+ if (HADDR_UNDEF==memb_eoa)
+ H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eoa", HADDR_UNDEF)
+ } else if (file->fa.relax) {
+ /*
+ * The member is not open yet (maybe it doesn't exist). Make the
+ * best guess about the end-of-file.
+ */
+ memb_eoa = file->memb_next[mt];
+ assert(HADDR_UNDEF!=memb_eoa);
+ } else {
+ H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eoa", HADDR_UNDEF)
+ }
+
+ if(memb_eoa > eoa)
+ eoa = memb_eoa;
+ } END_MEMBERS;
+ } else {
+ H5FD_mem_t mmt = file->fa.memb_map[type];
+ if (H5FD_MEM_DEFAULT==mmt) mmt = type;
+
+ if (file->memb[mmt]) {
+ H5E_BEGIN_TRY {
+ eoa = H5FDget_eoa(file->memb[mmt], mmt);
+ } H5E_END_TRY;
+
+ if (HADDR_UNDEF==eoa)
+ H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eoa", HADDR_UNDEF)
+ } else if (file->fa.relax) {
+int i;
+ /*
+ * The member is not open yet (maybe it doesn't exist). Make the
+ * best guess about the end-of-file.
+ */
+ eoa = file->memb_next[mmt];
+ assert(HADDR_UNDEF!=eoa);
+ } else {
+ H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eoa", HADDR_UNDEF)
+ }
+ }
+
+ return eoa;
}
@@ -1466,43 +1535,29 @@ H5FD_multi_get_eoa(const H5FD_t *_file)
* Wednesday, August 4, 1999
*
* Modifications:
+ * Raymond Lu
+ * 10 January 2007
+ * EOA for the whole file is discarded because it's meaningless
+ * for MULTI file. This function only sets eoa for individual
+ * file.
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5FD_multi_set_eoa(H5FD_t *_file, haddr_t eoa)
+H5FD_multi_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa)
{
H5FD_multi_t *file = (H5FD_multi_t*)_file;
- H5FD_mem_t mt, mmt;
herr_t status;
static const char *func="H5FD_multi_set_eoa"; /* Function Name for error reporting */
/* Clear the error stack */
H5Eclear_stack(H5E_DEFAULT);
- /* Find the subfile in which the new EOA value falls */
- for (mt=H5FD_MEM_SUPER; mt<H5FD_MEM_NTYPES; mt=(H5FD_mem_t)(mt+1)) {
- mmt = file->fa.memb_map[mt];
- if (H5FD_MEM_DEFAULT==mmt) mmt = mt;
- assert(mmt>0 && mmt<H5FD_MEM_NTYPES);
-
- if (eoa>=file->fa.memb_addr[mmt] && eoa<file->memb_next[mmt]) {
- break;
- }
- }
- assert(mt<H5FD_MEM_NTYPES);
-
- /* Set subfile eoa */
- if (file->memb[mmt]) {
- H5E_BEGIN_TRY {
- status = H5FDset_eoa(file->memb[mmt], eoa-file->fa.memb_addr[mmt]);
- } H5E_END_TRY;
- if (status<0)
- H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_BADVALUE, "member H5FDset_eoa failed", -1)
- }
-
- /* Save new eoa for return later */
- file->eoa = eoa;
+ H5E_BEGIN_TRY {
+ status = H5FDset_eoa(file->memb[type], type, eoa);
+ } H5E_END_TRY;
+ if (status<0)
+ H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_BADVALUE, "member H5FDset_eoa failed", -1)
return 0;
}
@@ -1524,6 +1579,10 @@ H5FD_multi_set_eoa(H5FD_t *_file, haddr_t eoa)
* Wednesday, August 4, 1999
*
* Modifications:
+ * Raymond Lu
+ * 5 January 2007
+ * Multi driver no longer has EOA for the whole file. Calculate
+ * it in the same way as EOF instead.
*
*-------------------------------------------------------------------------
*/
@@ -1531,7 +1590,8 @@ static haddr_t
H5FD_multi_get_eof(const H5FD_t *_file)
{
const H5FD_multi_t *file = (const H5FD_multi_t*)_file;
- haddr_t eof=0, tmp;
+ haddr_t eof=0, tmp_eof;
+ haddr_t eoa=0, tmp_eoa;
static const char *func="H5FD_multi_eof"; /* Function Name for error reporting */
/* Clear the error stack */
@@ -1539,29 +1599,41 @@ H5FD_multi_get_eof(const H5FD_t *_file)
UNIQUE_MEMBERS(file->fa.memb_map, mt) {
if (file->memb[mt]) {
+ /* Retrieve EOF */
H5E_BEGIN_TRY {
- tmp = H5FDget_eof(file->memb[mt]);
+ tmp_eof = H5FDget_eof(file->memb[mt]);
} H5E_END_TRY;
- if (HADDR_UNDEF==tmp)
+
+ if (HADDR_UNDEF==tmp_eof)
H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eof", HADDR_UNDEF)
- if (tmp>0) tmp += file->fa.memb_addr[mt];
+ if (tmp_eof>0) tmp_eof += file->fa.memb_addr[mt];
+ /* Retrieve EOA */
+ H5E_BEGIN_TRY {
+ tmp_eoa = H5FDget_eoa(file->memb[mt], mt);
+ } H5E_END_TRY;
+
+ if (HADDR_UNDEF==tmp_eoa)
+ H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eoa", HADDR_UNDEF)
} else if (file->fa.relax) {
/*
* The member is not open yet (maybe it doesn't exist). Make the
* best guess about the end-of-file.
*/
- tmp = file->memb_next[mt];
- assert(HADDR_UNDEF!=tmp);
+ tmp_eof = file->memb_next[mt];
+ assert(HADDR_UNDEF!=tmp_eof);
+ tmp_eoa = file->memb_next[mt];
+ assert(HADDR_UNDEF!=tmp_eoa);
} else {
H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eof", HADDR_UNDEF)
}
- if (tmp>eof) eof = tmp;
+ if (tmp_eof>eof) eof = tmp_eof;
+ if (tmp_eoa>eoa) eoa = tmp_eoa;
} END_MEMBERS;
- return MAX(file->eoa, eof);
+ return MAX(eoa, eof);
}
@@ -1628,6 +1700,8 @@ H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
if (HADDR_UNDEF==(addr=H5FDalloc(file->memb[mmt], type, dxpl_id, size)))
H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file can't alloc", HADDR_UNDEF)
addr += file->fa.memb_addr[mmt];
+
+/*#ifdef TMP
if ( addr + size > file->eoa ) {
if ( H5FD_multi_set_eoa(_file, addr + size) < 0 ) {
@@ -1636,6 +1710,11 @@ H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
"can't set eoa", HADDR_UNDEF)
}
}
+#else
+ if ( addr + size > file->eoa )
+ file->eoa = addr + size;
+#endif */
+
return addr;
}
@@ -1831,7 +1910,7 @@ H5FD_multi_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing)
for (mt=1; mt<H5FD_MEM_NTYPES; mt++) {
if (HADDR_UNDEF!=file->memb_addr[mt]) {
- haddr_t eoa = H5FDget_eoa(file->memb[mt]);
+ haddr_t eoa = H5FDget_eoa(file->memb[mt], mt);
fprintf(stderr, " %6d %20llu %20llu %20llu %s\n",
(int)mt, (unsigned long_long)(file->memb_addr[mt]),
(unsigned long_long)eoa,
diff --git a/src/H5FDprivate.h b/src/H5FDprivate.h
index 6660e49..0d8a6e2 100644
--- a/src/H5FDprivate.h
+++ b/src/H5FDprivate.h
@@ -59,8 +59,8 @@ H5_DLL haddr_t H5FD_alloc(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t
H5_DLL herr_t H5FD_free(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size);
H5_DLL haddr_t H5FD_realloc(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t old_addr,
hsize_t old_size, hsize_t new_size);
-H5_DLL haddr_t H5FD_get_eoa(const H5FD_t *file);
-H5_DLL herr_t H5FD_set_eoa(H5FD_t *file, haddr_t addr);
+H5_DLL haddr_t H5FD_get_eoa(const H5FD_t *file, H5FD_mem_t type);
+H5_DLL herr_t H5FD_set_eoa(H5FD_t *file, H5FD_mem_t type, haddr_t addr);
H5_DLL haddr_t H5FD_get_eof(const H5FD_t *file);
H5_DLL herr_t H5FD_read(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size,
void *buf/*out*/);
diff --git a/src/H5FDpublic.h b/src/H5FDpublic.h
index e6467d5..4eedbf1 100644
--- a/src/H5FDpublic.h
+++ b/src/H5FDpublic.h
@@ -200,8 +200,8 @@ typedef struct H5FD_class_t {
haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
herr_t (*free)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id,
haddr_t addr, hsize_t size);
- haddr_t (*get_eoa)(const H5FD_t *file);
- herr_t (*set_eoa)(H5FD_t *file, haddr_t addr);
+ haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type);
+ herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr);
haddr_t (*get_eof)(const H5FD_t *file);
herr_t (*get_handle)(H5FD_t *file, hid_t fapl, void**file_handle);
herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl,
@@ -289,8 +289,8 @@ H5_DLL herr_t H5FDfree(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id,
haddr_t addr, hsize_t size);
H5_DLL haddr_t H5FDrealloc(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id,
haddr_t addr, hsize_t old_size, hsize_t new_size);
-H5_DLL haddr_t H5FDget_eoa(H5FD_t *file);
-H5_DLL herr_t H5FDset_eoa(H5FD_t *file, haddr_t eof);
+H5_DLL haddr_t H5FDget_eoa(H5FD_t *file, H5FD_mem_t type);
+H5_DLL herr_t H5FDset_eoa(H5FD_t *file, H5FD_mem_t type, haddr_t eoa);
H5_DLL haddr_t H5FDget_eof(H5FD_t *file);
H5_DLL herr_t H5FDget_vfd_handle(H5FD_t *file, hid_t fapl, void**file_handle);
H5_DLL herr_t H5FDread(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id,
diff --git a/src/H5FDsec2.c b/src/H5FDsec2.c
index af020db..11adf75 100644
--- a/src/H5FDsec2.c
+++ b/src/H5FDsec2.c
@@ -149,8 +149,8 @@ static H5FD_t *H5FD_sec2_open(const char *name, unsigned flags, hid_t fapl_id,
static herr_t H5FD_sec2_close(H5FD_t *_file);
static int H5FD_sec2_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
static herr_t H5FD_sec2_query(const H5FD_t *_f1, unsigned long *flags);
-static haddr_t H5FD_sec2_get_eoa(const H5FD_t *_file);
-static herr_t H5FD_sec2_set_eoa(H5FD_t *_file, haddr_t addr);
+static haddr_t H5FD_sec2_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_sec2_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
static haddr_t H5FD_sec2_get_eof(const H5FD_t *_file);
static herr_t H5FD_sec2_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
static herr_t H5FD_sec2_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
@@ -556,11 +556,14 @@ done:
* Monday, August 2, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static haddr_t
-H5FD_sec2_get_eoa(const H5FD_t *_file)
+H5FD_sec2_get_eoa(const H5FD_t *_file, H5FD_mem_t UNUSED type)
{
const H5FD_sec2_t *file = (const H5FD_sec2_t*)_file;
haddr_t ret_value; /* Return value */
@@ -590,11 +593,14 @@ done:
* Thursday, July 29, 1999
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5FD_sec2_set_eoa(H5FD_t *_file, haddr_t addr)
+H5FD_sec2_set_eoa(H5FD_t *_file, H5FD_mem_t UNUSED type, haddr_t addr)
{
H5FD_sec2_t *file = (H5FD_sec2_t*)_file;
herr_t ret_value=SUCCEED; /* Return value */
diff --git a/src/H5FDstdio.c b/src/H5FDstdio.c
index 92ea653..32466bc 100644
--- a/src/H5FDstdio.c
+++ b/src/H5FDstdio.c
@@ -152,8 +152,8 @@ static H5FD_t *H5FD_stdio_open(const char *name, unsigned flags,
static herr_t H5FD_stdio_close(H5FD_t *lf);
static int H5FD_stdio_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
static herr_t H5FD_stdio_query(const H5FD_t *_f1, unsigned long *flags);
-static haddr_t H5FD_stdio_get_eoa(const H5FD_t *_file);
-static herr_t H5FD_stdio_set_eoa(H5FD_t *_file, haddr_t addr);
+static haddr_t H5FD_stdio_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD_stdio_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
static haddr_t H5FD_stdio_get_eof(const H5FD_t *_file);
static herr_t H5FD_stdio_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
static herr_t H5FD_stdio_read(H5FD_t *lf, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
@@ -538,12 +538,16 @@ H5FD_stdio_query(const H5FD_t *_f, unsigned long *flags /* out */)
* Monday, August 2, 1999
*
* Modifications:
- * Stolen from the sec2 driver - QAK, 10/18/99
+ * Stolen from the sec2 driver - QAK, 10/18/99
+ *
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static haddr_t
-H5FD_stdio_get_eoa(const H5FD_t *_file)
+H5FD_stdio_get_eoa(const H5FD_t *_file, H5FD_mem_t /*unused*/ type)
{
const H5FD_stdio_t *file = (const H5FD_stdio_t *)_file;
@@ -569,12 +573,15 @@ H5FD_stdio_get_eoa(const H5FD_t *_file)
* Thursday, July 29, 1999
*
* Modifications:
- * Stolen from the sec2 driver - QAK, 10/18/99
+ * Stolen from the sec2 driver - QAK, 10/18/99
*
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*-------------------------------------------------------------------------
*/
static herr_t
-H5FD_stdio_set_eoa(H5FD_t *_file, haddr_t addr)
+H5FD_stdio_set_eoa(H5FD_t *_file, H5FD_mem_t /*unused*/ type, haddr_t addr)
{
H5FD_stdio_t *file = (H5FD_stdio_t*)_file;
diff --git a/src/H5FDstream.c b/src/H5FDstream.c
index 70ce836..d89c718 100644
--- a/src/H5FDstream.c
+++ b/src/H5FDstream.c
@@ -171,8 +171,8 @@ static H5FD_t *H5FD_stream_open (const char *name, unsigned flags,
static herr_t H5FD_stream_flush (H5FD_t *_stream, hid_t dxpl_id, unsigned closing);
static herr_t H5FD_stream_close (H5FD_t *_stream);
static herr_t H5FD_stream_query(const H5FD_t *_f1, unsigned long *flags);
-static haddr_t H5FD_stream_get_eoa (const H5FD_t *_stream);
-static herr_t H5FD_stream_set_eoa (H5FD_t *_stream, haddr_t addr);
+static haddr_t H5FD_stream_get_eoa (const H5FD_t *_stream, H5FD_mem_t type);
+static herr_t H5FD_stream_set_eoa (H5FD_t *_stream, H5FD_mem_t type, haddr_t addr);
static haddr_t H5FD_stream_get_eof (const H5FD_t *_stream);
static herr_t H5FD_stream_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
static herr_t H5FD_stream_read (H5FD_t *_stream, H5FD_mem_t type,
@@ -897,11 +897,14 @@ done:
* Tuesday, September 12, 2000
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static haddr_t
-H5FD_stream_get_eoa (const H5FD_t *_stream)
+H5FD_stream_get_eoa (const H5FD_t *_stream, H5FD_mem_t UNUSED type)
{
const H5FD_stream_t *stream = (const H5FD_stream_t *) _stream;
haddr_t ret_value; /* Return value */
@@ -930,11 +933,14 @@ done:
* Tuesday, September 12, 2000
*
* Modifications:
+ * Raymond Lu
+ * 21 Dec. 2006
+ * Added the parameter TYPE. It's only used for MULTI driver.
*
*-------------------------------------------------------------------------
*/
static herr_t
-H5FD_stream_set_eoa (H5FD_t *_stream, haddr_t addr)
+H5FD_stream_set_eoa (H5FD_t *_stream, H5FD_mem_t UNUSED type, haddr_t addr)
{
H5FD_stream_t *stream = (H5FD_stream_t *) _stream;
herr_t ret_value=SUCCEED; /* Return value */
diff --git a/src/H5Fsuper.c b/src/H5Fsuper.c
index d8c5d0e..62ada4e 100644
--- a/src/H5Fsuper.c
+++ b/src/H5Fsuper.c
@@ -120,7 +120,7 @@ H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc, haddr_t addr,
start_p = p = sbuf;
buf_size=sizeof(sbuf);
- if (H5FD_set_eoa(lf, shared->super_addr + fixed_size) < 0 ||
+ if (H5FD_set_eoa(lf, H5FD_MEM_SUPER, shared->super_addr + fixed_size) < 0 ||
H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, shared->super_addr, fixed_size, p) < 0)
HGOTO_ERROR(H5E_FILE, H5E_READERROR, FAIL, "unable to read superblock")
} else {
@@ -216,7 +216,7 @@ H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc, haddr_t addr,
/* The buffer (buf) is either passed in or the "local_buf" variable now */
if(!buf) {
- if (H5FD_set_eoa(lf, shared->super_addr + fixed_size+variable_size) < 0 ||
+ if (H5FD_set_eoa(lf, H5FD_MEM_SUPER, shared->super_addr + fixed_size+variable_size) < 0 ||
H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, shared->super_addr + fixed_size,
variable_size, p) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to read superblock")
@@ -292,7 +292,7 @@ H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc, haddr_t addr,
driver_p = p = dbuf;
dbuf_size=sizeof(dbuf);
- if (H5FD_set_eoa(lf, drv_addr + 16) < 0 ||
+ if (H5FD_set_eoa(lf, H5FD_MEM_SUPER, drv_addr + 16) < 0 ||
H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, drv_addr, (size_t)16, p) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to read driver information block")
} /* end if */
@@ -319,7 +319,7 @@ H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc, haddr_t addr,
assert((driver_size + 16) <= dbuf_size);
if(!buf) {
- if (H5FD_set_eoa(lf, drv_addr + 16 + driver_size) < 0 ||
+ if (H5FD_set_eoa(lf, H5FD_MEM_SUPER, drv_addr + 16 + driver_size) < 0 ||
H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, drv_addr+16, driver_size, p) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to read file driver information")
} /* end if */
@@ -365,7 +365,7 @@ H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc, haddr_t addr,
* Tell the file driver how much address space has already been
* allocated so that it knows how to allocate additional memory.
*/
- if (H5FD_set_eoa(lf, stored_eoa) < 0)
+ if (H5FD_set_eoa(lf, H5FD_MEM_SUPER, stored_eoa) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to set end-of-address marker for file")
/* Decode shared object header message information and store it in the
@@ -595,7 +595,7 @@ H5F_write_superblock(H5F_t *f, hid_t dxpl_id)
*p++ = f->shared->sohm_vers;
*p++ = f->shared->sohm_nindexes;
}
- H5F_addr_encode(f, &p, H5FD_get_eoa(f->shared->lf));
+ H5F_addr_encode(f, &p, H5FD_get_eoa(f->shared->lf, H5FD_MEM_SUPER));
H5F_addr_encode(f, &p, f->shared->driver_addr);
if(H5G_obj_ent_encode(f, &p, H5G_oloc(f->shared->root_grp))<0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode root group information")
diff --git a/src/H5MF.c b/src/H5MF.c
index 9fe00b4..eeced47 100644
--- a/src/H5MF.c
+++ b/src/H5MF.c
@@ -38,6 +38,7 @@
#include "H5Fpkg.h"
#include "H5FDprivate.h"
#include "H5MFprivate.h"
+#include "H5FDmulti.h" /*multiple files partitioned by mem usage */
/*-------------------------------------------------------------------------
@@ -234,14 +235,16 @@ done:
hbool_t
H5MF_alloc_overflow(H5F_t *f, hsize_t size)
{
- hsize_t space_needed; /* Accumulator variable */
- size_t c; /* Local index variable */
+ hsize_t space_needed = 0; /* Accumulator variable */
+ H5FD_mem_t type; /* Type of memory */
+ size_t c; /* Local index variable */
hbool_t ret_value; /* Return value */
FUNC_ENTER_NOAPI_NOFUNC(H5MF_alloc_overflow)
/* Start with the current end of the file's address. */
space_needed = (hsize_t)H5F_get_eoa(f);
+
HDassert(H5F_addr_defined(space_needed));
/* Subtract the file's base address to get the actual amount of
diff --git a/test/istore.c b/test/istore.c
index 2b3fb27..8a43a69 100644
--- a/test/istore.c
+++ b/test/istore.c
@@ -631,7 +631,7 @@ main(int argc, char *argv[])
addr = 8 * ((uint64_t)1<<30); /*8 GB */
f=H5I_object(file);
- if (H5FDset_eoa(f->shared->lf, addr)<0) {
+ if (H5FDset_eoa(f->shared->lf, H5FD_MEM_DEFAULT, addr)<0) {
printf("Cannot create large file family\n");
exit(1);
}
diff --git a/test/vfd.c b/test/vfd.c
index 21d022c..b36274d 100644
--- a/test/vfd.c
+++ b/test/vfd.c
@@ -921,6 +921,7 @@ static herr_t
test_multi(void)
{
hid_t file=(-1), fapl, fapl2=(-1), dset=(-1), space=(-1);
+ hid_t root, attr, aspace, atype;
hid_t access_fapl = -1;
char filename[1024];
int *fhandle2=NULL, *fhandle=NULL;
@@ -931,7 +932,9 @@ test_multi(void)
const char *memb_name[H5FD_MEM_NTYPES];
char sv[H5FD_MEM_NTYPES][32];
hsize_t dims[2]={MULTI_SIZE, MULTI_SIZE};
+ hsize_t adims[1]={1};
char dname[]="dataset";
+ char meta[] = "this is some metadata on this file";
int i, j;
int buf[MULTI_SIZE][MULTI_SIZE];
@@ -945,20 +948,31 @@ test_multi(void)
HDmemset(memb_addr, 0, sizeof memb_addr);
HDmemset(sv, 0, sizeof sv);
- for(mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt))
+ for(mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt)) {
+ memb_fapl[mt] = H5P_DEFAULT;
memb_map[mt] = H5FD_MEM_SUPER;
+ }
memb_map[H5FD_MEM_DRAW] = H5FD_MEM_DRAW;
+ memb_map[H5FD_MEM_BTREE] = H5FD_MEM_BTREE;
+ memb_map[H5FD_MEM_GHEAP] = H5FD_MEM_GHEAP;
- memb_fapl[H5FD_MEM_SUPER] = H5P_DEFAULT;
sprintf(sv[H5FD_MEM_SUPER], "%%s-%c.h5", 's');
memb_name[H5FD_MEM_SUPER] = sv[H5FD_MEM_SUPER];
memb_addr[H5FD_MEM_SUPER] = 0;
- memb_fapl[H5FD_MEM_DRAW] = H5P_DEFAULT;
+ sprintf(sv[H5FD_MEM_BTREE], "%%s-%c.h5", 'b');
+ memb_name[H5FD_MEM_BTREE] = sv[H5FD_MEM_BTREE];
+ memb_addr[H5FD_MEM_BTREE] = HADDR_MAX/4;
+
sprintf(sv[H5FD_MEM_DRAW], "%%s-%c.h5", 'r');
memb_name[H5FD_MEM_DRAW] = sv[H5FD_MEM_DRAW];
memb_addr[H5FD_MEM_DRAW] = HADDR_MAX/2;
+ sprintf(sv[H5FD_MEM_GHEAP], "%%s-%c.h5", 'g');
+ memb_name[H5FD_MEM_GHEAP] = sv[H5FD_MEM_GHEAP];
+ memb_addr[H5FD_MEM_GHEAP] = HADDR_MAX*3/4;
+
+
if(H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name, memb_addr, TRUE)<0)
TEST_ERROR;
h5_fixname(FILENAME[3], fapl, filename, sizeof filename);
@@ -969,6 +983,7 @@ test_multi(void)
if(H5Fclose(file)<0)
TEST_ERROR;
+
/* Test wrong ways to reopen multi files */
if(test_multi_opens(filename)<0)
TEST_ERROR;
@@ -994,11 +1009,12 @@ test_multi(void)
TEST_ERROR;
/* Before any data is written, the raw data file is empty. So
- * the file size is only the size of metadata file. It's supposed
- * to be 800 bytes.
+ * the file size is only the size of b-tree + HADDR_MAX/4.
*/
- if(file_size < (KB / 2) || file_size > KB)
+#ifdef H5_HAVE_LARGE_HSIZET
+ if(file_size < HADDR_MAX/4 || file_size > HADDR_MAX/2)
TEST_ERROR;
+#endif /* H5_HAVE_LARGE_HSIZET */
if((dset=H5Dcreate(file, dname, H5T_NATIVE_INT, space, H5P_DEFAULT))<0)
TEST_ERROR;
@@ -1044,6 +1060,39 @@ test_multi(void)
TEST_ERROR;
if(H5Pclose(fapl2)<0)
TEST_ERROR;
+
+ /* Create and write attribute for the root group. */
+ if((root = H5Gopen(file, "/"))<0)
+ TEST_ERROR;
+
+ /* Attribute string. */
+ if((atype = H5Tcopy(H5T_C_S1))<0)
+ TEST_ERROR;
+
+ if(H5Tset_size(atype, strlen(meta) + 1)<0)
+ TEST_ERROR;
+
+ if(H5Tset_strpad(atype, H5T_STR_NULLTERM)<0)
+ TEST_ERROR;
+
+ /* Create and write attribute */
+ if((aspace = H5Screate_simple(1, adims, NULL))<0)
+ TEST_ERROR;
+
+ if((attr = H5Acreate(root, "Metadata", atype, aspace, H5P_DEFAULT))<0)
+ TEST_ERROR;
+
+ if(H5Awrite(attr, atype, meta)<0)
+ TEST_ERROR;
+
+ /* Close IDs */
+ if(H5Tclose(atype)<0)
+ TEST_ERROR;
+ if(H5Sclose(aspace)<0)
+ TEST_ERROR;
+ if(H5Aclose(attr)<0)
+ TEST_ERROR;
+
if(H5Fclose(file)<0)
TEST_ERROR;
diff --git a/tools/h5dump/h5dump.c b/tools/h5dump/h5dump.c
index 8386551..6b9f31a 100644
--- a/tools/h5dump/h5dump.c
+++ b/tools/h5dump/h5dump.c
@@ -6223,6 +6223,7 @@ h5_fileaccess(void)
assert(HDstrlen(multi_letters)==H5FD_MEM_NTYPES);
for (mt=H5FD_MEM_DEFAULT; mt<H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt)) {
memb_fapl[mt] = H5P_DEFAULT;
+ memb_map[mt] = mt;
sprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
memb_name[mt] = sv[mt];
memb_addr[mt] = MAX(mt-1,0)*(HADDR_MAX/10);
diff --git a/tools/h5dump/h5dumpgentest.c b/tools/h5dump/h5dumpgentest.c
index 83f009a..f7355fb 100644
--- a/tools/h5dump/h5dumpgentest.c
+++ b/tools/h5dump/h5dumpgentest.c
@@ -3026,10 +3026,13 @@ void gent_multi(void)
for (mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt)) {
memb_fapl[mt] = H5P_DEFAULT;
+ memb_map[mt] = mt;
sprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
memb_name[mt] = sv[mt];
+/*printf("memb_name[%d]=%s, memb_map[%d]=%d; ", mt, memb_name[mt], mt, memb_map[mt]);*/
memb_addr[mt] = MAX(mt - 1,0) * (HADDR_MAX / 10);
}
+ memb_map[H5FD_MEM_DEFAULT] = H5FD_MEM_SUPER;
H5Pset_fapl_multi(fapl, memb_map, memb_fapl, memb_name,
memb_addr, FALSE);
@@ -3047,6 +3050,7 @@ void gent_multi(void)
dset[i][j] = i + j;
H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset);
+
H5Sclose(space);
H5Dclose(dataset);
H5Fclose(fid);
diff --git a/tools/testfiles/tmulti-l.h5 b/tools/testfiles/tmulti-l.h5
index 8b01fc6..42fe396 100644
--- a/tools/testfiles/tmulti-l.h5
+++ b/tools/testfiles/tmulti-l.h5
Binary files differ
diff --git a/tools/testfiles/tmulti-o.h5 b/tools/testfiles/tmulti-o.h5
index 35c1998..b433ee8 100644
--- a/tools/testfiles/tmulti-o.h5
+++ b/tools/testfiles/tmulti-o.h5
Binary files differ
diff --git a/tools/testfiles/tmulti-r.h5 b/tools/testfiles/tmulti-r.h5
index eb08e79..928d4d5 100644
--- a/tools/testfiles/tmulti-r.h5
+++ b/tools/testfiles/tmulti-r.h5
Binary files differ
diff --git a/tools/testfiles/tmulti-s.h5 b/tools/testfiles/tmulti-s.h5
index 5b4ef20..3feae49 100644
--- a/tools/testfiles/tmulti-s.h5
+++ b/tools/testfiles/tmulti-s.h5
Binary files differ
diff --git a/tools/testfiles/tsplit_file-m.h5 b/tools/testfiles/tsplit_file-m.h5
index 09db115..a6eef73 100644
--- a/tools/testfiles/tsplit_file-m.h5
+++ b/tools/testfiles/tsplit_file-m.h5
Binary files differ
diff --git a/tools/testfiles/tsplit_file-r.h5 b/tools/testfiles/tsplit_file-r.h5
index eb08e79..928d4d5 100644
--- a/tools/testfiles/tsplit_file-r.h5
+++ b/tools/testfiles/tsplit_file-r.h5
Binary files differ