diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2007-03-10 15:47:59 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2007-03-10 15:47:59 (GMT) |
commit | 6cfd5c146267e771e46d37709c405c7732feeaf0 (patch) | |
tree | d9eb91f315735e48eda173531bcaf10269d65db3 /src | |
parent | a127510b7b3049d0e136b677b180c8e644bdc7ea (diff) | |
download | hdf5-6cfd5c146267e771e46d37709c405c7732feeaf0.zip hdf5-6cfd5c146267e771e46d37709c405c7732feeaf0.tar.gz hdf5-6cfd5c146267e771e46d37709c405c7732feeaf0.tar.bz2 |
[svn-r13487] Description:
Eliminate message count from new version of object header prefix -
it can be computed when the header is loaded and the table of messages is
built.
Tested on:
FreeBSD/32 6.2 (duty)
Diffstat (limited to 'src')
-rw-r--r-- | src/H5Oalloc.c | 5 | ||||
-rw-r--r-- | src/H5Ocache.c | 26 | ||||
-rw-r--r-- | src/H5Opkg.h | 2 |
3 files changed, 18 insertions, 15 deletions
diff --git a/src/H5Oalloc.c b/src/H5Oalloc.c index 555c7b0..957de77 100644 --- a/src/H5Oalloc.c +++ b/src/H5Oalloc.c @@ -64,7 +64,6 @@ static herr_t H5O_eliminate_gap(H5O_t *oh, H5O_mesg_t *mesg, uint8_t *new_gap_loc, size_t new_gap_size); static herr_t H5O_alloc_null(H5O_t *oh, unsigned null_idx, const H5O_msg_class_t *new_type, void *new_native, size_t new_size); -static herr_t H5O_alloc_msgs(H5O_t *oh, size_t min_alloc); static htri_t H5O_alloc_extend_chunk(H5F_t *f, H5O_t *oh, unsigned chunkno, size_t size, unsigned * msg_idx); static unsigned H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, @@ -395,7 +394,7 @@ done: * *------------------------------------------------------------------------- */ -static herr_t +herr_t H5O_alloc_msgs(H5O_t *oh, size_t min_alloc) { size_t old_alloc; /* Old number of messages allocated */ @@ -410,7 +409,7 @@ H5O_alloc_msgs(H5O_t *oh, size_t min_alloc) /* Initialize number of messages information */ old_alloc = oh->alloc_nmesgs; - na = oh->alloc_nmesgs + MAX(oh->alloc_nmesgs, min_alloc); + na = oh->alloc_nmesgs + MAX(oh->alloc_nmesgs, min_alloc); /* At least double */ /* Attempt to allocate more memory */ if(NULL == (new_mesg = H5FL_SEQ_REALLOC(H5O_mesg_t, oh->mesg, na))) diff --git a/src/H5Ocache.c b/src/H5Ocache.c index 786d1d3..706497f 100644 --- a/src/H5Ocache.c +++ b/src/H5Ocache.c @@ -280,6 +280,9 @@ H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void UNUSED * _udata1, oh->flags = *p++; if(oh->flags & ~H5O_HDR_ALL_FLAGS) HGOTO_ERROR(H5E_OHDR, H5E_VERSION, NULL, "unknown object header status flag(s)") + + /* Number of messages (to allocate initially) */ + nmesgs = 1; } /* end if */ else { /* Version */ @@ -292,10 +295,10 @@ H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void UNUSED * _udata1, /* Reserved */ p++; - } /* end else */ - /* Number of messages */ - UINT16DECODE(p, nmesgs); + /* Number of messages */ + UINT16DECODE(p, nmesgs); + } /* end else */ /* Link count */ UINT32DECODE(p, oh->nlink); @@ -496,9 +499,12 @@ H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void UNUSED * _udata1, merged_null_msgs++; } /* end if */ else { - /* New message */ - if(oh->nmesgs >= nmesgs) - HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "corrupt object header - too many messages") + /* Check if we need to extend message table to hold the new message */ + if(oh->nmesgs >= oh->alloc_nmesgs) + if(H5O_alloc_msgs(oh, (size_t)1) < 0) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate more space for messages") + + /* Record information about message */ mesgno = oh->nmesgs++; oh->mesg[mesgno].type = H5O_msg_class_g[id]; oh->mesg[mesgno].dirty = FALSE; @@ -574,8 +580,9 @@ H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void UNUSED * _udata1, oh->cache_info.is_dirty = TRUE; /* Sanity check for the correct # of messages in object header */ - if((oh->nmesgs + skipped_msgs + merged_null_msgs) != nmesgs) - HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "corrupt object header - too few messages") + if(oh->version == H5O_VERSION_1) + if((oh->nmesgs + skipped_msgs + merged_null_msgs) != nmesgs) + HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "corrupt object header - too few messages") #ifdef H5O_DEBUG H5O_assert(oh); @@ -652,9 +659,6 @@ H5O_assert(oh); /* Flags */ *p++ = oh->flags; - /* Number of messages */ - UINT16ENCODE(p, oh->nmesgs); - /* Link count */ UINT32ENCODE(p, oh->nlink); diff --git a/src/H5Opkg.h b/src/H5Opkg.h index bd92478..65d4914 100644 --- a/src/H5Opkg.h +++ b/src/H5Opkg.h @@ -103,7 +103,6 @@ (H5O_SIZEOF_MAGIC + /*magic number */ \ 1 + /*version number */ \ 1 + /*flags */ \ - 2 + /*number of messages */ \ 4 + /*reference count */ \ (((O)->flags & H5O_HDR_STORE_TIMES) ? ( \ 4 + /*access time */ \ @@ -477,6 +476,7 @@ H5_DLL herr_t H5O_msg_iterate_real(H5F_t *f, H5O_t *oh, const H5O_msg_class_t *t const H5O_mesg_operator_t *op, void *op_data, hid_t dxpl_id); /* Object header allocation routines */ +H5_DLL herr_t H5O_alloc_msgs(H5O_t *oh, size_t min_alloc); H5_DLL unsigned H5O_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *type, const void *mesg); H5_DLL herr_t H5O_condense_header(H5F_t *f, H5O_t *oh, hid_t dxpl_id); |