summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Mainzer <mainzer@hdfgroup.org>2010-03-05 15:49:33 (GMT)
committerJohn Mainzer <mainzer@hdfgroup.org>2010-03-05 15:49:33 (GMT)
commit356b2bd5c49631ff25a7f1f990e19897be41a487 (patch)
tree15d4d80501ff460936b2169e56776eb12379e8a1
parent9f85fd57d2b5c7b6bf8245af942907c7d222a156 (diff)
downloadhdf5-356b2bd5c49631ff25a7f1f990e19897be41a487.zip
hdf5-356b2bd5c49631ff25a7f1f990e19897be41a487.tar.gz
hdf5-356b2bd5c49631ff25a7f1f990e19897be41a487.tar.bz2
[svn-r18371] Interim checkin of AIO journal write code.
Added code allowing async journal entry writes for metadata journaling, along with associated test code. At present, the code compiles and passes tests under Linux and Solaris. code compiles under MacOS, but usually locks up the host machine under test. code fails to compile under BSD. no other platforms tested.
-rw-r--r--config/gnu-flags2
-rw-r--r--config/linux-gnulibc18
-rw-r--r--config/solaris2.x5
-rw-r--r--src/H5AC2.c2
-rw-r--r--src/H5C2.c2
-rw-r--r--src/H5C2journal.c5517
-rw-r--r--src/H5C2pkg.h1556
-rw-r--r--src/H5C2private.h396
-rw-r--r--src/H5MF.c2
-rw-r--r--src/H5private.h4
-rw-r--r--test/cache2.c3
-rw-r--r--test/cache2_api.c1
-rw-r--r--test/cache2_common.c2
-rw-r--r--test/cache2_jnl_file_marking.c2
-rw-r--r--test/cache2_journal.c2979
-rw-r--r--tools/h5recover/h5recover.c2
16 files changed, 7222 insertions, 3261 deletions
diff --git a/config/gnu-flags b/config/gnu-flags
index c1990e0..170bdf8 100644
--- a/config/gnu-flags
+++ b/config/gnu-flags
@@ -140,7 +140,7 @@ case "$cc_vendor-$cc_version" in
esac
# General
- H5_CFLAGS="$H5_CFLAGS $arch -ansi -pedantic -Wall -W -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline"
+ H5_CFLAGS="$H5_CFLAGS $arch -D_POSIX_C_SOURCE=199309L -ansi -pedantic -Wall -W -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline"
# Production
case "$cc_vendor-$cc_version" in
diff --git a/config/linux-gnulibc1 b/config/linux-gnulibc1
index 015d079..776e39b 100644
--- a/config/linux-gnulibc1
+++ b/config/linux-gnulibc1
@@ -126,6 +126,14 @@ if test $CC_BASENAME = cmpicc; then
hdf5_mpi_complex_derived_datatype_works=${hdf5_mpi_complex_derived_datatype_works='no'}
fi
+# Link in real time library to support use of AIO.
+#
+# Note that while the following is correct for gcc, it is may be wrong for
+# other compilers used under Linux. Will have to test for this and change
+# it if necessary.
+# JRM -- 2/3/10
+LIBS="$LIBS -lrt"
+
#Comment out the following line if your system supports collective IO when some processes
#don't have any contributions to IOs.
#hdf5_mpi_special_collective_io_works=${hdf5_mpi_special_collective_io_works='no'}
diff --git a/config/solaris2.x b/config/solaris2.x
index c81fd61..148ec03 100644
--- a/config/solaris2.x
+++ b/config/solaris2.x
@@ -56,8 +56,9 @@ if test "X-" = "X-$cc_flags_set"; then
&& PROD_CFLAGS="`echo $PROD_CFLAGS | sed -e 's/-O//'`"
fi
-# Add socket lib for the Stream Virtual File Driver
-LIBS="$LIBS -lsocket"
+# Add socket lib for the Stream Virtual File Driver and the real time
+# lib for AIO
+LIBS="$LIBS -lsocket -lrt"
# The default Fortran 90 compiler
diff --git a/src/H5AC2.c b/src/H5AC2.c
index beb2927..966eec4 100644
--- a/src/H5AC2.c
+++ b/src/H5AC2.c
@@ -48,6 +48,8 @@
*-------------------------------------------------------------------------
*/
+#include <aio.h>
+
#define H5AC2_PACKAGE /*suppress error about including H5AC2pkg */
#define H5C2_PACKAGE /*suppress error about including H5C2pkg */
#define H5F_PACKAGE /*suppress error about including H5Fpkg */
diff --git a/src/H5C2.c b/src/H5C2.c
index b3b635f..dd4105a 100644
--- a/src/H5C2.c
+++ b/src/H5C2.c
@@ -95,6 +95,8 @@
*
**************************************************************************/
+#include <aio.h>
+
#define H5C2_PACKAGE /*suppress error about including H5C2pkg */
#define H5F_PACKAGE /*suppress error about including H5Fpkg */
diff --git a/src/H5C2journal.c b/src/H5C2journal.c
index 88f815e..71833fc 100644
--- a/src/H5C2journal.c
+++ b/src/H5C2journal.c
@@ -22,12 +22,12 @@
* Purpose: This file is a general catchall for functions supporting
* metadata journaling. Note that journaling must be tighly
* integrated with the metadata cache, and thus this file only
- * contains only that code that can be easily separated from
+ * contains only that code that can be easily separated from
* the rest of the cache code.
*
* Observe also that to minimize overhead, it is quite possible
* that many of the functions in this file will be converted
- * into macros at some point in the future.
+ * into macros at some point in the future.
*
* Modifications:
*
@@ -36,6 +36,11 @@
*-------------------------------------------------------------------------
*/
+#include <aio.h>
+#include <strings.h>
+#include <unistd.h>
+
+
#define H5F_PACKAGE /* suppress error about including H5Fpkg */
#define H5C2_PACKAGE /* suppress error about including H5C2pkg */
@@ -78,6 +83,57 @@ static herr_t H5C2_get_journaling_in_progress(const H5F_t * f,
static herr_t H5C2_grow_mdjsc_callback_table(H5C2_t * cache_ptr);
+static herr_t H5C2_jb_aio__await_buffer_write_completion(
+ H5C2_jbrb_t * struct_ptr,
+ int buf_num);
+
+static herr_t H5C2_jb_aio__await_async_fsync_completion(
+ H5C2_jbrb_t * struct_ptr);
+
+static herr_t H5C2_jb_aio__flush(H5C2_jbrb_t * struct_ptr);
+
+static herr_t H5C2_jb_aio__get_last_transaction_on_disk(
+ H5C2_jbrb_t * struct_ptr,
+ uint64_t * trans_num_ptr);
+
+static herr_t H5C2_jb_aio__make_space_in_ring_buffer(H5C2_jbrb_t * struct_ptr);
+
+static herr_t H5C2_jb_aio__note_completed_async_buffer_writes(
+ H5C2_jbrb_t * struct_ptr);
+
+static herr_t H5C2_jb_aio__note_completed_async_fsyncs(
+ H5C2_jbrb_t * struct_ptr);
+
+static herr_t H5C2_jb_aio__prep_next_buf_for_use(H5C2_jbrb_t * struct_ptr,
+ uint64_t last_trans_in_ring_buffer);
+
+static herr_t H5C2_jb_aio__queue_async_fsync(H5C2_jbrb_t * struct_ptr);
+
+static herr_t H5C2_jb_aio__queue_buffer_write(H5C2_jbrb_t * struct_ptr,
+ int buf_num,
+ hbool_t partial_write_ok);
+
+static herr_t H5C2_jb_aio__sync_file(H5C2_jbrb_t * struct_ptr);
+
+static herr_t H5C2_jb_aio__sync_q__append(H5C2_jbrb_t * struct_ptr,
+ struct H5C2_jbrb_sync_q_entry_t * entry_ptr);
+
+static herr_t H5C2_jb_aio__sync_q__discard_head(H5C2_jbrb_t * struct_ptr);
+
+static herr_t H5C2_jb_aio__test_buffer_write_complete(H5C2_jbrb_t * struct_ptr,
+ int buf_num,
+ hbool_t *complete_ptr);
+
+static herr_t H5C2_jb_aio__test_next_async_fsync_complete(
+ H5C2_jbrb_t * struct_ptr,
+ hbool_t *sync_complete_ptr);
+
+herr_t H5C2_jb_aio__write_to_buffer(H5C2_jbrb_t * struct_ptr,
+ size_t size,
+ const char * data,
+ hbool_t is_end_trans,
+ uint64_t trans_num);
+
static herr_t H5C2_jb_bjf__comment(H5C2_jbrb_t * struct_ptr,
const char * comment_ptr);
@@ -108,7 +164,7 @@ static herr_t H5C2_jb_bjf__write_chksum(H5C2_jbrb_t * struct_ptr,
static herr_t H5C2_jb_bjf__write_length(H5C2_jbrb_t * struct_ptr,
size_t length,
- hbool_t is_end_trans,
+ hbool_t is_end_trans,
uint64_t trans_num);
static herr_t H5C2_jb_bjf__write_offset(H5C2_jbrb_t * struct_ptr,
@@ -142,9 +198,23 @@ static herr_t H5C2_jb_hrjf__journal_entry(H5C2_jbrb_t * struct_ptr,
size_t length,
const uint8_t * body);
-static herr_t H5C2_jb_hrjf__start_transaction(H5C2_jbrb_t * struct_ptr,
- uint64_t trans_num);
+static herr_t H5C2_jb_sio__flush(H5C2_jbrb_t * struct_ptr);
+static herr_t H5C2_jb_sio__flush_full_buffers(H5C2_jbrb_t * struct_ptr);
+
+static herr_t H5C2_jb_sio__get_last_transaction_on_disk(
+ H5C2_jbrb_t * struct_ptr,
+ uint64_t * trans_num_ptr);
+
+static herr_t H5C2_jb_sio__write_to_buffer(H5C2_jbrb_t * struct_ptr,
+ size_t size,
+ const char * data,
+ hbool_t is_end_trans,
+ uint64_t trans_num);
+
+herr_t H5C2_jb_stats__dump(H5C2_jbrb_t * struct_ptr);
+
+herr_t H5C2_jb_stats__reset(H5C2_jbrb_t * struct_ptr);
static herr_t H5C2_shrink_mdjsc_callback_table(H5C2_t * cache_ptr);
@@ -170,14 +240,14 @@ static herr_t H5C2_shrink_mdjsc_callback_table(H5C2_t * cache_ptr);
* structure.
*
* JRM -- 8/18/08
- * Added code to flush the cache before journaling
+ * Added code to flush the cache before journaling
* starts, and to call the metadata journaling status
* change callbacks after journaling has been started.
*
* JRM -- 2/10/09
- * Added journal_magic variable and supporting code.
+ * Added journal_magic variable and supporting code.
*
- * The idea is to assign a random magic number to both the
+ * The idea is to assign a random magic number to both the
* journal file, and to the journal configuration information
* information in the super block so that it will be hard to
* apply the wrong journal file to a corrupted hdf5 file.
@@ -233,7 +303,7 @@ H5C2_begin_journaling(H5F_t * f,
if ( result < 0 ) {
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
- "H5C2_flush_cache() failed.")
+ "H5C2_flush_cache() failed.")
}
journal_magic = (int32_t)HDrand();
@@ -294,8 +364,8 @@ done:
* Function: H5C2_begin_transaction
*
* Purpose: Handle book keeping for the beginning of a transaction, and
- * return the transaction ID assigned to the transaction in
- * *trans_num_ptr.
+ * return the transaction ID assigned to the transaction in
+ * *trans_num_ptr.
*
* Return: Success: SUCCEED
* Failure: FAIL
@@ -361,7 +431,7 @@ done:
* journal file.
*
* 2) Mark the superblock to indicate that we are no longer
- * journaling. Note that this will flush the HDF5 file
+ * journaling. Note that this will flush the HDF5 file
* again in passing.
*
* 3) Tell the journal file write code to shutdown. This will
@@ -409,7 +479,7 @@ H5C2_end_journaling(H5F_t * f,
if ( result < 0 ) {
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
- "H5C2_flush_cache() failed.")
+ "H5C2_flush_cache() failed.")
}
HDassert( cache_ptr->mdj_enabled );
@@ -422,7 +492,7 @@ H5C2_end_journaling(H5F_t * f,
cache_ptr->mdj_enabled = FALSE;
/* Remove the journal configuration information from the superblock
- * extension. In passing, also discard the cache's copies of the
+ * extension. In passing, also discard the cache's copies of the
* metadata journaling magic, and the journal file name.
*/
result = H5C2_unmark_journaling_in_progress(f, dxpl_id, cache_ptr);
@@ -569,14 +639,14 @@ done:
* Purpose: Return the current metadata journaling status in an
* instance of H5C2_mdj_config_t.
*
- * If journaling is enabled, config_ptr->enable_journaling
+ * If journaling is enabled, config_ptr->enable_journaling
* is set to TRUE, and the remaining fields in *config_ptr
* will be set to reflect current journaling status.
*
* If journaling is disabled, config_ptr->enable_journaling
* is set to FALSE, and the remaining fields of *config_ptr
* are undefined.
- *
+ *
* Return: Success: SUCCEED
* Failure: FAIL
*
@@ -612,7 +682,7 @@ H5C2_get_journal_config(H5C2_t * cache_ptr,
config_ptr->enable_journaling = TRUE;
- HDstrncpy(&(config_ptr->journal_file_path[0]),
+ HDstrncpy(&(config_ptr->journal_file_path[0]),
cache_ptr->jnl_file_name,
H5C2__MAX_JOURNAL_FILE_NAME_LEN);
@@ -625,7 +695,7 @@ H5C2_get_journal_config(H5C2_t * cache_ptr,
config_ptr->jbrb_use_aio = (cache_ptr->mdj_jbrb).use_aio;
config_ptr->jbrb_human_readable = (cache_ptr->mdj_jbrb).human_readable;
-
+
} else {
config_ptr->enable_journaling = FALSE;
@@ -657,9 +727,9 @@ done:
*
* b) Truncate the journal file
*
- * c) Reset cache_ptr->trans_num and
+ * c) Reset cache_ptr->trans_num and
* cache_ptr->last_trans_on_disk to zero.
- *
+ *
* Return: Success: SUCCEED
* Failure: FAIL
*
@@ -724,7 +794,7 @@ H5C2_journal_post_flush(H5F_t * f,
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
"H5C2_jb__trunc() failed.")
}
-
+
cache_ptr->trans_num = (uint64_t)0;
cache_ptr->last_trans_on_disk = (uint64_t)0;
}
@@ -751,13 +821,13 @@ done:
* 3) Get the ID of the last transaction on disk.
*
* 4) If the value obtained in 3) above has changed,
- * remove all entries whose last transaction has
+ * remove all entries whose last transaction has
* made it to disk from the journal write in progress
* list.
*
* 5) Verify that the journal write in progress list is
* empty.
- *
+ *
* Return: Success: SUCCEED
* Failure: FAIL
*
@@ -812,7 +882,7 @@ H5C2_journal_pre_flush(H5C2_t * cache_ptr)
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
"H5C2_update_for_new_last_trans_on_disk() failed.")
}
- }
+ }
if ( cache_ptr->jwipl_len != 0 ) {
@@ -857,11 +927,11 @@ H5C2_journal_transaction(H5F_t * f,
size_t new_len;
void * new_image_ptr;
void * thing;
- herr_t result;
+ herr_t result;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5C2_journal_transaction, FAIL)
-
+
HDassert( f != NULL );
HDassert( cache_ptr != NULL );
HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC );
@@ -879,7 +949,7 @@ H5C2_journal_transaction(H5F_t * f,
"H5C2_jb__comment() failed.")
}
- result = H5C2_jb__start_transaction(&(cache_ptr->mdj_jbrb),
+ result = H5C2_jb__start_transaction(&(cache_ptr->mdj_jbrb),
cache_ptr->trans_num);
if ( result != SUCCEED ) {
@@ -897,7 +967,7 @@ H5C2_journal_transaction(H5F_t * f,
resized = FALSE;
renamed = FALSE;
- if ( entry_ptr->is_protected )
+ if ( entry_ptr->is_protected )
{
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
@@ -916,7 +986,7 @@ H5C2_journal_transaction(H5F_t * f,
}
}
- /* This should always be true, unless the entry has already been
+ /* This should always be true, unless the entry has already been
* serialized in this function, and that serialization caused the
* entry to be resized (and possibly renamed as well).
*/
@@ -941,16 +1011,18 @@ H5C2_journal_transaction(H5F_t * f,
if ( serialize_flags != 0 ) {
- /* if the serialize_flags are not zero, the entry has been
+ /* if the serialize_flags are not zero, the entry has been
* modified as a result of the serialize. Pass these changes
- * on to the cache, and don't bother to write a journal entry
- * at this time -- the protect/unprotect/rename will move the
- * entry to the head of the transaction list, where we will
+ * on to the cache, and don't bother to write a journal entry
+ * at this time -- the protect/unprotect/rename will move the
+ * entry to the head of the transaction list, where we will
* handle it later.
*/
- resized = (serialize_flags & H5C2__SERIALIZE_RESIZED_FLAG) != 0;
- renamed = (serialize_flags & H5C2__SERIALIZE_RENAMED_FLAG) != 0;
+ resized =
+ (hbool_t)((serialize_flags & H5C2__SERIALIZE_RESIZED_FLAG) != 0);
+ renamed =
+ (hbool_t)((serialize_flags & H5C2__SERIALIZE_RENAMED_FLAG) != 0);
if ( ( renamed ) && ( ! resized ) ) {
@@ -958,7 +1030,7 @@ H5C2_journal_transaction(H5F_t * f,
"entry renamed but not resized?!?!")
}
- if ( resized )
+ if ( resized )
{
/* in the following protect/unprotect, the dxpl_id
* is irrelement, as we know that the entry is in cache,
@@ -966,7 +1038,7 @@ H5C2_journal_transaction(H5F_t * f,
*/
thing = H5C2_protect(f, dxpl_id,
entry_ptr->type, entry_ptr->addr,
- entry_ptr->size, NULL,
+ entry_ptr->size, NULL,
H5C2__NO_FLAGS_SET);
if ( thing == NULL ) {
@@ -977,7 +1049,7 @@ H5C2_journal_transaction(H5F_t * f,
result = H5C2_unprotect(f, dxpl_id,
entry_ptr->type, entry_ptr->addr,
- thing, H5C2__SIZE_CHANGED_FLAG,
+ thing, H5C2__SIZE_CHANGED_FLAG,
new_len);
if ( result < 0 ) {
@@ -1009,12 +1081,12 @@ H5C2_journal_transaction(H5F_t * f,
* the journal entry, & remove from the transaction list.
*/
if ( ( ! resized ) && ( ! renamed ) ) {
-
+
result = H5C2_jb__journal_entry(&(cache_ptr->mdj_jbrb),
cache_ptr->trans_num,
entry_ptr->addr,
entry_ptr->size,
- entry_ptr->image_ptr);
+ (uint8_t *)(entry_ptr->image_ptr));
if ( result != SUCCEED ) {
@@ -1051,7 +1123,7 @@ done:
* Purpose: Update the journal write in progress list for a change in
* the last transaction on disk.
*
- * Specifically, update the last_trans_on_disk field of
+ * Specifically, update the last_trans_on_disk field of
* *cache_ptr, and then scan the journal write in progress
* list for entries whose last_trans field is now less than
* or equal to cache_ptr->last_trans_on_disk. Remove all
@@ -1060,7 +1132,7 @@ done:
* the eviction policy data structures.
*
* Similarly, scan the pinned entry list for entries whose
- * last_trans field is now less than or equal to
+ * last_trans field is now less than or equal to
* cache_ptr->last_trans_on_disk. In this case, just set
* the last trans field to 0. Note that here we assume that
* the pinned entry list will always be small -- if this
@@ -1149,14 +1221,14 @@ done:
*
* Purpose: If the superblock extension of a newly opened HDF5 file
* indicates that journaling is in progress, the process
- * that created the file failed to close it properly, and
+ * that created the file failed to close it properly, and
* thus the file is almost certainly corrupted.
*
* The purpose of this function is to detect this condition,
- * and either throw an error telling the user to run the
- * recovery tool, or if so directed (presumably by the
- * recovery tool) simply delete the metadata journaling
- * configuration block and any reference to journaling in the
+ * and either throw an error telling the user to run the
+ * recovery tool, or if so directed (presumably by the
+ * recovery tool) simply delete the metadata journaling
+ * configuration block and any reference to journaling in the
* superblock extension.
*
* JRM -- 3/26/08
@@ -1180,7 +1252,7 @@ H5C2_check_for_journaling(H5F_t * f,
"This file was last written with metadata journaling enabled and was \n";
const char * l1 =
"not closed cleanly. To allow HDF5 to read this file, please run the \n";
- const char * l2 =
+ const char * l2 =
"journal recovery tool on this file. The journal was written \n";
const char * l3 = "to \"";
const char * l4 = "\".\n";
@@ -1215,8 +1287,8 @@ H5C2_check_for_journaling(H5F_t * f,
* we were.
*/
- result = H5C2_unmark_journaling_in_progress(f,
- dxpl_id,
+ result = H5C2_unmark_journaling_in_progress(f,
+ dxpl_id,
cache_ptr);
if ( result != SUCCEED ) {
@@ -1226,14 +1298,14 @@ H5C2_check_for_journaling(H5F_t * f,
}
} else {
- /* we have to play some games here to set up an error message
- * that contains the journal file path. In essence, what
- * follows is a somewhat modified version of the HGOTO_ERROR()
+ /* we have to play some games here to set up an error message
+ * that contains the journal file path. In essence, what
+ * follows is a somewhat modified version of the HGOTO_ERROR()
* macro.
*/
- (void)H5Epush2(H5E_DEFAULT, __FILE__, FUNC, __LINE__,
- H5E_ERR_CLS_g, H5E_CACHE, H5E_CANTJOURNAL,
- "%s%s%s%s%s%s", l0, l1, l2, l3,
+ (void)H5Epush2(H5E_DEFAULT, __FILE__, FUNC, __LINE__,
+ H5E_ERR_CLS_g, H5E_CACHE, H5E_CANTJOURNAL,
+ "%s%s%s%s%s%s", l0, l1, l2, l3,
cache_ptr->jnl_file_name, l4);
(void)H5E_dump_api_stack((int)H5_IS_API(FUNC));
HGOTO_DONE(FAIL)
@@ -1253,7 +1325,7 @@ done:
* Function: H5C2_get_journaling_in_progress()
*
* Purpose: Query the HDF5 file to see if it is marked as having
- * journaling in progress. Update the journaling
+ * journaling in progress. Update the journaling
* configuration fields in the cache structure accordingly.
*
* At least initially, the purpose of this function is
@@ -1279,8 +1351,8 @@ done:
* March 11, 2008
*
* Changes: JRM -- 2/20/09
- * Reworked to reflect the move of the journal file name
- * and magic from the journaling configuration block to
+ * Reworked to reflect the move of the journal file name
+ * and magic from the journaling configuration block to
* the metadata journaling superblock extension message.
* Note that the journaling configuration block no longer
* exists.
@@ -1310,7 +1382,7 @@ H5C2_get_journaling_in_progress(const H5F_t * f,
"journaling enabled but jnl file name empty?!?.")
}
- if ( f->shared->mdc_jnl_file_name_len >
+ if ( f->shared->mdc_jnl_file_name_len >
H5C2__MAX_JOURNAL_FILE_NAME_LEN ) {
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
@@ -1318,14 +1390,14 @@ H5C2_get_journaling_in_progress(const H5F_t * f,
}
cache_ptr->jnl_magic = f->shared->mdc_jnl_magic;
- cache_ptr->jnl_file_name_len = f->shared->mdc_jnl_file_name_len;
+ cache_ptr->jnl_file_name_len = (int32_t)f->shared->mdc_jnl_file_name_len;
HDstrncpy(cache_ptr->jnl_file_name,
f->shared->mdc_jnl_file_name,
f->shared->mdc_jnl_file_name_len + 1);
if ( ( (cache_ptr->jnl_file_name)[cache_ptr->jnl_file_name_len]
!= '\0' ) ||
- ( HDstrlen(cache_ptr->jnl_file_name) !=
+ ( HDstrlen(cache_ptr->jnl_file_name) !=
(size_t)(cache_ptr->jnl_file_name_len) ) ) {
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
@@ -1343,14 +1415,14 @@ done:
/*-------------------------------------------------------------------------
* Function: H5C2_mark_journaling_in_progress()
*
- * Purpose: Modify the HDF5 file to indicate that journaling is
- * in progress, and flush the file to disk.
+ * Purpose: Modify the HDF5 file to indicate that journaling is
+ * in progress, and flush the file to disk.
*
- * The objective here is to allow us to detect the fact
- * the file was being journaled if we crash before we
+ * The objective here is to allow us to detect the fact
+ * the file was being journaled if we crash before we
* close the file properly.
*
- * Note that the function assumes that the file is not
+ * Note that the function assumes that the file is not
* currently marked as having journaling in progress.
*
* Return: Success: SUCCEED
@@ -1403,7 +1475,7 @@ H5C2_mark_journaling_in_progress(H5F_t * f,
}
cache_ptr->jnl_magic = journal_magic;
- cache_ptr->jnl_file_name_len = HDstrlen(journal_file_name_ptr);
+ cache_ptr->jnl_file_name_len = (int32_t)HDstrlen(journal_file_name_ptr);
if ( cache_ptr->jnl_file_name_len <= 0 ) {
@@ -1422,8 +1494,8 @@ H5C2_mark_journaling_in_progress(H5F_t * f,
(size_t)(cache_ptr->jnl_file_name_len + 1));
/* now, load the journaling information into shared, and then call
- * H5F_super_write_mdj_msg() to write the metadata journaling
- * superblock extension message to file.
+ * H5F_super_write_mdj_msg() to write the metadata journaling
+ * superblock extension message to file.
*/
f->shared->mdc_jnl_enabled = TRUE;
f->shared->mdc_jnl_magic = journal_magic;
@@ -1455,12 +1527,12 @@ done:
/*-------------------------------------------------------------------------
* Function: H5C2_unmark_journaling_in_progress()
*
- * Purpose: Modify the HDF5 file to indicate that journaling is
- * not in progress, and flush the file to disk.
+ * Purpose: Modify the HDF5 file to indicate that journaling is
+ * not in progress, and flush the file to disk.
*
* The objective here is to remove the messages indicating
- * that the file is being journaled. We will typically do
- * this either on file close, or if directed to cease
+ * that the file is being journaled. We will typically do
+ * this either on file close, or if directed to cease
* journaling. Once these messages are removed, we will
* be able to open the file without triggering a "journaling
* in progress" failure.
@@ -1475,10 +1547,10 @@ done:
* March 11, 2008
*
* Changes: JRM -- 2/20/09
- * Reworked function to reflect the move of the journal
+ * Reworked function to reflect the move of the journal
* file name and magic from the metadata journaling config
- * block and into a superblock extension message. Note that
- * the metadata journaling configuration block no longer
+ * block and into a superblock extension message. Note that
+ * the metadata journaling configuration block no longer
* exists.
*
*-------------------------------------------------------------------------
@@ -1520,7 +1592,7 @@ H5C2_unmark_journaling_in_progress(H5F_t * f,
cache_ptr->jnl_file_name_len = 0;
(cache_ptr->jnl_file_name)[0] = '\0';
- /* now, mark f->shared to indicate that journaling is not in
+ /* now, mark f->shared to indicate that journaling is not in
* progress, and then call H5F_super_write_mdj_msg() to write
* the changes to disk.
*/
@@ -1568,7 +1640,7 @@ done:
*/
static herr_t
-H5C2_call_mdjsc_callbacks(H5C2_t * cache_ptr,
+H5C2_call_mdjsc_callbacks(H5C2_t * cache_ptr,
hid_t dxpl_id,
H5C2_mdj_config_t * config_ptr)
{
@@ -1587,27 +1659,27 @@ H5C2_call_mdjsc_callbacks(H5C2_t * cache_ptr,
HDassert( ( cache_ptr->mdjsc_cb_tbl_fl_head == -1 ) ||
( cache_ptr->num_mdjsc_cbs < cache_ptr->mdjsc_cb_tbl_len ) );
- if ( ( cache_ptr->num_mdjsc_cbs < 0 )
+ if ( ( cache_ptr->num_mdjsc_cbs < 0 )
||
- ( cache_ptr->num_mdjsc_cbs > cache_ptr->mdjsc_cb_tbl_len )
+ ( cache_ptr->num_mdjsc_cbs > cache_ptr->mdjsc_cb_tbl_len )
||
- ( cache_ptr->mdjsc_cb_tbl_fl_head < -1 )
+ ( cache_ptr->mdjsc_cb_tbl_fl_head < -1 )
||
- ( cache_ptr->mdjsc_cb_tbl_fl_head > cache_ptr->mdjsc_cb_tbl_len )
+ ( cache_ptr->mdjsc_cb_tbl_fl_head > cache_ptr->mdjsc_cb_tbl_len )
||
- ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use < -1 )
+ ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use < -1 )
||
- ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use >=
- cache_ptr->mdjsc_cb_tbl_len )
+ ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use >=
+ cache_ptr->mdjsc_cb_tbl_len )
||
- ( cache_ptr->mdjsc_cb_tbl_len < H5C2__MIN_MDJSC_CB_TBL_LEN )
+ ( cache_ptr->mdjsc_cb_tbl_len < H5C2__MIN_MDJSC_CB_TBL_LEN )
||
( ( cache_ptr->num_mdjsc_cbs == cache_ptr->mdjsc_cb_tbl_len )
&&
- ( ( cache_ptr->mdjsc_cb_tbl_fl_head != -1 )
+ ( ( cache_ptr->mdjsc_cb_tbl_fl_head != -1 )
||
( cache_ptr->mdjsc_cb_tbl_max_idx_in_use !=
- cache_ptr->mdjsc_cb_tbl_len - 1 )
+ cache_ptr->mdjsc_cb_tbl_len - 1 )
)
)
||
@@ -1652,7 +1724,7 @@ done:
* Function: H5C2_deregister_mdjsc_callback()
*
* Purpose: Deregister a metadata journaling status change callback,
- * shrinking the metadata journaling status callback table
+ * shrinking the metadata journaling status callback table
* as necessary.
*
* Return: Success: SUCCEED
@@ -1682,10 +1754,10 @@ H5C2_deregister_mdjsc_callback(H5C2_t * cache_ptr,
}
if ( ( cache_ptr->mdjsc_cb_tbl == NULL ) ||
- ( ( cache_ptr->num_mdjsc_cbs == cache_ptr->mdjsc_cb_tbl_len )
+ ( ( cache_ptr->num_mdjsc_cbs == cache_ptr->mdjsc_cb_tbl_len )
&&
( cache_ptr->mdjsc_cb_tbl_fl_head != -1 ) ) ||
- ( ( cache_ptr->mdjsc_cb_tbl_fl_head < 0 )
+ ( ( cache_ptr->mdjsc_cb_tbl_fl_head < 0 )
&&
( cache_ptr->num_mdjsc_cbs != cache_ptr->mdjsc_cb_tbl_len ) ) ||
( cache_ptr->mdjsc_cb_tbl_len < H5C2__MIN_MDJSC_CB_TBL_LEN ) ||
@@ -1694,7 +1766,7 @@ H5C2_deregister_mdjsc_callback(H5C2_t * cache_ptr,
( cache_ptr->num_mdjsc_cbs < 0 ) ||
( ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use < 0 ) &&
( cache_ptr->num_mdjsc_cbs > 0 ) ) ) {
-
+
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "mdjsc_cb_tbl corrupt(1)?!?!");
}
@@ -1710,19 +1782,19 @@ H5C2_deregister_mdjsc_callback(H5C2_t * cache_ptr,
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad idx?!?");
} else if ( ((cache_ptr->mdjsc_cb_tbl)[idx]).fcn_ptr == NULL ) {
-
+
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"callback already deregistered");
-
+
} else if ( ((cache_ptr->mdjsc_cb_tbl)[idx]).fl_next != -1 ) {
-
+
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "free list corrupted.");
}
((cache_ptr->mdjsc_cb_tbl)[idx]).fcn_ptr = NULL;
((cache_ptr->mdjsc_cb_tbl)[idx]).data_ptr = NULL;
- ((cache_ptr->mdjsc_cb_tbl)[idx]).fl_next =
+ ((cache_ptr->mdjsc_cb_tbl)[idx]).fl_next =
cache_ptr->mdjsc_cb_tbl_fl_head;
cache_ptr->mdjsc_cb_tbl_fl_head = idx;
(cache_ptr->num_mdjsc_cbs)--;
@@ -1752,19 +1824,19 @@ H5C2_deregister_mdjsc_callback(H5C2_t * cache_ptr,
if ( ( cache_ptr->num_mdjsc_cbs >= cache_ptr->mdjsc_cb_tbl_len )
||
- ( ( cache_ptr->num_mdjsc_cbs < cache_ptr->mdjsc_cb_tbl_len )
+ ( ( cache_ptr->num_mdjsc_cbs < cache_ptr->mdjsc_cb_tbl_len )
&&
- ( cache_ptr->num_mdjsc_cbs > 0 )
+ ( cache_ptr->num_mdjsc_cbs > 0 )
&&
- ( ( cache_ptr->mdjsc_cb_tbl_fl_head < 0 )
+ ( ( cache_ptr->mdjsc_cb_tbl_fl_head < 0 )
||
( cache_ptr->mdjsc_cb_tbl_fl_head >= cache_ptr->mdjsc_cb_tbl_len )
- )
- )
+ )
+ )
||
- ( ( cache_ptr->num_mdjsc_cbs == 0 )
+ ( ( cache_ptr->num_mdjsc_cbs == 0 )
&&
- ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use != -1 )
+ ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use != -1 )
)
) {
@@ -1776,7 +1848,7 @@ H5C2_deregister_mdjsc_callback(H5C2_t * cache_ptr,
if ( ( fraction_in_use < H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) &&
( cache_ptr->mdjsc_cb_tbl_len > H5C2__MIN_MDJSC_CB_TBL_LEN ) &&
- ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use <
+ ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use <
(cache_ptr->mdjsc_cb_tbl_len / 2) ) ) {
herr_t result;
@@ -1833,7 +1905,7 @@ H5C2_grow_mdjsc_callback_table(H5C2_t * cache_ptr)
if ( ( cache_ptr->num_mdjsc_cbs != cache_ptr->mdjsc_cb_tbl_len ) ||
( cache_ptr->mdjsc_cb_tbl_fl_head != -1 ) ||
- ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use !=
+ ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use !=
cache_ptr->mdjsc_cb_tbl_len - 1 ) ) {
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
@@ -1844,8 +1916,8 @@ H5C2_grow_mdjsc_callback_table(H5C2_t * cache_ptr)
old_mdjsc_cb_tbl_len = cache_ptr->mdjsc_cb_tbl_len;
new_mdjsc_cb_tbl_len = 2 * old_mdjsc_cb_tbl_len;
- new_mdjsc_cb_tbl = H5MM_malloc((size_t)new_mdjsc_cb_tbl_len *
- sizeof(H5C2_mdjsc_record_t));
+ new_mdjsc_cb_tbl = (H5C2_mdjsc_record_t *)
+ H5MM_malloc((size_t)new_mdjsc_cb_tbl_len * sizeof(H5C2_mdjsc_record_t));
if ( new_mdjsc_cb_tbl == NULL ) {
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
@@ -1869,7 +1941,7 @@ H5C2_grow_mdjsc_callback_table(H5C2_t * cache_ptr)
cache_ptr->mdjsc_cb_tbl_len = new_mdjsc_cb_tbl_len;
cache_ptr->mdjsc_cb_tbl_fl_head = old_mdjsc_cb_tbl_len;
- old_mdjsc_cb_tbl = H5MM_xfree(old_mdjsc_cb_tbl);
+ old_mdjsc_cb_tbl = (H5C2_mdjsc_record_t *)H5MM_xfree(old_mdjsc_cb_tbl);
if ( old_mdjsc_cb_tbl != NULL ) {
@@ -1889,7 +1961,7 @@ done:
* Function: H5C2_register_mdjsc_callback()
*
* Purpose: Register a metadata journaling status change callback,
- * growing the metadata journaling status callback table
+ * growing the metadata journaling status callback table
* as necessary.
*
* Return: Success: SUCCEED
@@ -1972,18 +2044,18 @@ H5C2_register_mdjsc_callback(H5C2_t * cache_ptr,
(cache_ptr->num_mdjsc_cbs)++;
if ( ( ( cache_ptr->num_mdjsc_cbs == cache_ptr->mdjsc_cb_tbl_len ) &&
- ( cache_ptr->mdjsc_cb_tbl_fl_head != -1 )
- )
+ ( cache_ptr->mdjsc_cb_tbl_fl_head != -1 )
+ )
||
- ( cache_ptr->num_mdjsc_cbs > cache_ptr->mdjsc_cb_tbl_len )
+ ( cache_ptr->num_mdjsc_cbs > cache_ptr->mdjsc_cb_tbl_len )
||
- ( ( cache_ptr->num_mdjsc_cbs < cache_ptr->mdjsc_cb_tbl_len )
+ ( ( cache_ptr->num_mdjsc_cbs < cache_ptr->mdjsc_cb_tbl_len )
&&
- ( ( cache_ptr->mdjsc_cb_tbl_fl_head < 0 )
+ ( ( cache_ptr->mdjsc_cb_tbl_fl_head < 0 )
||
( cache_ptr->mdjsc_cb_tbl_fl_head >= cache_ptr->mdjsc_cb_tbl_len )
- )
- )
+ )
+ )
) {
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "mdjsc_cb_tbl corrupt(2)?!?!");
@@ -2060,7 +2132,7 @@ H5C2_shrink_mdjsc_callback_table(H5C2_t * cache_ptr)
if ( ( cache_ptr->num_mdjsc_cbs >= cache_ptr->mdjsc_cb_tbl_len ) ||
( (cache_ptr->mdjsc_cb_tbl_len / 2) < H5C2__MIN_MDJSC_CB_TBL_LEN ) ||
( cache_ptr->mdjsc_cb_tbl_fl_head == -1 ) ||
- ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use >=
+ ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use >=
cache_ptr->mdjsc_cb_tbl_len / 2 ) ||
( fraction_in_use >= H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) ) {
@@ -2074,10 +2146,10 @@ H5C2_shrink_mdjsc_callback_table(H5C2_t * cache_ptr)
new_mdjsc_cb_tbl_len = old_mdjsc_cb_tbl_len / 2;
while ( ( (new_mdjsc_cb_tbl_len / 2) >= H5C2__MIN_MDJSC_CB_TBL_LEN ) &&
- ( (((double)(cache_ptr->num_mdjsc_cbs)) /
- ((double)new_mdjsc_cb_tbl_len)) <=
+ ( (((double)(cache_ptr->num_mdjsc_cbs)) /
+ ((double)new_mdjsc_cb_tbl_len)) <=
H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) &&
- ( (new_mdjsc_cb_tbl_len / 2) >
+ ( (new_mdjsc_cb_tbl_len / 2) >
cache_ptr->mdjsc_cb_tbl_max_idx_in_use ) )
{
new_mdjsc_cb_tbl_len /= 2;
@@ -2090,8 +2162,8 @@ H5C2_shrink_mdjsc_callback_table(H5C2_t * cache_ptr)
"error in computation of new_mdjsc_cb_tbl_len?!?!");
}
- new_mdjsc_cb_tbl = H5MM_malloc(new_mdjsc_cb_tbl_len *
- sizeof(H5C2_mdjsc_record_t));
+ new_mdjsc_cb_tbl = (H5C2_mdjsc_record_t *)
+ H5MM_malloc((size_t)new_mdjsc_cb_tbl_len * sizeof(H5C2_mdjsc_record_t));
if ( new_mdjsc_cb_tbl == NULL ) {
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
@@ -2107,7 +2179,7 @@ H5C2_shrink_mdjsc_callback_table(H5C2_t * cache_ptr)
new_mdjsc_cb_tbl[i].fcn_ptr = NULL;
new_mdjsc_cb_tbl[i].data_ptr = NULL;
new_mdjsc_cb_tbl[i].fl_next = -1;
-
+
if ( new_fl_head == -1 ) {
new_fl_head = i;
@@ -2135,7 +2207,7 @@ H5C2_shrink_mdjsc_callback_table(H5C2_t * cache_ptr)
cache_ptr->mdjsc_cb_tbl_fl_head = new_fl_head;
cache_ptr->mdjsc_cb_tbl_len = new_mdjsc_cb_tbl_len;
- old_mdjsc_cb_tbl = H5MM_xfree(old_mdjsc_cb_tbl);
+ old_mdjsc_cb_tbl = ( H5C2_mdjsc_record_t *)H5MM_xfree(old_mdjsc_cb_tbl);
if ( old_mdjsc_cb_tbl != NULL ) {
@@ -2155,12 +2227,16 @@ done:
/**************************************************************************/
/* The following macros are wrappers for the low level binary journal file
- * functions. They exist, as it is likely that these function will be
- * converted into macros once we have asynchronous journal file writes
- * running, and by setting up these wrappers now, we will make this
+ * functions. They exist, as it is likely that these function will be
+ * converted into macros once we have asynchronous journal file writes
+ * running, and by setting up these wrappers now, we will make this
* conversion easier.
*/
+#if 1 /* JRM */
+ /* remove print statements from these macros. -- JRM */
+#endif /* JRM */
+
#define H5C2_JB_BJF__WRITE_BUFFER(struct_ptr, \
buf_size, \
buf_ptr, \
@@ -2232,11 +2308,2610 @@ if ( H5C2_jb_bjf__write_trans_num((struct_ptr), (is_end_trans), \
/******************************************************************************
*
+ * Function: H5C2_jb_aio__await_buffer_write_completion()
+ *
+ * Programmer: John Mainzer
+ *
+ * Purpose: Await completion of the asynchronous write of the
+ * specified buffer.
+ *
+ * Verify that AIO is enabled, that the specified
+ * buffer exists and has been queued for an asynchronous
+ * write which has not been logged as complete.
+ *
+ * Test to see if the write has completed -- if it has
+ * not, await its completion.
+ *
+ * Then mark the write as complete and return.
+ *
+ * Returns: SUCCEED on success.
+ *
+ ******************************************************************************/
+
+static herr_t
+H5C2_jb_aio__await_buffer_write_completion(H5C2_jbrb_t * struct_ptr,
+ int buf_num)
+{
+ int result;
+ herr_t ret_value = SUCCEED;
+ struct aiocb * aiocb_ptr = NULL;
+ const struct aiocb * aiocb_list[1] = { NULL };
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__await_buffer_write_completion, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio );
+ HDassert( struct_ptr->aio_ctl_blks != NULL );
+ HDassert( buf_num >= 0 );
+ HDassert( buf_num < struct_ptr->num_bufs );
+
+ aiocb_ptr = &((*(struct_ptr->aio_ctl_blks))[buf_num]);
+
+ if ( aiocb_ptr->aio_fildes != struct_ptr->journal_file_fd ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "unexpected file descriptor in target buffer aio ctl blk")
+ }
+
+ /* wait until the request completes */
+ aiocb_list[0] = aiocb_ptr;
+ result = aio_suspend(aiocb_list, 1, NULL);
+
+ if ( result != 0 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
+ "call to aio_suspend() failed.")
+ }
+#if 0 /* JRM */
+ /* check to see if there were any errors */
+ result = aio_error(aiocb_ptr);
+ if ( result != 0 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
+ "aio_error() reports something other than success.")
+ }
+#else /* JRM */
+ /* verify that aio_error() returns something other than EINPROGRESS */
+ result = aio_error(aiocb_ptr);
+
+ if ( result != 0 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
+ "aio_error() reports error after aio_suspend() returns")
+ }
+
+ /* call aio_return() to complete the write */
+ result = aio_return(aiocb_ptr);
+ if ( result == -1 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
+ "aio_error() reports something other than success.")
+
+ }
+ /* TODO: Verify the number of bytes written? */
+#endif /* JRM */
+
+ H5C2__JBRB__UPDATE_STATS_FOR_BUF_WRITE_COMPLETE(struct_ptr, TRUE)
+
+ /* mark the aio control block to indicate no write in progress */
+ aiocb_ptr->aio_fildes = -1;
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__await_buffer_write_completion() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__await_async_fsync_completion()
+ *
+ * Programmer: John Mainzer
+ *
+ * Purpose: Verify that AIO is enabled, taht struct_ptr->
+ * use_aio_fsync is TRUE, and that the sync queue
+ * is not empty.
+ *
+ * Then await completion of the asynchronous fsync
+ * at the head of the sync queue, update struct_ptr->
+ * last_trans_on_disk, remove and discard the instance
+ * of H5C2_jbrb_sync_q_entry_t at the head of the sync
+ * queue, and return.
+ *
+ * JRM -- 2/10/10
+ *
+ * Returns: SUCCEED on success.
+ * FAIL otherwise.
+ *
+ ******************************************************************************/
+
+#define H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG 0
+
+#if 1
+static herr_t
+H5C2_jb_aio__await_async_fsync_completion(H5C2_jbrb_t * struct_ptr)
+{
+ int result;
+ herr_t ret_value = SUCCEED;
+ struct H5C2_jbrb_sync_q_entry_t * head_ptr = NULL;
+ struct aiocb * aiocb_ptr = NULL;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__await_async_fsync_completion, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio );
+ HDassert( struct_ptr->use_aio_fsync );
+ HDassert( struct_ptr->aio_sync_q_len > 0 );
+
+ head_ptr = struct_ptr->aio_sync_q_head;
+
+ HDassert( head_ptr != NULL );
+ HDassert( head_ptr->magic == H5C2__H5C2_JBRB_SYNC_Q_T_MAGIC );
+
+ aiocb_ptr = &(head_ptr->ctl_blk);
+
+ if ( aiocb_ptr->aio_fildes != struct_ptr->journal_file_fd ) {
+
+#if H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG
+ HDfprintf(stdout, "%s: bad fd in ctl blk?!?\n", FUNC);
+#endif /* H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "bad fd in ctl blk?!?")
+ }
+
+ /* can't use aio_suspend() with an aiocb from a call to aio_fsync()
+ * hence loop until aio_error() returns either 0 or something other
+ * than EINPROGRESS.
+ */
+ do
+ {
+ result = aio_error(aiocb_ptr);
+
+ if ( ( result != 0 ) && ( result != EINPROGRESS ) ) {
+
+#if H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG
+ HDfprintf(stdout, "%s: call to aio_error() reports error.\n", FUNC);
+ HDfprintf(stdout, "%s: errno = %d (%s).\n", FUNC, errno,
+ strerror(errno));
+#endif /* H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */
+
+ HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, \
+ "aio_error() reports error.")
+ }
+
+ H5C2__JBRB__UPDATE_STATS_FOR_AIO_ERROR_CALL_AWAITING_SYNC(struct_ptr)
+
+ } while ( result != 0 );
+
+ /* call aio_return() to complete the aio_fsync() */
+ result = aio_return(aiocb_ptr);
+
+ if ( result == -1 ) {
+
+#if H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG
+ HDfprintf(stdout,
+ "%s: aio_return() reports something other than success.\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */
+
+ HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, \
+ "aio_return() reports something other than success.")
+
+ }
+
+ /* the aio_fsync() completed successfully -- update last trans on disk,
+ * and discard the head of the sync queue.
+ */
+
+ HDassert( struct_ptr->last_trans_on_disk <= head_ptr->last_trans_in_sync );
+ HDassert( head_ptr->last_trans_in_sync <= struct_ptr->last_trans_written );
+
+#if H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG
+ HDfprintf(stdout, "%s: changing last trans on disk from %lld to %lld.\n",
+ FUNC, struct_ptr->last_trans_on_disk,
+ head_ptr->last_trans_in_sync);
+#endif /* H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */
+
+ H5C2__JBRB__UPDATE_STATS_FOR_ASYNC_SYNC_COMPLETED(struct_ptr, TRUE)
+
+ struct_ptr->last_trans_on_disk = head_ptr->last_trans_in_sync;
+ aiocb_ptr->aio_fildes = -1;
+
+ if ( H5C2_jb_aio__sync_q__discard_head(struct_ptr) != SUCCEED ) {
+
+#if H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG
+ HDfprintf(stdout,
+ "%s: H5C2_jb_aio__sync_q__discard_head() failed.\n", FUNC);
+#endif /* H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__sync_q__discard_head() failed.")
+ }
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__await_async_fsync_completion() */
+#else
+static herr_t
+H5C2_jb_aio__await_async_fsync_completion(H5C2_jbrb_t * struct_ptr)
+{
+ int result;
+ herr_t ret_value = SUCCEED;
+ struct H5C2_jbrb_sync_q_entry_t * head_ptr = NULL;
+ struct aiocb * aiocb_ptr = NULL;
+ const struct aiocb * aiocb_list[1] = { NULL };
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__await_async_fsync_completion, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio );
+ HDassert( struct_ptr->use_aio_fsync );
+ HDassert( struct_ptr->aio_sync_q_len > 0 );
+
+ head_ptr = struct_ptr->aio_sync_q_head;
+
+ HDassert( head_ptr != NULL );
+ HDassert( head_ptr->magic == H5C2__H5C2_JBRB_SYNC_Q_T_MAGIC );
+
+ aiocb_ptr = &(head_ptr->ctl_blk);
+
+ if ( aiocb_ptr->aio_fildes != struct_ptr->journal_file_fd ) {
+
+#if H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG
+ HDfprintf(stdout, "%s: bad fd in ctl blk?!?\n", FUNC);
+#endif /* H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "bad fd in ctl blk?!?")
+ }
+
+ /* wait until the fsync request completes */
+ aiocb_list[0] = aiocb_ptr;
+ result = aio_suspend(aiocb_list, 1, NULL);
+
+ if ( result != 0 ) {
+
+#if H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG
+ HDfprintf(stdout, "%s: call to aio_suspend() failed.\n", FUNC);
+ HDfprintf(stdout, "%s: errno = %d (%s).\n", FUNC, errno,
+ strerror(errno));
+#endif /* H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */
+
+ HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, \
+ "call to aio_suspend() failed.")
+ }
+
+ /* verify that aio_error() returns good status */
+ result = aio_error(aiocb_ptr);
+
+ if ( result != 0 ) {
+
+#if H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG
+ HDfprintf(stdout,
+ "%s: aio_error() reports error after aio_suspend() returns.\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */
+
+ HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, \
+ "aio_error() reports error after aio_suspend() returns")
+ }
+
+ /* call aio_return() to complete the aio_fsync() */
+ result = aio_return(aiocb_ptr);
+ if ( result == -1 ) {
+
+#if H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG
+ HDfprintf(stdout,
+ "%s: aio_return() reports something other than success.\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */
+
+ HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, \
+ "aio_return() reports something other than success.")
+
+ }
+
+ /* the aio_fsync() completed successfully -- update last trans on disk,
+ * and discard the head of the sync queue.
+ */
+
+ HDassert( struct_ptr->last_trans_on_disk <= head_ptr->last_trans_in_sync );
+ HDassert( head_ptr->last_trans_in_sync <= struct_ptr->last_trans_written );
+
+#if H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG
+ HDfprintf(stdout, "%s: changing last trans on disk from %lld to %lld.\n",
+ FUNC, struct_ptr->last_trans_on_disk,
+ head_ptr->last_trans_in_sync);
+#endif /* H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */
+
+ struct_ptr->last_trans_on_disk = head_ptr->last_trans_in_sync;
+ aiocb_ptr->aio_fildes = -1;
+
+ if ( H5C2_jb_aio__sync_q__discard_head(struct_ptr) != SUCCEED ) {
+
+#if H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG
+ HDfprintf(stdout,
+ "%s: H5C2_jb_aio__sync_q__discard_head() failed.\n", FUNC);
+#endif /* H5C2_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__sync_q__discard_head() failed.")
+ }
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__await_async_fsync_completion() */
+#endif
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__await_completion_of_all_async_fsyncs
+ *
+ * Programmer: John Mainzer
+ * 2/10/10
+ *
+ * Purpose: Verify that AIO is enabled, and that struct_ptr->
+ * use_aio_fsync is TRUE.
+ *
+ * Then await completion of all asynchronous fsyncs
+ * currently in progress -- if any. As each fsync
+ * completes, update struct_ptr->last_trans_on_disk,
+ * and discard the head of the sync queue.
+ *
+ * Returns: SUCCEED on success.
+ * FAIL otherwise.
+ *
+ ******************************************************************************/
+
+#define H5C2_JB_AIO__AWAIT_COMPLETION_OF_ALL_ASYNC_FSYNCS__DEBUG 0
+
+herr_t
+H5C2_jb_aio__await_completion_of_all_async_fsyncs(H5C2_jbrb_t * struct_ptr)
+{
+ herr_t result;
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__await_completion_of_all_async_fsyncs, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio );
+ HDassert( struct_ptr->use_aio_fsync );
+
+#if H5C2_JB_AIO__AWAIT_COMPLETION_OF_ALL_ASYNC_FSYNCS__DEBUG
+ HDfprintf(stdout, "%s: entering -- aio_sync_q_len = %d.\n",
+ FUNC, (int)(struct_ptr->aio_sync_q_len));
+#endif /* H5C2_JB_AIO__AWAIT_COMPLETION_OF_ALL_ASYNC_FSYNCS__DEBUG */
+
+ while ( struct_ptr->aio_sync_q_len > 0 ) {
+
+ result = H5C2_jb_aio__await_async_fsync_completion(struct_ptr);
+
+ if ( result != SUCCEED ) {
+
+#if H5C2_JB_AIO__AWAIT_COMPLETION_OF_ALL_ASYNC_FSYNCS__DEBUG
+ HDfprintf(stdout,
+ "H5C2_jb_aio__await_async_fsync_completion() failed.\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__AWAIT_COMPLETION_OF_ALL_ASYNC_FSYNCS__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__await_async_fsync_completion() failed.")
+ }
+ } /* while */
+
+ HDassert( struct_ptr->aio_sync_q_len == 0 );
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__await_completion_of_all_async_fsyncs() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__await_completion_of_all_pending_writes
+ *
+ * Programmer: John Mainzer
+ * 1/12/10
+ *
+ * Purpose: Await completion of all asynchronous writes currently
+ * in progress -- if any. As each write completes, mark
+ * the associated buffer as free by updating
+ * struct_ptr->get and decrementing
+ * struct_ptr->bufs_in_use.
+ *
+ * Note that the buffer indicated by struct_ptr->put
+ * may or may not be involved in a write when this
+ * function is called. Infer whether it is via the
+ * aio contol blocks array.
+ *
+ * Returns: SUCCEED on success.
+ *
+ ******************************************************************************/
+
+#define H5C2_JB_AIO__AWAIT_COMPLETION_OF_ALL_PENDING_WRITES__DEBUG 0
+
+herr_t
+H5C2_jb_aio__await_completion_of_all_pending_writes(H5C2_jbrb_t * struct_ptr)
+{
+ hbool_t done = FALSE;
+ int result;
+ herr_t ret_value = SUCCEED;
+ struct aiocb * aiocb_ptr = NULL;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__await_completion_of_all_pending_writes, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio );
+
+ if ( struct_ptr->bufs_in_use <= 0 ) {
+
+ done = TRUE;
+ }
+
+ while ( ! done ) {
+
+ aiocb_ptr = &((*(struct_ptr->aio_ctl_blks))[struct_ptr->get]);
+
+ if ( aiocb_ptr->aio_fildes != -1 ) {
+
+ result = H5C2_jb_aio__await_buffer_write_completion(struct_ptr,
+ struct_ptr->get);
+
+ if ( result != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__await_buffer_write_completion() failed.");
+ }
+
+ /* Update the last transaction written, and then set the
+ * transaction tracking array entry of the buffer whose
+ * write just completed to zero.
+ */
+ HDassert( struct_ptr->last_trans_written <=
+ (*struct_ptr->trans_tracking)[struct_ptr->get] );
+
+ struct_ptr->last_trans_written = (uint64_t)
+ (*struct_ptr->trans_tracking)[struct_ptr->get];
+
+ (*struct_ptr->trans_tracking)[struct_ptr->get] = 0;
+
+#if H5C2_JB_AIO__AWAIT_COMPLETION_OF_ALL_PENDING_WRITES__DEBUG
+ HDfprintf(stdout,
+ "%s: last_trans_written = %lld, get/put = %d/%d\n",
+ FUNC, (long long)(struct_ptr->last_trans_written),
+ struct_ptr->get, struct_ptr->put);
+#endif /* H5C2_JB_AIO__AWAIT_COMPLETION_OF_ALL_PENDING_WRITES__DEBUG */
+
+ /* decrement writes in progress */
+ struct_ptr->writes_in_progress--;
+
+ /* decrement bufs in use */
+ struct_ptr->bufs_in_use--;
+
+ HDassert(
+ ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use ) ||
+ ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use - 1 ) );
+
+ /* Update get to reference the next entry in the ring buffer
+ * if get and put are not the same.
+ *
+ * If they are the same, verify that bufs_in_use and
+ * writes_in_progress are both zero, and then set done to TRUE
+ */
+ if ( struct_ptr->get != struct_ptr->put ) {
+
+ struct_ptr->get =
+ (struct_ptr->get + 1) % (struct_ptr->num_bufs);
+
+ } else {
+
+ HDassert( struct_ptr->bufs_in_use == 0 );
+ HDassert( struct_ptr->writes_in_progress == 0 );
+
+ done = TRUE;
+
+ }
+ } else {
+
+ HDassert( struct_ptr->get == struct_ptr->put );
+
+ done = TRUE;
+ }
+ } /* while */
+
+ HDassert( struct_ptr->bufs_in_use <= 1 );
+
+ HDassert( struct_ptr->writes_in_progress == 0 );
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__await_completion_of_all_pending_writes() */
+
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__flush
+ *
+ * Programmer: John Mainzer
+ * 1/11/10
+ *
+ * Purpose: Verify that there is no transaction in progress and
+ * that aio is enabled.
+ *
+ * Test to see if the current buffer (indicated by
+ * struct_ptr->put) is dirty. If it is, queue a write
+ * of the current buffer.
+ *
+ * Await completion of all outstanding writes.
+ *
+ * Sync the file.
+ *
+ * Update struct_ptr->last_trans_on_disk.
+ *
+ * Returns: SUCCEED on success.
+ *
+ ******************************************************************************/
+
+#define H5C2_JB_AIO__FLUSH__DEBUG 0
+
+static herr_t
+H5C2_jb_aio__flush(H5C2_jbrb_t * struct_ptr)
+{
+ hbool_t cur_buf_was_dirty = FALSE;
+ herr_t result;
+ herr_t ret_value = SUCCEED;
+ uint64_t last_trans_in_ring_buffer;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__flush, FAIL)
+
+ /* Check Arguments and status */
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio );
+ HDassert( struct_ptr->trans_in_prog == FALSE );
+ HDassert( ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use < struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress + 1 == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->cur_buf_free_space < struct_ptr->buf_size )
+ &&
+ ( struct_ptr->cur_buf_free_space > 0 )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use == struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == 0 )
+ )
+ );
+
+
+ /* make note of the last transaction in the ring buffer */
+ last_trans_in_ring_buffer = (*struct_ptr->trans_tracking)[struct_ptr->put];
+
+#if H5C2_JB_AIO__FLUSH__DEBUG
+ HDfprintf(stdout, "%s: trans_tracking[%d] = %lld\n", FUNC, struct_ptr->get,
+ (*struct_ptr->trans_tracking)[struct_ptr->get]);
+ HDfprintf(stdout, "%s: trans_tracking[%d] = %lld\n", FUNC, struct_ptr->put,
+ (*struct_ptr->trans_tracking)[struct_ptr->put]);
+#endif /* H5C2_JB_AIO__FLUSH__DEBUG */
+
+ /* if the current buffer (indicated by struct_ptr->put) is dirty,
+ * but not full, queue a write of the buffer. The dirty part should
+ * be obvious. The not full part is required, as
+ * H5C2_jb_aio__write_to_buffer() will have already queued the write
+ * if the buffer is full.
+ *
+ * In passing, make note of whether the current buffer is dirty --
+ * need to know this so we can setup the buffer properly after
+ * the flush.
+ */
+ if ( struct_ptr->cur_buf_free_space < struct_ptr->buf_size ) {
+
+ cur_buf_was_dirty = TRUE;
+
+ if ( struct_ptr->cur_buf_free_space > 0 ) {
+
+ /* kick off an asynchronous write of the current buffer */
+ result = H5C2_jb_aio__queue_buffer_write(struct_ptr,
+ struct_ptr->put,
+ TRUE);
+
+ if ( result != SUCCEED ) {
+
+#if H5C2_JB_AIO__FLUSH__DEBUG
+ HDfprintf(stdout,
+ "%s: H5C2_jb_aio__queue_buffer_write() failed.\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__FLUSH__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__queue_buffer_write() failed.");
+ }
+ }
+ }
+
+ /* await completion of all outstanding writes */
+
+ result = H5C2_jb_aio__await_completion_of_all_pending_writes(struct_ptr);
+
+ if ( result != SUCCEED ) {
+
+#if H5C2_JB_AIO__FLUSH__DEBUG
+ HDfprintf(stdout,
+ "%s: H5C2_jb_aio__await_completion_of_all_pending_writes() failed.\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__FLUSH__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__await_completion_of_all_pending_writes() failed.");
+ }
+
+ HDassert( struct_ptr->bufs_in_use == 0 );
+ HDassert( struct_ptr->writes_in_progress == 0 );
+ HDassert( struct_ptr->put == struct_ptr->get );
+
+ /* sync out the file */
+
+ result = H5C2_jb_aio__sync_file(struct_ptr);
+
+ if ( result != SUCCEED ) {
+
+#if H5C2_JB_AIO__FLUSH__DEBUG
+ HDfprintf(stdout,
+ "%s: H5C2_jb_aio__sync_file() failed.\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__FLUSH__DEBUG */
+
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__sync_file() failed.");
+ }
+
+ /* If the current buffer was dirty on entry, it was flushed and must
+ * be prepared for use.
+ *
+ * Don't call H5C2_jb_aio__prep_next_buf_for_use() for this, as
+ * it assumes that the current buffer is full and dirty -- neither
+ * of which is the case at present.
+ *
+ * further, H5C2_jb_aio__prep_next_buf_for_use() will also
+ * increment put, which will cause problems if we don't increment
+ * get as well.
+ */
+ if ( cur_buf_was_dirty ) {
+
+ /* the following assignment is redundant if struct_ptr->use_aio_fsync
+ * is TRUE, as struct_ptr->last_trans_on_disk will already be
+ * set correctly. Verify this with an assert.
+ */
+#if 1 /* JRM */
+ if ( ( struct_ptr->use_aio_fsync ) &&
+ ( struct_ptr->last_trans_on_disk != last_trans_in_ring_buffer ) ) {
+
+ HDfprintf(stdout, "%s: ltod = %lld, ltirb = %lld\n",
+ FUNC, struct_ptr->last_trans_on_disk,
+ last_trans_in_ring_buffer);
+ }
+#endif /* JRM */
+ HDassert( ( ! struct_ptr->use_aio_fsync ) ||
+ ( struct_ptr->last_trans_on_disk ==
+ last_trans_in_ring_buffer ) );
+ struct_ptr->last_trans_on_disk = last_trans_in_ring_buffer;
+
+ /* set the cur_buf_free_space */
+ struct_ptr->cur_buf_free_space = struct_ptr->buf_size;
+
+ /* set the head pointer to point to the beginning of the
+ * current buffer
+ */
+ struct_ptr->head = (*struct_ptr->buf)[struct_ptr->put];
+
+ /* load the transaction tracking array for the current buffer with the
+ * id of the last transaction fully written to the ring buffer.
+ */
+ HDassert( (*struct_ptr->trans_tracking)[struct_ptr->put] == 0 );
+
+ (*struct_ptr->trans_tracking)[struct_ptr->put] =
+ last_trans_in_ring_buffer;
+
+ } else {
+
+ HDassert( struct_ptr->cur_buf_free_space == struct_ptr->buf_size );
+ HDassert( struct_ptr->head == (*struct_ptr->buf)[struct_ptr->put] );
+ }
+
+ HDassert( struct_ptr->bufs_in_use == 0 );
+ HDassert( struct_ptr->writes_in_progress == 0 );
+ HDassert( struct_ptr->put == struct_ptr->get );
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__flush() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__get_last_transaction_on_disk
+ *
+ * Programmer: John Mainzer
+ * 1/19/10
+ *
+ * Purpose: Determine the last transaction fully on disk,
+ * and place its transaction number in *trans_num_ptr.
+ * If no transaction has made it to disk, load zero
+ * into *trans_num_ptr.
+ *
+ * If aio_fsync() is not available, stall pending
+ * completion of all writes in progress, and then
+ * sync the file out using fsync().
+ *
+ * If aio_fsync() is available, note any asynchronous
+ * syncs that have completed since the last check.
+ * This will update struct_ptr->last_trans_on_disk
+ * as appropriate.
+ *
+ * In either case, return the ID of the last
+ * transaction known to be on disk.
+ *
+ * Returns: SUCCEED on success.
+ *
+ ******************************************************************************/
+
+static herr_t
+H5C2_jb_aio__get_last_transaction_on_disk(H5C2_jbrb_t * struct_ptr,
+ uint64_t * trans_num_ptr)
+{
+ hbool_t ring_buffer_was_full = FALSE;
+ herr_t result;
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__get_last_transaction_on_disk, FAIL)
+
+ /* Check Arguments */
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio );
+ HDassert( trans_num_ptr != NULL );
+ HDassert( ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use < struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress + 1 == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->cur_buf_free_space < struct_ptr->buf_size )
+ &&
+ ( struct_ptr->cur_buf_free_space > 0 )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use == struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == 0 )
+ )
+ );
+
+ if ( struct_ptr->use_aio_fsync ) {
+
+ result = H5C2_jb_aio__note_completed_async_buffer_writes(struct_ptr);
+
+ if ( result != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__note_completed_async_buffer_writes() failed.")
+ }
+
+ result = H5C2_jb_aio__note_completed_async_fsyncs(struct_ptr);
+
+ if ( result != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__note_completed_async_fsyncs() failed.")
+ }
+ } else {
+
+ /* aio_fsync() is not available */
+
+ if ( struct_ptr->writes_in_progress == struct_ptr->num_bufs ) {
+
+ ring_buffer_was_full = TRUE;
+ }
+
+ /* await completion of all outstanding writes */
+
+ result =
+ H5C2_jb_aio__await_completion_of_all_pending_writes(struct_ptr);
+
+ if ( result != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__await_completion_of_all_pending_writes() failed.");
+ }
+
+ HDassert( struct_ptr->bufs_in_use <= 1 );
+ HDassert( ( struct_ptr->get == struct_ptr->put ) ||
+ ( ((struct_ptr->get + 1) % struct_ptr->num_bufs) ==
+ struct_ptr->put ) );
+
+ /* sync out the file */
+
+ result = H5C2_jb_aio__sync_file(struct_ptr);
+
+ if ( result != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__sync_file() failed.");
+ }
+
+
+ /* update last transaction on disk */
+
+ struct_ptr->last_trans_on_disk = struct_ptr->last_trans_written;
+
+
+ /* if the ring buffer was full, put was not advanced to the next
+ * buffer in the ring buffer, nor were the associated fields updated
+ * to refer to the next buffer.
+ *
+ * In this case, we must prepare the next buffer for use.
+ *
+ * Don't call H5C2_jb_aio__prep_next_buf_for_use() for this, as
+ * it assumes that the current buffer is full and dirty -- neither
+ * of which is the case at present.
+ *
+ * further, H5C2_jb_aio__prep_next_buf_for_use() will also
+ * increment put, which will cause problems if we don't increment
+ * get as well.
+ */
+ if ( ring_buffer_was_full ) {
+
+ HDassert( struct_ptr->bufs_in_use == 0 );
+ HDassert( struct_ptr->get == struct_ptr->put );
+
+ /* set the cur_buf_free_space */
+ struct_ptr->cur_buf_free_space = struct_ptr->buf_size;
+
+ /* set the head pointer to point to the beginning of the
+ * current buffer
+ */
+ struct_ptr->head = (*struct_ptr->buf)[struct_ptr->put];
+
+ /* load the transaction tracking array for the current buffer
+ * with the id of the last transaction fully written to the
+ * ring buffer.
+ */
+ HDassert( (*struct_ptr->trans_tracking)[struct_ptr->put] == 0 );
+
+ (*struct_ptr->trans_tracking)[struct_ptr->put] =
+ struct_ptr->last_trans_written;
+
+ }
+ }
+
+ /* report last trans on disk */
+
+ *trans_num_ptr = struct_ptr->last_trans_on_disk;
+
+ /* closing sanity check */
+
+ HDassert( ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use < struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress + 1 == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->cur_buf_free_space < struct_ptr->buf_size )
+ &&
+ ( struct_ptr->cur_buf_free_space > 0 )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use == struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == 0 )
+ )
+ );
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__get_last_transaction_on_disk */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__make_space_in_ring_buffer()
+ *
+ * Programmer: John Mainzer
+ *
+ * Purpose: Make at least one buffer available for writing.
+ *
+ * Do this by awaiting completion of the oldest
+ * asynchronous write, and then marking this buffer
+ * as available on the ring buffer.
+ *
+ * Then repeatedly test the remaining oldest write
+ * to see if it has completed, and mark its buffer
+ * available if it has until either a write that
+ * has not completed is encountered, or we run out
+ * of writes in progress.
+ *
+ * Note that this function presumes that it will not
+ * be called unless the ring buffer is completely full.
+ * The function will fail if this is not the case.
+ *
+ * Returns: SUCCEED if no errors are encountered.
+ *
+ ******************************************************************************/
+
+static herr_t
+H5C2_jb_aio__make_space_in_ring_buffer(H5C2_jbrb_t * struct_ptr)
+{
+ hbool_t done = FALSE;
+ hbool_t buf_write_complete;
+ herr_t ret_value = SUCCEED;
+ herr_t result;
+ uint64_t last_trans_in_ring_buffer;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__make_space_in_ring_buffer, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio == TRUE );
+ HDassert( struct_ptr->bufs_in_use == struct_ptr->num_bufs );
+ HDassert( struct_ptr->bufs_in_use == struct_ptr->writes_in_progress );
+ HDassert( ((struct_ptr->put + 1) % struct_ptr->num_bufs) ==
+ struct_ptr->get );
+ HDassert( struct_ptr->cur_buf_free_space == 0 );
+
+ /* free up the oldest (or least recently dirtied) buffer */
+ result = H5C2_jb_aio__await_buffer_write_completion(struct_ptr,
+ struct_ptr->get);
+
+ if ( result != SUCCEED ) {
+#if 1 /* JRM */
+ HDassert(FALSE);
+#endif /* JRM */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__await_buffer_write_completion() failed.")
+ }
+
+ /* Update the last transaction written, and then set the transaction
+ * tracking array entry of the buffer whose write just completed to zero.
+ */
+ HDassert( struct_ptr->last_trans_written <=
+ (*struct_ptr->trans_tracking)[struct_ptr->get] );
+ struct_ptr->last_trans_written =
+ (*struct_ptr->trans_tracking)[struct_ptr->get];
+ (*struct_ptr->trans_tracking)[struct_ptr->get] = 0;
+
+ /* decrements writes in progress */
+ struct_ptr->writes_in_progress--;
+
+ /* decrement bufs in use */
+ struct_ptr->bufs_in_use--;
+
+ HDassert( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use ) ||
+ ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use - 1 ) );
+
+ /* update get to reference the next entry in the ring buffer */
+ struct_ptr->get = (struct_ptr->get + 1) % (struct_ptr->num_bufs);
+
+ /* Since we now have a free buffer, prepare it for use */
+
+ last_trans_in_ring_buffer = (*struct_ptr->trans_tracking)[struct_ptr->put];
+
+ result = H5C2_jb_aio__prep_next_buf_for_use(struct_ptr,
+ last_trans_in_ring_buffer);
+
+ if ( result != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__prep_next_buf_for_use() failed.")
+ }
+
+ HDassert( ((struct_ptr->put + 1) % struct_ptr->num_bufs) ==
+ struct_ptr->get );
+ HDassert( struct_ptr->bufs_in_use + 1 == struct_ptr->num_bufs );
+
+ /* now scan through the ring buffer marking buffers as available
+ * until we either hit a buffer whose write is still in progress,
+ * or all buffers are available for re-use.
+ */
+
+#if 1 /* JRM */
+
+ result = H5C2_jb_aio__note_completed_async_buffer_writes(struct_ptr);
+
+ if ( result != SUCCEED ) {
+#if 1 /* JRM */
+ HDassert(FALSE);
+#endif /* JRM */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__note_completed_async_buffer_writes() failed.")
+ }
+
+#else /* delete this branch if all goes well -- JRM */
+
+ while ( ! done ) {
+
+ buf_write_complete = FALSE;
+
+ result = H5C2_jb_aio__test_buffer_write_complete(struct_ptr,
+ struct_ptr->get,
+ &buf_write_complete);
+
+ if ( result != SUCCEED ) {
+#if 1 /* JRM */
+ HDassert(FALSE);
+#endif /* JRM */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__test_buffer_write_complete() failed.")
+ }
+
+ if ( buf_write_complete ) {
+
+ /* decrements writes in progress */
+ struct_ptr->writes_in_progress--;
+
+ /* decrement bufs in use */
+ struct_ptr->bufs_in_use--;
+
+ /* Update the last transaction written, and then set the
+ * transaction tracking array entry of the buffer whose
+ * write just completed to zero.
+ */
+ HDassert( struct_ptr->last_trans_written <=
+ (*struct_ptr->trans_tracking)[struct_ptr->get] );
+
+ struct_ptr->last_trans_written =
+ (*struct_ptr->trans_tracking)[struct_ptr->get];
+
+ (*struct_ptr->trans_tracking)[struct_ptr->get] = 0;
+
+ HDassert( struct_ptr->writes_in_progress ==
+ struct_ptr->bufs_in_use );
+
+ /* mark the buffer as available */
+
+ struct_ptr->get = (struct_ptr->get + 1) % (struct_ptr->num_bufs);
+
+ if ( struct_ptr->bufs_in_use == 0 ) {
+
+ /* all buffer writes are complete */
+
+ HDassert( struct_ptr->put == struct_ptr->get );
+ done = TRUE;
+
+ } else {
+
+ HDassert( struct_ptr->put != struct_ptr->get );
+
+ }
+ } else {
+
+ /* we have hit a buffer whose write is still in progress */
+ done = TRUE;
+ }
+ }
+
+#endif /* JRM */
+
+ HDassert( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use );
+
+ if ( struct_ptr->use_aio_fsync ) {
+
+ result = H5C2_jb_aio__note_completed_async_fsyncs(struct_ptr);
+
+ if ( result != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__note_completed_async_fsyncs() failed.")
+ }
+ }
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__make_space_in_ring_buffer() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__note_completed_async_buffer_writes
+ *
+ * Programmer: John Mainzer
+ * 2/10/10
+ *
+ * Purpose: Verify that AIO is enabled.
+ *
+ * Then, if there are any writes in progress, check to
+ * see if the oldest one has completed. If it has,
+ * update *struct_ptr to reflect this. Specifically
+ * update the last_trans_written, put, and
+ * writes_in_progress fields to reflect the completion
+ * of the write.
+ *
+ * Repeat until there are no writes in progress, or
+ * the oldest write is still in progress.
+ *
+ * Returns: SUCCEED on success.
+ * FAIL otherwise.
+ *
+ ******************************************************************************/
+
+#define H5C2_JB_AIO__NOTE_COMPLETED_ASYNC_BUFFER_WRITES__DEBUG 0
+
+static herr_t
+H5C2_jb_aio__note_completed_async_buffer_writes(H5C2_jbrb_t * struct_ptr)
+{
+ herr_t result;
+ herr_t ret_value = SUCCEED;
+ hbool_t write_completed = TRUE;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__note_completed_async_buffer_writes, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio );
+
+ while ( ( struct_ptr->writes_in_progress > 0 ) &&
+ ( write_completed ) ) {
+
+ result = H5C2_jb_aio__test_buffer_write_complete(struct_ptr,
+ struct_ptr->get,
+ &write_completed);
+
+ if ( result != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__test_buffer_write_complete() failed.")
+ }
+
+ if ( write_completed ) {
+
+ H5C2__JBRB__UPDATE_STATS_FOR_BUF_WRITE_COMPLETE(struct_ptr, FALSE)
+
+ /* Update the last transaction written, and then set the
+ * transaction tracking array entry of the buffer whose
+ * write just completed to zero.
+ */
+ HDassert( struct_ptr->last_trans_written <=
+ (*struct_ptr->trans_tracking)[struct_ptr->get] );
+
+ struct_ptr->last_trans_written =
+ (*struct_ptr->trans_tracking)[struct_ptr->get];
+
+ (*struct_ptr->trans_tracking)[struct_ptr->get] = 0;
+
+
+ /* decrements writes in progress */
+ struct_ptr->writes_in_progress--;
+
+ /* decrement bufs in use */
+ struct_ptr->bufs_in_use--;
+
+ HDassert( ( struct_ptr->writes_in_progress ==
+ struct_ptr->bufs_in_use )
+ ||
+ ( struct_ptr->writes_in_progress + 1 ==
+ struct_ptr->bufs_in_use ) );
+
+ /* mark the buffer as available */
+
+ struct_ptr->get = (struct_ptr->get + 1) % (struct_ptr->num_bufs);
+
+#if H5C2_JB_AIO__NOTE_COMPLETED_ASYNC_BUFFER_WRITES__DEBUG
+ if ( ! ( ( ( struct_ptr->bufs_in_use == 0 )
+ &&
+ ( struct_ptr->put == struct_ptr->get )
+ )
+ ||
+ ( ( struct_ptr->bufs_in_use > 0 )
+ &&
+ ( struct_ptr->put != struct_ptr->get )
+ )
+ )
+ ) {
+ HDfprintf(stdout, "%s: biu/put/get = %d/%d/%d.\n",
+ FUNC,
+ (int)(struct_ptr->bufs_in_use),
+ (int)(struct_ptr->put),
+ (int)(struct_ptr->get));
+ }
+#endif /* H5C2_JB_AIO__NOTE_COMPLETED_ASYNC_BUFFER_WRITES__DEBUG */
+
+ HDassert( ( ( struct_ptr->bufs_in_use == 0 )
+ &&
+ ( struct_ptr->put == struct_ptr->get )
+ )
+ ||
+ ( ( struct_ptr->bufs_in_use == 1 )
+ &&
+ ( struct_ptr->cur_buf_free_space > 0 )
+ &&
+ ( struct_ptr->put == struct_ptr->get )
+ )
+ ||
+ ( ( struct_ptr->bufs_in_use > 0 )
+ &&
+ ( struct_ptr->put != struct_ptr->get )
+ )
+ );
+ }
+ } /* while */
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__note_completed_async_buffer_writes() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__note_completed_async_fsyncs
+ *
+ * Programmer: John Mainzer
+ * 2/10/10
+ *
+ * Purpose: Verify that AIO is enabled, and that struct_ptr->
+ * use_aio_fsync is TRUE.
+ *
+ * Then, if the sync queue is not empty, test to see
+ * if the asynchronous fsync associated with the
+ * instance of struct H5C2_jbrb_sync_q_entry_t at the
+ * head of the sync queue has completed.
+ *
+ * If it hasn't, return.
+ *
+ * If it has, update struct_ptr->last_trans_on_disk,
+ * discard the head of the sync queue, and repeat if
+ * the sync queue is not empty..
+ *
+ * Returns: SUCCEED on success.
+ * FAIL otherwise.
+ *
+ * Changes: Modified the function to never let the sync queue
+ * contain fewer entryies than
+ * struct_ptr->writes_in_progress.
+ *
+ * This forces us to complete each buffer write before
+ * we complete the associated aio_fsync() -- and
+ * maintains the expected relationship between
+ * last_trans_queued, last_trans_written, and
+ * last_trans_on_disk.
+ *
+ ******************************************************************************/
+
+static herr_t
+H5C2_jb_aio__note_completed_async_fsyncs(H5C2_jbrb_t * struct_ptr)
+{
+ herr_t result;
+ herr_t ret_value = SUCCEED;
+ hbool_t sync_completed = TRUE;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__note_completed_async_fsyncs, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio );
+ HDassert( struct_ptr->use_aio_fsync );
+
+ while ( ( struct_ptr->aio_sync_q_len > 0 ) &&
+ ( struct_ptr->aio_sync_q_len > struct_ptr->writes_in_progress ) &&
+ ( sync_completed ) ) {
+
+ result = H5C2_jb_aio__test_next_async_fsync_complete(struct_ptr,
+ &sync_completed);
+
+ if ( result != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__test_next_async_fsync_complete() failed.")
+ }
+ } /* while */
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__note_completed_async_fsyncs() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__prep_next_buf_for_use()
+ *
+ * Programmer: John Mainzer
+ *
+ * Purpose: Prepare the next free buffer in the ring buffer
+ * for use.
+ *
+ * Note that this function assumes that there
+ * is a next free buffer, and will fail if there is
+ * not.
+ *
+ * Note also that this function is for use with AIO
+ * only. In the SIO case, we do some extra book keeping
+ * which is not managed here.
+ *
+ * Returns: SUCCEED on success.
+ *
+ ******************************************************************************/
+
+static herr_t
+H5C2_jb_aio__prep_next_buf_for_use(H5C2_jbrb_t * struct_ptr,
+ uint64_t last_trans_in_ring_buffer)
+{
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__prep_next_buf_for_use, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio == TRUE );
+
+ if ( ( struct_ptr->bufs_in_use >= struct_ptr->num_bufs ) ||
+ ( struct_ptr->cur_buf_free_space != 0 ) ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "no free buffer or space left in current buffer.")
+ }
+
+ /* increment put to reference the next buffer in the ring buffer */
+ struct_ptr->put = (struct_ptr->put + 1) % (struct_ptr->num_bufs);
+
+ /* set the cur_buf_free_space */
+ struct_ptr->cur_buf_free_space = struct_ptr->buf_size;
+
+ /* set the head pointer to point to the beginning of the newly
+ * available buffer.
+ */
+ struct_ptr->head = (*struct_ptr->buf)[struct_ptr->put];
+
+ /* load the transaction tracking array for the current buffer with the
+ * id of the last transaction fully written to the ring buffer.
+ */
+ HDassert( (*struct_ptr->trans_tracking)[struct_ptr->put] == 0 );
+
+ (*struct_ptr->trans_tracking)[struct_ptr->put] = last_trans_in_ring_buffer;
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__prep_next_buf_for_use() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__queue_async_fsync()
+ *
+ * Programmer: John Mainzer
+ *
+ * Purpose: Queue an asynchronous fsync -- if possible.
+ *
+ * Verify that AIO is enabled, and that use_aio_fsync
+ * is TRUE.
+ *
+ * Then allocate an instance of H5C2_jbrb_sync_q_entry_t,
+ * load it with the last transaction queued and a
+ * correctly configured aio control block, and attempt
+ * to queue an asynchronous fsync via aio_fsync().
+ *
+ * If aio_fsync() is not supported, (i.e. it fails
+ * with ENOSYS or EINVAL), set struct_ptr->use_aio_fsync
+ * to FALSE, discard the instance of
+ * H5C2_jbrb_sync_q_entry_t and return.
+ *
+ * if aio_fsync() fails with EAGAIN, retry until either
+ * success, failure with some other error, or the retry
+ * limit is exceeded. In the latter two cases, flag
+ * an error and quit.
+ *
+ * If aio_fsync() fails with any error other than
+ * EAGAIN, EINVAL, or ENOSYS, flag an error and quit.
+ *
+ * If the aio_fsync() is queued successfully, add the
+ * instance of H5C2_jbrb_sync_q_entry_t to the tail of
+ * the aio sync queue, and then return.
+ *
+ * If the instance of H5C2_jbrb_sync_q_entry_t is
+ * allocated, but the call to aio_fsync() fails for
+ * any reason, discard the instance of
+ * H5C2_jbrb_sync_q_entry_t before exiting.
+ *
+ * JRM -- 2/8/10
+ *
+ * Returns: SUCCEED on success.
+ *
+ ******************************************************************************/
+
+#define H5C2_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG 0
+#define AIO_FSYNC_MAX_RETRIES 120
+
+static herr_t
+H5C2_jb_aio__queue_async_fsync(H5C2_jbrb_t * struct_ptr)
+{
+ herr_t ret_value = SUCCEED;
+ herr_t herr_result;
+ hbool_t sync_complete;
+ hbool_t sync_queued = FALSE;
+ int result;
+ int retries = -1;
+ struct H5C2_jbrb_sync_q_entry_t * entry_ptr = NULL;
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->journal_file_fd >= 0 );
+ HDassert( struct_ptr->use_aio );
+ HDassert( struct_ptr->use_aio_fsync );
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__queue_async_fsync, FAIL)
+
+ entry_ptr = (struct H5C2_jbrb_sync_q_entry_t *)
+ H5MM_malloc(sizeof(struct H5C2_jbrb_sync_q_entry_t));
+
+ if ( entry_ptr == NULL ) {
+
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
+ "memory allocation failed for aio sync queue entry.")
+ }
+
+ entry_ptr->magic = H5C2__H5C2_JBRB_SYNC_Q_T_MAGIC;
+ entry_ptr->last_trans_in_sync = struct_ptr->last_trans_queued;
+ bzero((void *)(&(entry_ptr->ctl_blk)), sizeof(struct aiocb));
+ entry_ptr->ctl_blk.aio_fildes = struct_ptr->journal_file_fd;
+ entry_ptr->next = NULL;
+
+ do {
+
+ result = aio_fsync(O_SYNC, &(entry_ptr->ctl_blk));
+
+ if ( result != 0 ) {
+
+ if ( ( errno == EINVAL ) ||
+ ( errno == ENOSYS ) ) {
+
+#if H5C2_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG
+ HDfprintf(stdout,
+ "%s: aio_fsync() not supported. errno = %d (%s)\n",
+ FUNC, errno, strerror(errno));
+#endif /* H5C2_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG */
+ HDassert( struct_ptr->aio_sync_q_len == 0 );
+ struct_ptr->use_aio_fsync = FALSE;
+
+ } else if ( errno == EAGAIN ) {
+
+ retries++;
+
+ if ( retries > AIO_FSYNC_MAX_RETRIES ) {
+
+#if H5C2_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG
+ HDfprintf(stdout,
+ "%s: retry limit on calls to aio_fsync() exceeded\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG */
+
+ HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, \
+ "retry limit on calls to aio_fsync() exceeded.")
+ }
+
+ /* if we get errno == EAGAIN, it is possible that
+ * the problem is too many aio operations in progress.
+ * Thus, if the sync queue is not empty, check to
+ * see if an asynchronous sync has completed, and
+ * retire it if it has.
+ */
+ if ( struct_ptr->aio_sync_q_len > 0 ) {
+
+ herr_result =
+ H5C2_jb_aio__test_next_async_fsync_complete(struct_ptr,
+ &sync_complete);
+ }
+ } else {
+
+#if H5C2_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG
+ HDfprintf(stdout,
+ "%s: aio_fsync() failed. errno = %d (%s)\n",
+ FUNC, errno, strerror(errno));
+#endif /* H5C2_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG */
+
+ HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, \
+ "call to aio_fsync() failed.")
+ }
+ }
+ } while ( ( result != 0 ) &&
+ ( struct_ptr->use_aio_fsync ) );
+
+ if ( result == 0 ) {
+
+ herr_result = H5C2_jb_aio__sync_q__append(struct_ptr, entry_ptr);
+
+ if ( herr_result != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__sync_q__append() failed.")
+
+ }
+
+ sync_queued = TRUE;
+
+ H5C2__JBRB__UPDATE_STATS_FOR_ASYNC_SYNCS_QUEUED(struct_ptr);
+
+#if H5C2_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG
+ HDfprintf(stdout,
+ "%s: queued async fsync. last trans = %lld, q_len = %lld.\n",
+ FUNC,
+ (long long)(entry_ptr->last_trans_in_sync),
+ (long long)(struct_ptr->aio_sync_q_len));
+#endif /* H5C2_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG */
+
+ }
+done:
+
+ if ( ( entry_ptr != NULL ) &&
+ ( ! sync_queued ) ) { /* discard *entry_ptr */
+
+ entry_ptr->magic = 0;
+ entry_ptr = (struct H5C2_jbrb_sync_q_entry_t *)H5MM_xfree(entry_ptr);
+
+ if ( entry_ptr != NULL ) {
+
+ HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \
+ "free of entry_ptr failed.");
+ }
+ }
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__queue_async_fsync() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__queue_buffer_write
+ *
+ * Programmer: John Mainzer
+ *
+ * Purpose: Queue an asynchronous write of the specified buffer,
+ * and update struct_ptr->last_trans_queue if appropriate.
+ * If struct_ptr->use_aio_fsync is TRUE, queue and
+ * asynchronous fsync after the buffer write has
+ * been queued.
+ *
+ * Verify that AIO is enabled, that buffer specified
+ * exists, and is not already involved in an
+ * asynchronous write.
+ *
+ * Further verify that the buffer is not empty, and that
+ * either partial_write_ok is TRUE, or the buffer is full.
+ *
+ * Returns: SUCCEED on success.
+ * FAIL otherwise
+ *
+ ******************************************************************************/
+
+#define H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG 0
+#define AIO_WRITE_MAX_RETRIES 120
+
+static herr_t
+H5C2_jb_aio__queue_buffer_write(H5C2_jbrb_t * struct_ptr,
+ int buf_num,
+ hbool_t partial_write_ok)
+{
+ hbool_t write_queued = FALSE;
+ int result;
+ int retries = -1;
+#if H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG
+ static int writes_queued = 0;
+#endif /* H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG */
+ uint64_t last_trans_in_buf;
+ herr_t herr_result;
+ herr_t ret_value = SUCCEED;
+ hsize_t bytes_to_write;
+ void * buf_ptr = NULL;
+ struct aiocb * aiocb_ptr = NULL;
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->buf_size > 0 );
+ HDassert( struct_ptr->journal_file_fd >= 0 );
+ HDassert( struct_ptr->use_aio );
+ HDassert( struct_ptr->trans_tracking != NULL );
+ HDassert( struct_ptr->aio_ctl_blks != NULL );
+ HDassert( buf_num >= 0 );
+ HDassert( buf_num < struct_ptr->num_bufs );
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__queue_buffer_write, FAIL)
+
+ if ( struct_ptr->cur_buf_free_space >= struct_ptr->buf_size ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "attempt to queue write of an empty buffer.")
+ }
+
+ if ( ( struct_ptr->cur_buf_free_space > 0 ) &&
+ ( ! partial_write_ok ) ) {
+
+#if H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG
+ HDfprintf(stdout,
+ "%s: buffer not full and partial_write_ok == FALSE.\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "buffer not full and partial_write_ok == FALSE.")
+ }
+
+ last_trans_in_buf = (*struct_ptr->trans_tracking)[struct_ptr->put];
+
+ HDassert( last_trans_in_buf >= struct_ptr->last_trans_queued );
+ HDassert( struct_ptr->last_trans_queued >= struct_ptr->last_trans_written );
+ HDassert( struct_ptr->last_trans_written >=
+ struct_ptr->last_trans_on_disk );
+
+ aiocb_ptr = &((*(struct_ptr->aio_ctl_blks))[buf_num]);
+
+ if ( aiocb_ptr->aio_fildes != -1 ) {
+
+#if H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG
+ HDfprintf(stdout,
+ "%s: AIO write alread in progress for target buffer?\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "AIO write alread in progress for target buffer?")
+ }
+
+ buf_ptr = (void *)((*struct_ptr->buf)[buf_num]);
+
+ if ( buf_ptr == NULL ) {
+
+#if H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG
+ HDfprintf(stdout,
+ "%s: ((*struct_ptr->buf)[buf_num]) == NULL?!?\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "((*struct_ptr->buf)[buf_num]) == NULL?!?")
+ }
+
+ HDassert( struct_ptr->buf_size > struct_ptr->cur_buf_free_space);
+
+ bytes_to_write = struct_ptr->buf_size - struct_ptr->cur_buf_free_space;
+
+ /* all looks good -- setup to initiate the write ... */
+
+ bzero((void *)aiocb_ptr, sizeof(struct aiocb));
+
+ aiocb_ptr->aio_fildes = struct_ptr->journal_file_fd;
+ aiocb_ptr->aio_offset = struct_ptr->aio_next_buf_offset;
+ aiocb_ptr->aio_buf = buf_ptr;
+ aiocb_ptr->aio_nbytes = bytes_to_write;
+
+ /* ... and kick it off */
+ do {
+
+ result = aio_write(aiocb_ptr);
+
+ if ( result != 0 ) {
+
+ if ( errno == EAGAIN ) {
+
+ sleep(1);
+ retries++;
+
+ } else {
+
+#if H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG
+ HDfprintf(stdout,
+ "%s: aio_write(aiocb_ptr) failed. errno = %d (%s)\n",
+ FUNC, errno, strerror(errno));
+ HDfprintf(stdout, "%s: offset/size = %lld/%d\n",
+ FUNC,
+ (long long)struct_ptr->aio_next_buf_offset,
+ (int)bytes_to_write);
+#endif /* H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG */
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
+ "call to aio_write() failed.")
+ }
+ }
+ } while ( ( result != 0 ) && ( retries <= AIO_WRITE_MAX_RETRIES ) );
+
+#if H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG
+ if ( retries > 0 ) {
+
+ HDfprintf(stdout,
+ "%s: aio_write() retries = %d, writes queued = %d\n",
+ FUNC, retries, writes_queued);
+ HDfprintf(stdout, "%s: offset/size = %lld/%d\n", FUNC,
+ (long long)struct_ptr->aio_next_buf_offset,
+ (int)bytes_to_write);
+ } else {
+ HDfprintf(stdout, "%s: aio_write(): offset/size = %lld/%d\n", FUNC,
+ (long long)struct_ptr->aio_next_buf_offset,
+ (int)bytes_to_write);
+ }
+#endif /* H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG */
+
+
+ if ( ( result != 0 ) && ( retries > AIO_WRITE_MAX_RETRIES ) ) {
+
+#if H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG
+ HDfprintf(stdout, "%s: retry limit on calls to aio_write() exceeded\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG */
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
+ "retry limit on calls to aio_write() exceeded.")
+ }
+
+#if H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG
+ writes_queued++;
+#endif /* H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG */
+
+ H5C2__JBRB__UPDATE_STATS_FOR_BUF_WRITE_QUEUED(struct_ptr, \
+ (struct_ptr->cur_buf_free_space > 0 ))
+
+ /* note that another write is in progress */
+ struct_ptr->writes_in_progress++;
+#if H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG
+ if ( struct_ptr->writes_in_progress != struct_ptr->bufs_in_use ) {
+ HDfprintf(stdout, "%s: wip = %d, biu = %d.\n", FUNC,
+ struct_ptr->writes_in_progress,
+ struct_ptr->bufs_in_use);
+ }
+#endif /* H5C2_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG */
+ HDassert( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use );
+
+ /* update struct_ptr->last_trans_queued */
+ struct_ptr->last_trans_queued = last_trans_in_buf;
+
+ /* update struct_ptr->aio_next_buf_offset */
+ struct_ptr->aio_next_buf_offset += bytes_to_write;
+
+ /* if aio_fsync() is available, queue a sync to force the
+ * data just written to disk.
+ */
+ if ( struct_ptr->use_aio_fsync ) {
+
+ herr_result = H5C2_jb_aio__queue_async_fsync(struct_ptr);
+
+ if ( herr_result != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__queue_async_fsync() failed.")
+ }
+ }
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__queue_buffer_write() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__sync_file()
+ *
+ * Programmer: John Mainzer
+ * 1/13/10
+ *
+ * Purpose: Sync out the journal file.
+ *
+ * Verify that AIO is enabled, and that all pending
+ * writes are complete.
+ *
+ * Note that this last precondition should not be
+ * necessary. However, given the incomplete state
+ * of many AIO implementation, it seems wise to
+ * allow all writes to complete before calling fsync().
+ *
+ * If struct_ptr->use_aio_fsync is TRUE, await
+ * completion of all asynchronous fsyncs on the sync
+ * queue. When this is done, the file should be
+ * synced.
+ *
+ * If struct_ptr->use_aio_fsync is FALSE, call
+ * fsync().
+ *
+ * Returns: SUCCEED if no errors are detected,
+ * FAIL otherwise.
+ *
+ ******************************************************************************/
+
+#define H5C2_JB_AIO__SYNC_FILE__DEBUG 0
+
+static herr_t
+H5C2_jb_aio__sync_file(H5C2_jbrb_t * struct_ptr)
+{
+ int result;
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__sync_file, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->journal_file_fd >= 0 );
+ HDassert( struct_ptr->use_aio );
+
+ if ( struct_ptr->writes_in_progress != 0 ) {
+
+#if H5C2_JB_AIO__SYNC_FILE__DEBUG
+ HDfprintf(stdout, "%s: async write in progress on entry.\n", FUNC);
+#endif /* H5C2_JB_AIO__SYNC_FILE__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "async write in progress on entry")
+ }
+
+ if ( struct_ptr->use_aio_fsync ) {
+
+ result = H5C2_jb_aio__await_completion_of_all_async_fsyncs(struct_ptr);
+
+ if ( result != 0 ) {
+
+#if H5C2_JB_AIO__SYNC_FILE__DEBUG
+ HDfprintf(stdout,
+ "%s: H5C2_jb_aio__await_completion_of_all_async_fsyncs() failed.\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__SYNC_FILE__DEBUG */
+
+ HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, \
+ "H5C2_jb_aio__await_completion_of_all_async_fsyncs() failed.");
+ }
+ } else {
+
+ result = fsync(struct_ptr->journal_file_fd);
+
+ if ( result != 0 ) {
+
+#if H5C2_JB_AIO__SYNC_FILE__DEBUG
+ HDfprintf(stdout, "%s: fsync() failed.\n", FUNC);
+#endif /* H5C2_JB_AIO__SYNC_FILE__DEBUG */
+
+ HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, "fsync() failed.");
+ }
+
+ H5C2__JBRB__UPDATE_STATS_FOR_CALL_TO_FSYNC(struct_ptr)
+ }
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__sync_file() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__sync_q__append()
+ *
+ * Purpose: Append an instance of H5C2_jbrb_sync_q_entry_t to
+ * the sync queue.
+ *
+ * Verify that AIO is enabled, and that the supplied
+ * instance of H5C2_jbrb_sync_q_entry_t has the correct
+ * magic value. Then append to the end of the sync
+ * queue.
+ * JRM -- 2/9/10
+ *
+ * Returns: SUCCEED if no errors are detected,
+ * FAIL otherwise.
+ *
+ ******************************************************************************/
+
+static herr_t
+H5C2_jb_aio__sync_q__append(H5C2_jbrb_t * struct_ptr,
+ struct H5C2_jbrb_sync_q_entry_t * entry_ptr)
+{
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__sync_q__append, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio );
+ HDassert( entry_ptr != NULL );
+ HDassert( entry_ptr->magic == H5C2__H5C2_JBRB_SYNC_Q_T_MAGIC );
+ HDassert( entry_ptr->next == NULL );
+
+ /* this should be an assert, but we need to include one call to
+ * HGOTO_ERROR() to keep the compiler happy
+ */
+ if ( ! struct_ptr->use_aio_fsync ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "struct_ptr->use_aio_fsync FALSE on entry")
+ }
+
+ /* add the *entry_ptr to the sync queue */
+
+ if ( struct_ptr->aio_sync_q_len == 0 ) {
+
+ HDassert( struct_ptr->aio_sync_q_head == NULL );
+ HDassert( struct_ptr->aio_sync_q_tail == NULL );
+
+ struct_ptr->aio_sync_q_head = entry_ptr;
+ struct_ptr->aio_sync_q_tail = entry_ptr;
+ struct_ptr->aio_sync_q_len = 1;
+
+ } else {
+
+ HDassert( struct_ptr->aio_sync_q_head != NULL );
+ HDassert( struct_ptr->aio_sync_q_tail != NULL );
+ HDassert( struct_ptr->aio_sync_q_len > 0 );
+ HDassert( ( ( struct_ptr->aio_sync_q_len == 1 ) &&
+ ( struct_ptr->aio_sync_q_head ==
+ struct_ptr->aio_sync_q_tail )
+ )
+ ||
+ ( ( struct_ptr->aio_sync_q_len > 1 ) &&
+ ( struct_ptr->aio_sync_q_head !=
+ struct_ptr->aio_sync_q_tail )
+ )
+ );
+ HDassert( struct_ptr->aio_sync_q_tail->magic ==
+ H5C2__H5C2_JBRB_SYNC_Q_T_MAGIC );
+ HDassert( struct_ptr->aio_sync_q_tail->next == NULL );
+
+ struct_ptr->aio_sync_q_tail->next = entry_ptr;
+ struct_ptr->aio_sync_q_tail = entry_ptr;
+ struct_ptr->aio_sync_q_len++;
+ }
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__sync_q__append() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__sync_q__append()
+ *
+ * Purpose: Append an instance of H5C2_jbrb_sync_q_entry_t to
+ * the sync queue.
+ *
+ * Verify that AIO is enabled, and that the supplied
+ * instance of H5C2_jbrb_sync_q_entry_t has the correct
+ * magic value. Then append to the end of the sync
+ * queue.
+ * JRM -- 2/9/10
+ *
+ * Returns: SUCCEED if no errors are detected,
+ * FAIL otherwise.
+ *
+ ******************************************************************************/
+
+static herr_t
+H5C2_jb_aio__sync_q__discard_head(H5C2_jbrb_t * struct_ptr)
+{
+ herr_t ret_value = SUCCEED;
+ struct H5C2_jbrb_sync_q_entry_t * head_ptr = NULL;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__sync_q__discard_head, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio );
+ HDassert( struct_ptr->use_aio_fsync );
+
+ /* this should be an assert, but we need to include one call to
+ * HGOTO_ERROR() to keep the compiler happy
+ */
+ if ( struct_ptr->aio_sync_q_len <= 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "sync queue empty on entry?!?")
+ }
+
+ head_ptr = struct_ptr->aio_sync_q_head;
+ HDassert( head_ptr != NULL );
+ HDassert( head_ptr->magic == H5C2__H5C2_JBRB_SYNC_Q_T_MAGIC );
+
+ /* unlink *head_ptr from the queue */
+
+ /* add the *entry_ptr to the sync queue */
+
+ if ( struct_ptr->aio_sync_q_len == 1 ) {
+
+ HDassert( struct_ptr->aio_sync_q_head == head_ptr );
+ HDassert( struct_ptr->aio_sync_q_tail == head_ptr );
+ HDassert( head_ptr->next == NULL );
+
+ struct_ptr->aio_sync_q_head = NULL;
+ struct_ptr->aio_sync_q_tail = NULL;
+ struct_ptr->aio_sync_q_len = 0;
+
+ } else {
+
+ HDassert( struct_ptr->aio_sync_q_len >= 2 );
+ HDassert( struct_ptr->aio_sync_q_head == head_ptr );
+ HDassert( struct_ptr->aio_sync_q_tail != NULL );
+ HDassert( struct_ptr->aio_sync_q_tail != head_ptr );
+ HDassert( head_ptr->next != NULL );
+ HDassert( head_ptr->next->magic == H5C2__H5C2_JBRB_SYNC_Q_T_MAGIC );
+ HDassert( struct_ptr->aio_sync_q_tail->next == NULL );
+
+ struct_ptr->aio_sync_q_head = head_ptr->next;
+ head_ptr->next = NULL;
+ struct_ptr->aio_sync_q_len--;
+ }
+
+ /* and then discard it */
+
+ head_ptr->magic = 0;
+ head_ptr = (struct H5C2_jbrb_sync_q_entry_t *)H5MM_xfree(head_ptr);
+
+ if ( head_ptr != NULL ) {
+
+ HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \
+ "free of *head_ptr failed.");
+ }
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__sync_q__discard_head() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__test_buffer_write_complete()
+ *
+ * Programmer: John Mainzer
+ *
+ * Purpose: Test to see if an asynchronous write has completed.
+ *
+ * Verify that AIO is enabled, that buffer specified
+ * exists, and that an asynchronous write of the buffer
+ * has been queued.
+ *
+ * If it is, mark it complete, set *complete_ptr
+ * to TRUE, mark the associate AIO control block as
+ * having no write in progress, and return.
+ *
+ * It it isn't, set *complete_ptr to FALSE and return
+ *
+ * Returns: SUCCEED if no errors are detected,
+ * FAIL otherwise.
+ *
+ ******************************************************************************/
+
+static herr_t
+H5C2_jb_aio__test_buffer_write_complete(H5C2_jbrb_t * struct_ptr,
+ int buf_num,
+ hbool_t *complete_ptr)
+{
+ int result;
+ herr_t ret_value = SUCCEED;
+ struct aiocb * aiocb_ptr = NULL;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__test_buffer_write_complete, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->buf_size > 0 );
+ HDassert( struct_ptr->journal_file_fd >= 0 );
+ HDassert( struct_ptr->use_aio );
+ HDassert( struct_ptr->aio_ctl_blks != NULL );
+ HDassert( buf_num >= 0 );
+ HDassert( buf_num < struct_ptr->num_bufs );
+ HDassert( complete_ptr != NULL );
+
+ aiocb_ptr = &((*(struct_ptr->aio_ctl_blks))[buf_num]);
+
+ if ( aiocb_ptr->aio_fildes < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "AIO write not in progress for target buffer?")
+ }
+
+ result = aio_error(aiocb_ptr);
+
+ if ( result == EINPROGRESS ) {
+
+ /* the write is still in progress -- set *complete_ptr to
+ * FALSE and do nothing.
+ */
+ *complete_ptr = FALSE;
+
+ } else if ( result == 0 ) {
+
+ /* call aio_return() to complete the write */
+ result = aio_return(aiocb_ptr);
+ if ( result == -1 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
+ "aio_error() reports something other than success.")
+
+ }
+ /* TODO: Verify the number of bytes written? */
+
+ /* the write completed successfully -- set *complete_ptr
+ * to TRUE, mark the aio control block as having no write
+ * in progress.
+ */
+
+ aiocb_ptr->aio_fildes = -1;
+
+ *complete_ptr = TRUE;
+
+ } else {
+
+ /* the write failed -- scream and die. */
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "target async write failed.")
+
+ }
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__test_buffer_write_complete() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__test_next_async_fsync_complete()
+ *
+ * Purpose: Test to see if the asynchronous fsync at the head
+ * of the sync queue is complete.
+ *
+ * If it is, finish up the call to aio_fsync(), update
+ * last_trans_on_disk, remove the associated instance of
+ * H5C2_jbrb_sync_q_entry_t from the sync queue, set
+ * *sync_complete_ptr to TRUE, and return.
+ *
+ * If it isn't, set *sync_complete_ptr to FALSE, and
+ * return.
+ *
+ * In either case, verify that AIO is enabled, that
+ * struct_ptr->use_aio_fsync is TRUE, and that the
+ * sync queue is not empty.
+ * JRM -- 2/10/10
+ *
+ * Returns: SUCCEED if no errors are detected,
+ * FAIL otherwise.
+ *
+ ******************************************************************************/
+
+#define H5C2_JB_AIO__TEST_NEXT_ASYNC_FSYNC_COMPLETE__DEBUG 0
+
+static herr_t
+H5C2_jb_aio__test_next_async_fsync_complete(H5C2_jbrb_t * struct_ptr,
+ hbool_t *sync_complete_ptr)
+{
+ int result;
+ herr_t ret_value = SUCCEED;
+ struct H5C2_jbrb_sync_q_entry_t * head_ptr = NULL;
+ struct aiocb * aiocb_ptr = NULL;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__test_next_async_fsync_complete, FAIL)
+
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio );
+ HDassert( struct_ptr->use_aio_fsync );
+ HDassert( struct_ptr->aio_sync_q_len > 0 );
+ HDassert( sync_complete_ptr != NULL );
+
+ head_ptr = struct_ptr->aio_sync_q_head;
+
+ HDassert( head_ptr != NULL );
+ HDassert( head_ptr->magic == H5C2__H5C2_JBRB_SYNC_Q_T_MAGIC );
+
+ aiocb_ptr = &(head_ptr->ctl_blk);
+
+ if ( aiocb_ptr->aio_fildes != struct_ptr->journal_file_fd ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "bad fd in ctl blk?!?")
+ }
+
+ result = aio_error(aiocb_ptr);
+
+ if ( result == EINPROGRESS ) {
+
+ /* the write is still in progress -- set *sync_complete_ptr to
+ * FALSE and do nothing.
+ */
+ *sync_complete_ptr = FALSE;
+
+ } else if ( result == 0 ) {
+
+ /* call aio_return() to complete the aio_fsync() */
+ result = aio_return(aiocb_ptr);
+
+ if ( result == -1 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, \
+ "aio_error() reports something other than success.")
+
+ }
+
+ /* the aio_fsync() completed successfully -- update last trans on disk,
+ * discard the head of the sync queue, and set *sync_complete_ptr to
+ * TRUE.
+ */
+
+#if H5C2_JB_AIO__TEST_NEXT_ASYNC_FSYNC_COMPLETE__DEBUG
+ HDfprintf(stdout, "%s: ltod/ltw/ltis = %lld/%lld/%lld.\n",
+ FUNC,
+ (long long)(struct_ptr->last_trans_on_disk),
+ (long long)(struct_ptr->last_trans_written),
+ (long long)(head_ptr->last_trans_in_sync));
+#endif /* H5C2_JB_AIO__TEST_NEXT_ASYNC_FSYNC_COMPLETE__DEBUG */
+
+ HDassert( (uint64_t)(struct_ptr->last_trans_on_disk) <=
+ (uint64_t)(head_ptr->last_trans_in_sync) );
+ HDassert( (uint64_t)(head_ptr->last_trans_in_sync) <=
+ (uint64_t)(struct_ptr->last_trans_written) );
+
+#if H5C2_JB_AIO__TEST_NEXT_ASYNC_FSYNC_COMPLETE__DEBUG
+ HDfprintf(stdout, "%s: changing last trans on disk from %lld to %lld.\n",
+ FUNC, struct_ptr->last_trans_on_disk,
+ head_ptr->last_trans_in_sync);
+#endif /* H5C2_JB_AIO__TEST_NEXT_ASYNC_FSYNC_COMPLETE__DEBUG */
+
+ H5C2__JBRB__UPDATE_STATS_FOR_ASYNC_SYNC_COMPLETED(struct_ptr, FALSE)
+
+ aiocb_ptr->aio_fildes = -1;
+
+ struct_ptr->last_trans_on_disk = head_ptr->last_trans_in_sync;
+
+ if ( H5C2_jb_aio__sync_q__discard_head(struct_ptr) != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__sync_q__discard_head() failed.")
+ }
+
+ *sync_complete_ptr = TRUE;
+
+ } else {
+
+ /* the sync failed -- scream and die. */
+
+ HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, "target async fsync failed.")
+
+ }
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__test_next_async_fsync_complete() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_aio__write_to_buffer
+ *
+ * Programmer: John Mainzer
+ * 0/09/10
+ *
+ * Purpose: Copy the contents of the supplied data buffer into
+ * the ring buffers, kicking off asynchronous writes
+ * as the buffers fill, and stalling on completion of
+ * writes as needed when the ring buffer fills.
+ *
+ * Returns: SUCCEED on success.
+ *
+ ******************************************************************************/
+
+#define H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG 0
+
+herr_t
+H5C2_jb_aio__write_to_buffer(H5C2_jbrb_t * struct_ptr,
+ size_t size,
+ const char * data,
+ hbool_t is_end_trans,
+ uint64_t trans_num)
+{
+ hbool_t just_called_make_space_in_ring_buffer = FALSE;
+ herr_t ret_value = SUCCEED;
+ herr_t result;
+ size_t size_remaining;
+ const char * data_remaining;
+ uint64_t last_trans_in_ring_buffer;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_aio__write_to_buffer, FAIL)
+
+ /* Check Arguments */
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( struct_ptr->use_aio == TRUE );
+ HDassert( size > 0 );
+ HDassert( data != 0 );
+ HDassert( ( struct_ptr->human_readable == FALSE ) ||
+ ( HDstrlen(data) == size ) );
+ HDassert( ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use < struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress + 1 == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->cur_buf_free_space < struct_ptr->buf_size )
+ &&
+ ( struct_ptr->cur_buf_free_space > 0 )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use == struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == 0 )
+ )
+ );
+
+ /* make space in the ring buffer if necessary. As
+ * struct_ptr->cur_buf_free_space will always be greater
+ * than zero if there is any space in the ring buffer,
+ * it is sufficient to check that value and call
+ * H5C2_jb_aio__make_space_in_ring_buffer() if it is zero.
+ */
+ if ( struct_ptr->cur_buf_free_space <= 0 ) {
+
+ HDassert( struct_ptr->bufs_in_use == struct_ptr->num_bufs );
+ HDassert( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use );
+
+ result = H5C2_jb_aio__make_space_in_ring_buffer(struct_ptr);
+
+ if ( result != SUCCEED ) {
+
+#if H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG
+ HDfprintf(stdout,
+ "%s: H5C2_jb_aio__make_space_in_ring_buffer(1) failed.\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__make_space_in_ring_buffer(1) failed.")
+ }
+
+ just_called_make_space_in_ring_buffer = TRUE;
+
+ HDassert( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use );
+ }
+
+ data_remaining = data;
+ size_remaining = size;
+
+ while ( ( size_remaining >= struct_ptr->cur_buf_free_space ) &&
+ ( struct_ptr->cur_buf_free_space > 0 ) ) {
+
+ HDassert( struct_ptr->cur_buf_free_space > 0 );
+
+ if ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size ) {
+
+ struct_ptr->bufs_in_use += 1;
+
+ HDassert( struct_ptr->bufs_in_use <= struct_ptr->num_bufs );
+ }
+
+ HDassert( (struct_ptr->writes_in_progress + 1) ==
+ struct_ptr->bufs_in_use );
+
+ /* fill the remainder of the current buffer with data */
+ HDmemcpy(struct_ptr->head,
+ (const void *)data_remaining,
+ struct_ptr->cur_buf_free_space);
+
+ data_remaining = data_remaining + struct_ptr->cur_buf_free_space;
+ size_remaining = size_remaining - struct_ptr->cur_buf_free_space;
+
+ struct_ptr->cur_buf_free_space = 0;
+
+ if ( ( is_end_trans ) && ( size_remaining == 0 ) ) {
+
+ (*struct_ptr->trans_tracking)[struct_ptr->put] = trans_num;
+
+#if H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG
+ HDfprintf(stdout, "%s: set trans_tracking[%d] to %lld (1).\n",
+ FUNC, struct_ptr->put, trans_num);
+#endif /* H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG */
+ }
+
+ HDassert( struct_ptr->bufs_in_use ==
+ (struct_ptr->writes_in_progress + 1 ) );
+
+ /* kick off an asynchronous write of the current buffer */
+ result = H5C2_jb_aio__queue_buffer_write(struct_ptr,
+ struct_ptr->put,
+ FALSE);
+
+ if ( result != SUCCEED ) {
+
+#if H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG
+ HDfprintf(stdout,
+ "%s: H5C2_jb_aio__queue_buffer_write() failed.\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__queue_buffer_write() failed.");
+ }
+
+ just_called_make_space_in_ring_buffer = FALSE;
+
+ HDassert( struct_ptr->bufs_in_use == struct_ptr->writes_in_progress );
+
+ /* if there is another free buffer, call
+ * H5C2_jb_aio__prep_next_buf_for_use().
+ *
+ * otherwise, if we still have data to write, call
+ * H5C2_jb_aio__make_space_in_ring_buffer() to free up
+ * space to continue the write.
+ */
+ if ( struct_ptr->bufs_in_use < struct_ptr->num_bufs ) {
+
+ last_trans_in_ring_buffer =
+ (*struct_ptr->trans_tracking)[struct_ptr->put];
+
+#if H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG
+ HDfprintf(stdout, "%s: set trans_tracking[%d] to %lld (2).\n",
+ FUNC, struct_ptr->put, trans_num);
+#endif /* H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG */
+
+ result = H5C2_jb_aio__prep_next_buf_for_use(struct_ptr,
+ last_trans_in_ring_buffer);
+
+ if ( result != SUCCEED ) {
+
+#if H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG
+ HDfprintf(stdout,
+ "%s: H5C2_jb_aio__prep_next_buf_for_use() failed.\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__prep_next_buf_for_use() failed.")
+ }
+ } else if ( size_remaining > 0 ) {
+
+ result = H5C2_jb_aio__make_space_in_ring_buffer(struct_ptr);
+
+ if ( result != SUCCEED ) {
+
+#if H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG
+ HDfprintf(stdout,
+ "%s: H5C2_jb_aio__make_space_in_ring_buffer() failed.\n",
+ FUNC);
+#endif /* H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__make_space_in_ring_buffer(2) failed.")
+ }
+ just_called_make_space_in_ring_buffer = TRUE;
+ }
+
+ HDassert( ( struct_ptr->writes_in_progress ==
+ struct_ptr->bufs_in_use ) ||
+ ( (struct_ptr->writes_in_progress + 1) ==
+ struct_ptr->bufs_in_use ) );
+
+ } /* while */
+
+ HDassert( ( size_remaining < struct_ptr->cur_buf_free_space ) ||
+ ( size_remaining == 0 ) );
+
+ if ( size_remaining > 0 ) {
+
+ /* increment bufs_in_use if we are about to write to an empty buffer */
+ if ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size ) {
+
+ HDassert( struct_ptr->bufs_in_use ==
+ struct_ptr->writes_in_progress );
+
+ struct_ptr->bufs_in_use += 1;
+
+ HDassert( struct_ptr->bufs_in_use <= struct_ptr->num_bufs );
+ }
+
+ /* copy data into the current buffer */
+ HDmemcpy(struct_ptr->head,
+ (const void *)data_remaining,
+ size_remaining);
+
+ struct_ptr->head += size_remaining;
+ struct_ptr->cur_buf_free_space -= size_remaining;
+
+ if ( is_end_trans ) {
+
+ (*struct_ptr->trans_tracking)[struct_ptr->put] = trans_num;
+
+#if H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG
+ HDfprintf(stdout, "%s: set trans_tracking[%d] to %lld (3).\n",
+ FUNC, struct_ptr->put, trans_num);
+#endif /* H5C2_JB_AIO__WRITE_TO_BUFFER__DEBUG */
+ }
+ }
+
+ HDassert( ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use < struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress + 1 == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->cur_buf_free_space < struct_ptr->buf_size )
+ &&
+ ( struct_ptr->cur_buf_free_space > 0 )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use == struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == 0 )
+ )
+ );
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_aio__write_to_buffer */
+
+
+
+/******************************************************************************
+ *
* Function: H5C2_jb_bjf__comment
*
* Programmer: John Mainzer
*
- * Purpose: In the binary journal file format, a comment is
+ * Purpose: In the binary journal file format, a comment is
* a no-op. Thus in this function, we simply verify
* that we are in fact writing a binary journal file,
* and then return.
@@ -2245,14 +4920,14 @@ if ( H5C2_jb_bjf__write_trans_num((struct_ptr), (is_end_trans), \
*
******************************************************************************/
-static herr_t
+static herr_t
H5C2_jb_bjf__comment(H5C2_jbrb_t * struct_ptr,
const char * comment_ptr)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5C2_jb_bjf__comment, FAIL)
-
+
/* Check Arguments */
HDassert( struct_ptr != NULL );
HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
@@ -2282,13 +4957,13 @@ done:
* Programmer: John Mainzer
*
* Purpose: Verify that the supplied transaction is in progress,
- * and that at least one journal entry has been written
- * under it.
+ * and that at least one journal entry has been written
+ * under it.
*
- * Then write an end transaction message to the ring
+ * Then write an end transaction message to the ring
* buffer.
*
- * Make note that the supplied transaction is closed,
+ * Make note that the supplied transaction is closed,
* and that no transaction is in progress.
*
* Returns: SUCCEED on success.
@@ -2309,7 +4984,7 @@ H5C2_jb_bjf__end_transaction(H5C2_jbrb_t * struct_ptr,
HDassert( struct_ptr != NULL );
HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
HDassert( struct_ptr->human_readable == FALSE );
-
+
/* Verify that the supplied transaction is in progress */
if ( ( struct_ptr->trans_in_prog != TRUE ) ||
( struct_ptr->cur_trans != trans_num ) ) {
@@ -2317,9 +4992,9 @@ H5C2_jb_bjf__end_transaction(H5C2_jbrb_t * struct_ptr,
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"Transaction not in progress or bad transaction number.")
} /* end if */
-
- /* Verify that at least one journal entry has been written under
- * the current transaction
+
+ /* Verify that at least one journal entry has been written under
+ * the current transaction
*/
if ( struct_ptr->jentry_written != TRUE ) {
@@ -2341,8 +5016,8 @@ H5C2_jb_bjf__end_transaction(H5C2_jbrb_t * struct_ptr,
trans_num, \
/* fail_return */ FAIL)
- /* reset boolean flag indicating that at least one journal entry has
- * been written under transaction
+ /* reset boolean flag indicating that at least one journal entry has
+ * been written under transaction
*/
struct_ptr->jentry_written = FALSE;
@@ -2350,7 +5025,7 @@ H5C2_jb_bjf__end_transaction(H5C2_jbrb_t * struct_ptr,
struct_ptr->trans_in_prog = FALSE;
done:
-
+
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5C2_jb_bjf__end_transaction */
@@ -2362,15 +5037,15 @@ done:
*
* Programmer: John Mainzer
*
- * Purpose: Write an end of address space message with the
+ * Purpose: Write an end of address space message with the
* supplied EOA in binary format to the journal file.
*
- * Note that EOA messages are not generated by the
- * metadata cache, and thus are not associated with
+ * Note that EOA messages are not generated by the
+ * metadata cache, and thus are not associated with
* transactions. Since H5C2_jb__write_to_buffer()
- * expects a transaction number, we use
+ * expects a transaction number, we use
* struct_ptr->cur_trans and pass is_end_trans
- * as FALSE. However, this is just a cluge to
+ * as FALSE. However, this is just a cluge to
* keep pre-existing code happy.
*
* Returns: SUCCEED on success.
@@ -2379,21 +5054,21 @@ done:
*
******************************************************************************/
-static herr_t
+static herr_t
H5C2_jb_bjf__eoa(H5C2_jbrb_t * struct_ptr,
haddr_t eoa)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5C2_jb_bjf__eoa, FAIL)
-
+
/* Check Arguments */
HDassert( struct_ptr != NULL );
HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
HDassert( struct_ptr->human_readable == FALSE );
HDassert( struct_ptr->hdf5_file_name != NULL );
- /* Verify that header message is present in journal file or ring buffer.
- * If not, write it.
+ /* Verify that header message is present in journal file or ring buffer.
+ * If not, write it.
*/
if ( struct_ptr->header_present == FALSE ) {
@@ -2404,10 +5079,10 @@ H5C2_jb_bjf__eoa(H5C2_jbrb_t * struct_ptr,
}
} /* end if */
- /* Note that EOA messages are not generated by the metadata cache, and
- * thus are not associated with transactions. Since
- * H5C2_jb__write_to_buffer() expects a transaction number, we use
- * struct_ptr->cur_trans and pass is_end_trans as FALSE. However,
+ /* Note that EOA messages are not generated by the metadata cache, and
+ * thus are not associated with transactions. Since
+ * H5C2_jb__write_to_buffer() expects a transaction number, we use
+ * struct_ptr->cur_trans and pass is_end_trans as FALSE. However,
* this is just a cluge to keep pre-existing code happy.
*/
@@ -2446,7 +5121,7 @@ done:
*
******************************************************************************/
-static herr_t
+static herr_t
H5C2_jb_bjf__journal_entry(H5C2_jbrb_t * struct_ptr,
uint64_t trans_num,
haddr_t base_addr,
@@ -2507,8 +5182,8 @@ H5C2_jb_bjf__journal_entry(H5C2_jbrb_t * struct_ptr,
trans_num, \
/* fail_return */ FAIL)
- /* Indicate that at least one journal entry has been written under
- * this transaction
+ /* Indicate that at least one journal entry has been written under
+ * this transaction
*/
struct_ptr->jentry_written = TRUE;
@@ -2527,9 +5202,9 @@ done:
* Programmer: John Mainzer
*
* Purpose: Verify that there is no transaction in progress, and
- * that the supplied transaction number greater than
- * the last. Then write a binary start transaction
- * message to the ring buffer. Make note of the fact
+ * that the supplied transaction number greater than
+ * the last. Then write a binary start transaction
+ * message to the ring buffer. Make note of the fact
* that the supplied transaction is in progress.
*
* Returns: SUCCEED on success.
@@ -2538,7 +5213,7 @@ done:
*
******************************************************************************/
-static herr_t
+static herr_t
H5C2_jb_bjf__start_transaction(H5C2_jbrb_t * struct_ptr,
uint64_t trans_num)
@@ -2551,7 +5226,7 @@ H5C2_jb_bjf__start_transaction(H5C2_jbrb_t * struct_ptr,
HDassert(struct_ptr);
HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
HDassert(struct_ptr->human_readable == FALSE );
-
+
/* Verify that there is no transaction in progress */
if ( struct_ptr->trans_in_prog != FALSE ) {
@@ -2566,8 +5241,8 @@ H5C2_jb_bjf__start_transaction(H5C2_jbrb_t * struct_ptr,
"New transaction out of sequence.")
} /* end if */
- /* Verify that header message is present in journal file or ring buffer.
- * If not, write it.
+ /* Verify that header message is present in journal file or ring buffer.
+ * If not, write it.
*/
if ( struct_ptr->header_present == FALSE ) {
@@ -2593,13 +5268,13 @@ H5C2_jb_bjf__start_transaction(H5C2_jbrb_t * struct_ptr,
/* is_end_trans */ FALSE, \
trans_num, \
/* fail_return */ FAIL)
-
+
/* Make note of the fact that supplied transaction is in progress */
struct_ptr->trans_in_prog = TRUE;
struct_ptr->cur_trans = trans_num;
done:
-
+
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5C2_jb_bjf__start_transaction */
@@ -2612,16 +5287,16 @@ done:
* Programmer: John Mainzer
* 4/24/09
*
- * Purpose: Copy the supplied buffer to the ring buffer as
+ * Purpose: Copy the supplied buffer to the ring buffer as
* efficiently as possible.
*
- * If there is space available in the current buffer in
- * the ring buffer is big enough, just memcpy the
+ * If there is space available in the current buffer in
+ * the ring buffer is big enough, just memcpy the
* supplied buffer directly into the ring buffer buffer
- * and update its fields accordingly.
+ * and update its fields accordingly.
*
- * If the supplied buffer will cross ring buffer buffer
- * boundaries, for now just call
+ * If the supplied buffer will cross ring buffer buffer
+ * boundaries, for now just call
* H5C2_jb__write_to_buffer().
*
* In either case, if struct_ptr->chksum_cur_msg is TRUE,
@@ -2634,11 +5309,13 @@ done:
* Returns: SUCCEED on success.
* FAIL on failure.
*
- * Changes: None.
+ * Changes: Updated to updated fields used only in the SIO case
+ * only when SIO is selected.
+ * JRM -- 1/14/10
*
******************************************************************************/
-static herr_t
+static herr_t
H5C2_jb_bjf__write_buffer(H5C2_jbrb_t * struct_ptr,
size_t buf_size,
const char * buf_ptr,
@@ -2653,7 +5330,30 @@ H5C2_jb_bjf__write_buffer(H5C2_jbrb_t * struct_ptr,
HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
HDassert( buf_size > 0 );
HDassert( buf_ptr != NULL );
- HDassert( trans_num > 0 );
+ HDassert( trans_num > 0 );
+ HDassert( ( ! struct_ptr->use_aio )
+ ||
+ ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use < struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress + 1 == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->cur_buf_free_space < struct_ptr->buf_size )
+ &&
+ ( struct_ptr->cur_buf_free_space > 0 )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use == struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == 0 )
+ )
+ );
/* is_end_trans must be FALSE if struct_ptr->chksum_cur_msg is TRUE.
* Throw an error if this invarient doesn't hold.
@@ -2668,8 +5368,8 @@ H5C2_jb_bjf__write_buffer(H5C2_jbrb_t * struct_ptr,
/* Update the check sum if required */
if ( struct_ptr->chksum_cur_msg ) {
- struct_ptr->msg_chksum = H5_checksum_metadata((const void *)(buf_ptr),
- buf_size,
+ struct_ptr->msg_chksum = H5_checksum_metadata((const void *)(buf_ptr),
+ buf_size,
struct_ptr->msg_chksum);
}
@@ -2677,18 +5377,29 @@ H5C2_jb_bjf__write_buffer(H5C2_jbrb_t * struct_ptr,
/* If the buffer will fit in the current ring buffer buffer with space
* left over, just memcpy() it in and touch up the ring buffer
- * fields accordingly.
+ * fields accordingly.
*
- * This is the common case, so when we convert this function into
- * a macro, this will allow us to avoid a function call in the vast
+ * This is the common case, so when we convert this function into
+ * a macro, this will allow us to avoid a function call in the vast
* majority of cases.
*/
/* write data into journal buffer */
HDmemcpy(struct_ptr->head, (const void *)buf_ptr, buf_size);
- /* increment bufs_in_use as necessary */
- if ( ( struct_ptr->bufs_in_use == 0 ) ) {
+ /* increment bufs_in_use as necessary -- do this differently
+ * for aio and sio.
+ */
+ if ( ( ( struct_ptr->bufs_in_use == 0 )
+ &&
+ ( ! struct_ptr->use_aio )
+ )
+ ||
+ ( ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size )
+ &&
+ ( struct_ptr->use_aio )
+ )
+ ) {
struct_ptr->bufs_in_use++;
}
@@ -2696,27 +5407,32 @@ H5C2_jb_bjf__write_buffer(H5C2_jbrb_t * struct_ptr,
/* update head pointer */
struct_ptr->head = &(struct_ptr->head[buf_size]);
- /* update rb_free_space */
- struct_ptr->rb_free_space -= buf_size;
-
/* update current buffer usage */
struct_ptr->cur_buf_free_space -= buf_size;
- /* update end of buffer space */
- struct_ptr->rb_space_to_rollover -= buf_size;
+ if ( ! struct_ptr->use_aio ) {
+
+ /* update fields used only with SIO: */
+
+ /* update rb_free_space */
+ struct_ptr->rb_free_space -= buf_size;
+
+ /* update end of buffer space */
+ struct_ptr->rb_space_to_rollover -= buf_size;
+ }
if ( is_end_trans == TRUE ) {
(*struct_ptr->trans_tracking)[struct_ptr->put] = trans_num;
- }
+ }
HDassert( struct_ptr->cur_buf_free_space > 0 );
} else {
/* Here, handle the case where the write will reach the edge
- * of a ring buffer buffer. This gets a bit more complex, so
- * for now at least, we will call H5C2_jb__write_to_buffer().
+ * of a ring buffer buffer. This gets a bit more complex, so
+ * for now at least, we will call H5C2_jb__write_to_buffer().
* If this proves too costly, further optimizations will be necessary.
*/
@@ -2728,12 +5444,35 @@ H5C2_jb_bjf__write_buffer(H5C2_jbrb_t * struct_ptr,
}
}
+ HDassert( ( ! struct_ptr->use_aio )
+ ||
+ ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use < struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress + 1 == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->cur_buf_free_space < struct_ptr->buf_size )
+ &&
+ ( struct_ptr->cur_buf_free_space > 0 )
+ )
+ ||
+ ( ( struct_ptr->writes_in_progress == struct_ptr->bufs_in_use )
+ &&
+ ( struct_ptr->bufs_in_use == struct_ptr->num_bufs )
+ &&
+ ( struct_ptr->cur_buf_free_space == 0 )
+ )
+ );
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* H5C2_jb_bjf__write_buffer() */
-
+
/******************************************************************************
*
@@ -2744,15 +5483,15 @@ done:
*
* Purpose: Write the checksum of a binary journal file message
* to the ring buffer as eficiently as possible. Note
- * that this checksum is computed only on the body of
+ * that this checksum is computed only on the body of
* the message -- not the signature and version.
*
- * If there is space available in the current buffer in
+ * If there is space available in the current buffer in
* the ring buffer is big enough, just write the chksum
- * directly into the ring buffer buffer and update its
- * fields accordingly.
+ * directly into the ring buffer buffer and update its
+ * fields accordingly.
*
- * If the chksum will cross ring buffer buffer boundaries,
+ * If the chksum will cross ring buffer buffer boundaries,
* for now just call H5C2_jb__write_to_buffer().
*
* Note that this function will probably prove to be
@@ -2763,9 +5502,11 @@ done:
* FAIL on failure.
*
******************************************************************************/
-static herr_t
-H5C2_jb_bjf__write_chksum(H5C2_jbrb_t * struct_ptr, hbool_t is_end_trans,
- uint64_t trans_num)
+
+static herr_t
+H5C2_jb_bjf__write_chksum(H5C2_jbrb_t * struct_ptr,
+ hbool_t is_end_trans,
+ uint64_t trans_num)
{
uint8_t *p;
herr_t ret_value = SUCCEED; /* Return value */
@@ -2775,19 +5516,22 @@ H5C2_jb_bjf__write_chksum(H5C2_jbrb_t * struct_ptr, hbool_t is_end_trans,
/* Sanity check */
HDassert(struct_ptr != NULL);
HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
- HDassert(trans_num > 0);
+ HDassert(trans_num > 0);
- if(!struct_ptr->chksum_cur_msg)
- HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "struct_ptr->chksum_cur_msg is false?!?!.")
+ if ( ! struct_ptr->chksum_cur_msg ) {
- if(H5C2__CHECKSUM_SIZE < struct_ptr->cur_buf_free_space) {
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
+ "struct_ptr->chksum_cur_msg is false?!?!.")
+ }
+
+ if ( H5C2__CHECKSUM_SIZE < struct_ptr->cur_buf_free_space ) {
/* If the checksum will fit in the current buffer with space
- * left over, just write it directly into the buffer, and
- * touch up the ring buffer fields accordingly.
+ * left over, just write it directly into the buffer, and
+ * touch up the ring buffer fields accordingly.
*
- * This is the common case, so when we convert this function into
- * a macro, this will allow us to avoid a function call in the vast
+ * This is the common case, so when we convert this function into
+ * a macro, this will allow us to avoid a function call in the vast
* majority of cases.
*/
@@ -2799,21 +5543,38 @@ H5C2_jb_bjf__write_chksum(H5C2_jbrb_t * struct_ptr, hbool_t is_end_trans,
HDassert( p == ((uint8_t *)(struct_ptr->head + H5C2__CHECKSUM_SIZE)) );
- /* increment bufs_in_use as necessary */
- if(struct_ptr->bufs_in_use == 0 )
+ /* increment bufs_in_use as necessary -- do this differently
+ * for aio and sio.
+ */
+ if ( ( ( struct_ptr->bufs_in_use == 0 )
+ &&
+ ( ! struct_ptr->use_aio )
+ )
+ ||
+ ( ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size )
+ &&
+ ( struct_ptr->use_aio )
+ )
+ ) {
+
struct_ptr->bufs_in_use++;
+ }
/* update head pointer */
struct_ptr->head = &(struct_ptr->head[H5C2__CHECKSUM_SIZE]);
- /* update rb_free_space */
- struct_ptr->rb_free_space -= H5C2__CHECKSUM_SIZE;
-
/* update current buffer usage */
struct_ptr->cur_buf_free_space -= H5C2__CHECKSUM_SIZE;
- /* update end of buffer space */
- struct_ptr->rb_space_to_rollover -= H5C2__CHECKSUM_SIZE;
+ /* update fields used only with SIO: */
+ if( ! struct_ptr->use_aio ) {
+
+ /* update rb_free_space */
+ struct_ptr->rb_free_space -= H5C2__CHECKSUM_SIZE;
+
+ /* update end of buffer space */
+ struct_ptr->rb_space_to_rollover -= H5C2__CHECKSUM_SIZE;
+ }
if(is_end_trans)
(*struct_ptr->trans_tracking)[struct_ptr->put] = trans_num;
@@ -2822,22 +5583,29 @@ H5C2_jb_bjf__write_chksum(H5C2_jbrb_t * struct_ptr, hbool_t is_end_trans,
} /* end if */
else {
+
uint8_t buf[H5C2__CHECKSUM_SIZE + 1];
/* Here, handle the case where the write will reach the edge
- * of a buffer. This gets a bit more complex, so for now at
- * least, we will construct a buffer containing a binary
- * representation of the checksum, and then call
- * H5C2_jb__write_to_buffer(). If this proves too costly,
+ * of a buffer. This gets a bit more complex, so for now at
+ * least, we will construct a buffer containing a binary
+ * representation of the checksum, and then call
+ * H5C2_jb__write_to_buffer(). If this proves too costly,
* further optimizations will be necessary.
*/
p = buf;
UINT32ENCODE(p, struct_ptr->msg_chksum);
HDassert( p == &(buf[H5C2__CHECKSUM_SIZE]) );
- if(H5C2_jb__write_to_buffer(struct_ptr, H5C2__CHECKSUM_SIZE,
- (const char *)buf, is_end_trans, trans_num) < 0)
- HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "H5C2_jb__write_to_buffer() failed.")
+ if ( H5C2_jb__write_to_buffer(struct_ptr,
+ H5C2__CHECKSUM_SIZE,
+ (const char *)buf,
+ is_end_trans,
+ trans_num) < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
+ "H5C2_jb__write_to_buffer() failed.")
+ }
} /* end else */
/* re-set the checksum computation fields */
@@ -2845,9 +5613,11 @@ H5C2_jb_bjf__write_chksum(H5C2_jbrb_t * struct_ptr, hbool_t is_end_trans,
struct_ptr->msg_chksum = 0;
done:
+
FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C2_jb_bjf__write_chksum() */
+} /* H5C2_jb_bjf__write_chksum() */
+
/******************************************************************************
*
@@ -2856,15 +5626,15 @@ done:
* Programmer: John Mainzer
* 4/24/09
*
- * Purpose: Write a HDF5 file length to the ring buffer as
+ * Purpose: Write a HDF5 file length to the ring buffer as
* efficiently as possible.
*
- * If the space available in the current buffer in
- * the ring buffer is big enough, just encode the
- * lenght directly into the buffer and update its
- * fields accordingly.
+ * If the space available in the current buffer in
+ * the ring buffer is big enough, just encode the
+ * lenght directly into the buffer and update its
+ * fields accordingly.
*
- * If the binary representation of the length will
+ * If the binary representation of the length will
* touch buffer boundaries, create a buffer containing
* the binary representation of the length, and then
* call H5C2_jb__write_to_buffer() to handle the write.
@@ -2883,7 +5653,7 @@ done:
*
******************************************************************************/
-static herr_t
+static herr_t
H5C2_jb_bjf__write_length(H5C2_jbrb_t * struct_ptr,
size_t length,
hbool_t is_end_trans,
@@ -2897,7 +5667,7 @@ H5C2_jb_bjf__write_length(H5C2_jbrb_t * struct_ptr,
HDassert( struct_ptr != NULL );
HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
- HDassert( trans_num > 0 );
+ HDassert( trans_num > 0 );
/* is_end_trans must be FALSE if struct_ptr->chksum_cur_msg is TRUE.
* Throw an error if this invarient doesn't hold.
@@ -2909,20 +5679,20 @@ H5C2_jb_bjf__write_length(H5C2_jbrb_t * struct_ptr,
"is_end_trans and struct_ptr->chksum_cur_msg both true.")
}
- length_width = struct_ptr->length_width;
+ length_width = (size_t)(struct_ptr->length_width);
- HDassert( ( length_width == 2 ) ||
- ( length_width == 4 ) ||
+ HDassert( ( length_width == 2 ) ||
+ ( length_width == 4 ) ||
( length_width == 8 ) );
if ( length_width < struct_ptr->cur_buf_free_space ) {
/* If the offset will fit in the current buffer with space
- * left over, just write it directly into the buffer, and
- * touch up the ring buffer fields accordingly.
+ * left over, just write it directly into the buffer, and
+ * touch up the ring buffer fields accordingly.
*
- * This is the common case, so when we convert this function into
- * a macro, this will allow us to avoid a function call in the vast
+ * This is the common case, so when we convert this function into
+ * a macro, this will allow us to avoid a function call in the vast
* majority of cases.
*/
@@ -2952,8 +5722,19 @@ H5C2_jb_bjf__write_length(H5C2_jbrb_t * struct_ptr,
HDassert( p == ((uint8_t *)(struct_ptr->head + length_width)) );
- /* increment bufs_in_use as necessary */
- if ( ( struct_ptr->bufs_in_use == 0 ) ) {
+ /* increment bufs_in_use as necessary -- do this differently
+ * for aio and sio.
+ */
+ if ( ( ( struct_ptr->bufs_in_use == 0 )
+ &&
+ ( ! struct_ptr->use_aio )
+ )
+ ||
+ ( ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size )
+ &&
+ ( struct_ptr->use_aio )
+ )
+ ) {
struct_ptr->bufs_in_use++;
}
@@ -2961,38 +5742,42 @@ H5C2_jb_bjf__write_length(H5C2_jbrb_t * struct_ptr,
/* Update the check sum if required */
if ( struct_ptr->chksum_cur_msg ) {
- struct_ptr->msg_chksum =
- H5_checksum_metadata((const void *)(struct_ptr->head),
- length_width,
+ struct_ptr->msg_chksum =
+ H5_checksum_metadata((const void *)(struct_ptr->head),
+ length_width,
struct_ptr->msg_chksum);
}
/* update head pointer */
struct_ptr->head = &(struct_ptr->head[length_width]);
- /* update rb_free_space */
- struct_ptr->rb_free_space -= length_width;
-
/* update current buffer usage */
struct_ptr->cur_buf_free_space -= length_width;
- /* update end of buffer space */
- struct_ptr->rb_space_to_rollover -= length_width;
+ /* update fields used only with SIO: */
+ if( ! struct_ptr->use_aio ) {
+
+ /* update rb_free_space */
+ struct_ptr->rb_free_space -= length_width;
+
+ /* update end of buffer space */
+ struct_ptr->rb_space_to_rollover -= length_width;
+ }
if ( is_end_trans == TRUE ) {
(*struct_ptr->trans_tracking)[struct_ptr->put] = trans_num;
- }
+ }
HDassert( struct_ptr->cur_buf_free_space > 0 );
} else {
/* Here, handle the case where the write will reach the edge
- * of a buffer. This gets a bit more complex, so for now at
- * least, we will construct a buffer containing a binary
- * representation of the offset, and then call
- * H5C2_jb__write_to_buffer(). If this proves too costly,
+ * of a buffer. This gets a bit more complex, so for now at
+ * least, we will construct a buffer containing a binary
+ * representation of the offset, and then call
+ * H5C2_jb__write_to_buffer(). If this proves too costly,
* further optimizations will be necessary.
*/
@@ -3014,27 +5799,38 @@ H5C2_jb_bjf__write_length(H5C2_jbrb_t * struct_ptr,
break;
default:
- HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "length_width out of range (2).")
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
+ "length_width out of range (2).")
break;
} /* end switch */
HDassert( p == &(buf[length_width]) );
- if(H5C2_jb__write_to_buffer(struct_ptr, length_width,
+
+ if ( H5C2_jb__write_to_buffer(struct_ptr, length_width,
(const char *)buf,
- is_end_trans, trans_num) != SUCCEED)
- HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "H5C2_jb__write_to_buffer() failed.")
+ is_end_trans,
+ trans_num) != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
+ "H5C2_jb__write_to_buffer() failed.")
+ }
/* Update the check sum if required */
- if(struct_ptr->chksum_cur_msg)
- struct_ptr->msg_chksum = H5_checksum_metadata((const void *)(buf),
- length_width,
- struct_ptr->msg_chksum);
+ if ( struct_ptr->chksum_cur_msg ) {
+
+ struct_ptr->msg_chksum =
+ H5_checksum_metadata((const void *)(buf),
+ length_width,
+ struct_ptr->msg_chksum);
+ }
} /* end else */
done:
+
FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C2_jb_bjf__write_length() */
+} /* H5C2_jb_bjf__write_length() */
+
/******************************************************************************
*
@@ -3043,15 +5839,15 @@ done:
* Programmer: John Mainzer
* 4/24/09
*
- * Purpose: Write a HDF5 file offset to the ring buffer as
+ * Purpose: Write a HDF5 file offset to the ring buffer as
* efficiently as possible.
*
- * If the space available in the current buffer in
- * the ring buffer is big enough, just encode the
- * offset directly into the buffer and update its
- * fields accordingly.
+ * If the space available in the current buffer in
+ * the ring buffer is big enough, just encode the
+ * offset directly into the buffer and update its
+ * fields accordingly.
*
- * If the binary representation of the offset will
+ * If the binary representation of the offset will
* touch buffer boundaries, create a buffer containing
* the binary representation of the offset, and then
* call H5C2_jb__write_to_buffer() to handle the write.
@@ -3070,7 +5866,7 @@ done:
*
******************************************************************************/
-static herr_t
+static herr_t
H5C2_jb_bjf__write_offset(H5C2_jbrb_t * struct_ptr,
haddr_t offset,
hbool_t is_end_trans,
@@ -3085,11 +5881,11 @@ H5C2_jb_bjf__write_offset(H5C2_jbrb_t * struct_ptr,
HDassert( struct_ptr != NULL );
HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
/* eoa messages can be written outside transactions -- so it is
- * possible that the trans_num will be 0. Since the trans_num is
+ * possible that the trans_num will be 0. Since the trans_num is
* not used unless is_end_trans is TRUE, we make an exception for
* the eoa message.
*/
- HDassert( ( ! is_end_trans ) || ( trans_num > 0 ) );
+ HDassert( ( ! is_end_trans ) || ( trans_num > 0 ) );
/* is_end_trans must be FALSE if struct_ptr->chksum_cur_msg is TRUE.
* Throw an error if this invarient doesn't hold.
@@ -3101,20 +5897,20 @@ H5C2_jb_bjf__write_offset(H5C2_jbrb_t * struct_ptr,
"is_end_trans and struct_ptr->chksum_cur_msg both true.")
}
- offset_width = struct_ptr->offset_width;
+ offset_width = (size_t)(struct_ptr->offset_width);
- HDassert( ( offset_width == 2 ) ||
- ( offset_width == 4 ) ||
+ HDassert( ( offset_width == 2 ) ||
+ ( offset_width == 4 ) ||
( offset_width == 8 ) );
if ( offset_width < struct_ptr->cur_buf_free_space ) {
/* If the offset will fit in the current buffer with space
- * left over, just write it directly into the buffer, and
- * touch up the ring buffer fields accordingly.
+ * left over, just write it directly into the buffer, and
+ * touch up the ring buffer fields accordingly.
*
- * This is the common case, so when we convert this function into
- * a macro, this will allow us to avoid a function call in the vast
+ * This is the common case, so when we convert this function into
+ * a macro, this will allow us to avoid a function call in the vast
* majority of cases.
*/
@@ -3144,8 +5940,19 @@ H5C2_jb_bjf__write_offset(H5C2_jbrb_t * struct_ptr,
HDassert( p == ((uint8_t *)(struct_ptr->head + offset_width)) );
- /* increment bufs_in_use as necessary */
- if ( ( struct_ptr->bufs_in_use == 0 ) ) {
+ /* increment bufs_in_use as necessary -- do this differently
+ * for aio and sio.
+ */
+ if ( ( ( struct_ptr->bufs_in_use == 0 )
+ &&
+ ( ! struct_ptr->use_aio )
+ )
+ ||
+ ( ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size )
+ &&
+ ( struct_ptr->use_aio )
+ )
+ ) {
struct_ptr->bufs_in_use++;
}
@@ -3153,38 +5960,42 @@ H5C2_jb_bjf__write_offset(H5C2_jbrb_t * struct_ptr,
/* Update the check sum if required */
if ( struct_ptr->chksum_cur_msg ) {
- struct_ptr->msg_chksum =
- H5_checksum_metadata((const void *)(struct_ptr->head),
- offset_width,
+ struct_ptr->msg_chksum =
+ H5_checksum_metadata((const void *)(struct_ptr->head),
+ offset_width,
struct_ptr->msg_chksum);
}
/* update head pointer */
struct_ptr->head = &(struct_ptr->head[offset_width]);
- /* update rb_free_space */
- struct_ptr->rb_free_space -= offset_width;
-
/* update current buffer usage */
struct_ptr->cur_buf_free_space -= offset_width;
- /* update end of buffer space */
- struct_ptr->rb_space_to_rollover -= offset_width;
+ /* update fields used only with SIO: */
+ if( ! struct_ptr->use_aio ) {
+
+ /* update rb_free_space */
+ struct_ptr->rb_free_space -= offset_width;
+
+ /* update end of buffer space */
+ struct_ptr->rb_space_to_rollover -= offset_width;
+ }
if ( is_end_trans == TRUE ) {
(*struct_ptr->trans_tracking)[struct_ptr->put] = trans_num;
- }
+ }
HDassert( struct_ptr->cur_buf_free_space > 0 );
} else {
/* Here, handle the case where the write will reach the edge
- * of a buffer. This gets a bit more complex, so for now at
- * least, we will construct a buffer containing a binary
- * representation of the offset, and then call
- * H5C2_jb__write_to_buffer(). If this proves too costly,
+ * of a buffer. This gets a bit more complex, so for now at
+ * least, we will construct a buffer containing a binary
+ * representation of the offset, and then call
+ * H5C2_jb__write_to_buffer(). If this proves too costly,
* further optimizations will be necessary.
*/
@@ -3216,7 +6027,7 @@ H5C2_jb_bjf__write_offset(H5C2_jbrb_t * struct_ptr,
HDassert( p == &(buf[offset_width]) );
- if ( H5C2_jb__write_to_buffer(struct_ptr, offset_width,
+ if ( H5C2_jb__write_to_buffer(struct_ptr, offset_width,
(const char *)buf,
is_end_trans, trans_num) != SUCCEED ) {
@@ -3227,8 +6038,8 @@ H5C2_jb_bjf__write_offset(H5C2_jbrb_t * struct_ptr,
/* Update the check sum if required */
if ( struct_ptr->chksum_cur_msg ) {
- struct_ptr->msg_chksum = H5_checksum_metadata((const void *)(buf),
- offset_width,
+ struct_ptr->msg_chksum = H5_checksum_metadata((const void *)(buf),
+ offset_width,
struct_ptr->msg_chksum);
}
@@ -3239,7 +6050,7 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
} /* H5C2_jb_bjf__write_offset() */
-
+
/******************************************************************************
*
@@ -3248,24 +6059,24 @@ done:
* Programmer: John Mainzer
* 4/24/09
*
- * Purpose: Write the signature and version of a binary journal
- * file message to the ring buffer as efficiently as
+ * Purpose: Write the signature and version of a binary journal
+ * file message to the ring buffer as efficiently as
* possible.
*
- * If there is space available in the current buffer in
- * the ring buffer is big enough, just memcpy the
- * signature and write the version directly into the
- * buffer and update its fields accordingly.
+ * If there is space available in the current buffer in
+ * the ring buffer is big enough, just memcpy the
+ * signature and write the version directly into the
+ * buffer and update its fields accordingly.
*
- * If the signature and version will cross buffer
- * boundaries, for now just call
+ * If the signature and version will cross buffer
+ * boundaries, for now just call
* H5C2_jb__write_to_buffer().
*
* In either case, if keep_chksum is TRUE, initialize
* struct_ptr->msg_chksum to 0, and set struct_ptr->
* chksum_cur_msg to TRUE.
*
- * Observe that the checksum does not include the
+ * Observe that the checksum does not include the
* signature and version.
*
* Note that this function will probably prove to be
@@ -3275,36 +6086,46 @@ done:
* Returns: SUCCEED on success.
* FAIL on failure.
*
+ * Changes: Updated function for slight differences in buffer
+ * management when aio is enabled.
+ * JRM -- 1/27/09
+ *
******************************************************************************/
-static herr_t
-H5C2_jb_bjf__write_sig_and_ver(H5C2_jbrb_t *struct_ptr, const char *sig_ptr,
- const uint8_t version, hbool_t keep_chksum, hbool_t is_end_trans,
- uint64_t trans_num)
+
+static herr_t
+H5C2_jb_bjf__write_sig_and_ver(H5C2_jbrb_t *struct_ptr,
+ const char *sig_ptr,
+ const uint8_t version,
+ hbool_t keep_chksum,
+ hbool_t is_end_trans,
+ uint64_t trans_num)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5C2_jb_bjf__write_sig_and_ver, FAIL)
- HDassert(struct_ptr);
- HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
- HDassert(sig_ptr);
- HDassert(H5C2_BJNL__SIG_LEN == HDstrlen(sig_ptr));
- HDassert(!is_end_trans);
- /* eoa messages can occur outside of transactions -- and thus it is
- * possible that we will have to process one before any transaction
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( sig_ptr != NULL );
+ HDassert( H5C2_BJNL__SIG_LEN == HDstrlen(sig_ptr) );
+ HDassert( ! is_end_trans );
+
+ /* eoa messages can occur outside of transactions -- and thus it is
+ * possible that we will have to process one before any transaction
* has started -- in which case trans_num will be 0. Since the trans_num
- * isn't used unless is_end_trans is TRUE, we carve a small exception
+ * isn't used unless is_end_trans is TRUE, we carve a small exception
* for the eoa message.
*/
HDassert((!is_end_trans) || (trans_num > 0));
- if((H5C2_BJNL__SIG_LEN + 1) < struct_ptr->cur_buf_free_space) {
- /* If the signature and version will fit in the current buffer
- * with space left over, just memcpy()/write it in and touch up
- * the ring bufferfields accordingly.
+ if ( (H5C2_BJNL__SIG_LEN + 1) < struct_ptr->cur_buf_free_space ) {
+
+ /* If the signature and version will fit in the current buffer
+ * with space left over, just memcpy()/write it in and touch up
+ * the ring bufferfields accordingly.
*
- * This is the common case, so when we convert this function into
- * a macro, this will allow us to avoid a function call in the vast
+ * This is the common case, so when we convert this function into
+ * a macro, this will allow us to avoid a function call in the vast
* majority of cases.
*/
@@ -3316,55 +6137,92 @@ H5C2_jb_bjf__write_sig_and_ver(H5C2_jbrb_t *struct_ptr, const char *sig_ptr,
/* update head pointer */
struct_ptr->head = &(struct_ptr->head[H5C2_BJNL__SIG_LEN + 1]);
- /* increment bufs_in_use as necessary */
- if(struct_ptr->bufs_in_use == 0)
- struct_ptr->bufs_in_use++;
+ /* increment bufs_in_use as necessary -- do this differently
+ * for aio and sio.
+ */
+ if ( ( ( struct_ptr->bufs_in_use == 0 )
+ &&
+ ( ! struct_ptr->use_aio )
+ )
+ ||
+ ( ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size )
+ &&
+ ( struct_ptr->use_aio )
+ )
+ ) {
- /* update rb_free_space */
- struct_ptr->rb_free_space -= H5C2_BJNL__SIG_LEN + 1;
+ struct_ptr->bufs_in_use++;
+ }
/* update current buffer usage */
struct_ptr->cur_buf_free_space -= H5C2_BJNL__SIG_LEN + 1;
- /* update end of buffer space */
- struct_ptr->rb_space_to_rollover -= H5C2_BJNL__SIG_LEN + 1;
+ /* update fields used only with SIO: */
+ if( ! struct_ptr->use_aio ) {
+
+ /* update rb_free_space */
+ struct_ptr->rb_free_space -= H5C2_BJNL__SIG_LEN + 1;
+
+ /* update end of buffer space */
+ struct_ptr->rb_space_to_rollover -= H5C2_BJNL__SIG_LEN + 1;
+ }
- /* is_end_trans must be false in this call, so just throw an
+ /* is_end_trans must be false in this call, so just throw an
* error if it is TRUE.
*/
- if(is_end_trans)
- HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "is_end_trans TRUE when writing signiture.")
+ if ( is_end_trans ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
+ "is_end_trans TRUE when writing signiture.")
+ }
HDassert( struct_ptr->cur_buf_free_space > 0 );
+
} /* end if */
else {
+
uint8_t buf[H5C2_BJNL__SIG_LEN + 2];
/* Here, handle the case where the write will reach the edge
- * of a buffer. This gets a bit more complex, so for now at
- * least, we will call H5C2_jb__write_to_buffer(). If this
+ * of a buffer. This gets a bit more complex, so for now at
+ * least, we will call H5C2_jb__write_to_buffer(). If this
* proves too costly, further optimizations will be necessary.
*/
+
HDmemcpy(buf, (const void *)sig_ptr, H5C2_BJNL__SIG_LEN);
+
buf[H5C2_BJNL__SIG_LEN] = version;
- if(H5C2_jb__write_to_buffer(struct_ptr, H5C2_BJNL__SIG_LEN + 1,
- (const char *)buf, is_end_trans, trans_num) < 0)
- HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "H5C2_jb__write_to_buffer() failed.")
+ if ( H5C2_jb__write_to_buffer(struct_ptr,
+ H5C2_BJNL__SIG_LEN + 1,
+ (const char *)buf,
+ is_end_trans,
+ trans_num) < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
+ "H5C2_jb__write_to_buffer() failed.")
+ }
} /* end else */
- if(struct_ptr->chksum_cur_msg)
- HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "struct_ptr->chksum_cur_msg is already TRUE")
+ if ( struct_ptr->chksum_cur_msg ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
+ "struct_ptr->chksum_cur_msg is already TRUE")
+ }
+
+ if ( keep_chksum ) {
- if(keep_chksum) {
struct_ptr->chksum_cur_msg = TRUE;
struct_ptr->msg_chksum = 0;
+
} /* end if */
done:
+
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5C2_jb_bjf__write_sig_and_ver() */
+} /* end H5C2_jb_bjf__write_sig_and_ver() */
+
/******************************************************************************
*
@@ -3373,17 +6231,17 @@ done:
* Programmer: John Mainzer
* 4/24/09
*
- * Purpose: Write the transaction number in a binary journal file
+ * Purpose: Write the transaction number in a binary journal file
* message to the ring buffer as efficiently as possible.
*
- * If the space available in the current buffer in
- * the ring buffer is big enough, just write the
- * transaction number directly into the buffer and
- * update its fields accordingly.
+ * If the space available in the current buffer in
+ * the ring buffer is big enough, just write the
+ * transaction number directly into the buffer and
+ * update its fields accordingly.
*
- * If the transaction will cross or touch buffer
- * boundaries, construct binary representation of the
- * transaction number in a buffer, and pass it to
+ * If the transaction will cross or touch buffer
+ * boundaries, construct binary representation of the
+ * transaction number in a buffer, and pass it to
* H5C2_jb__write_to_buffer().
*
* In either case, if struct_ptr->chksum_cur_msg is TRUE,
@@ -3400,7 +6258,7 @@ done:
*
******************************************************************************/
-static herr_t
+static herr_t
H5C2_jb_bjf__write_trans_num(H5C2_jbrb_t * struct_ptr,
hbool_t is_end_trans,
uint64_t trans_num)
@@ -3412,7 +6270,7 @@ H5C2_jb_bjf__write_trans_num(H5C2_jbrb_t * struct_ptr,
HDassert( struct_ptr != NULL );
HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
- HDassert( trans_num > 0 );
+ HDassert( trans_num > 0 );
/* is_end_trans must be FALSE if struct_ptr->chksum_cur_msg is TRUE.
* Throw an error if this invarient doesn't hold.
@@ -3427,11 +6285,11 @@ H5C2_jb_bjf__write_trans_num(H5C2_jbrb_t * struct_ptr,
if ( H5C2__TRANS_NUM_SIZE < struct_ptr->cur_buf_free_space ) {
/* If the transaction number will fit in the current buffer with space
- * left over, just write it directly into the buffer, and touch up the
- * ring buffer fields accordingly.
+ * left over, just write it directly into the buffer, and touch up the
+ * ring buffer fields accordingly.
*
- * This is the common case, so when we convert this function into
- * a macro, this will allow us to avoid a function call in the vast
+ * This is the common case, so when we convert this function into
+ * a macro, this will allow us to avoid a function call in the vast
* majority of cases.
*/
@@ -3441,8 +6299,19 @@ H5C2_jb_bjf__write_trans_num(H5C2_jbrb_t * struct_ptr,
HDassert( p == ((uint8_t *)(struct_ptr->head + H5C2__TRANS_NUM_SIZE)) );
- /* increment bufs_in_use as necessary */
- if ( ( struct_ptr->bufs_in_use == 0 ) ) {
+ /* increment bufs_in_use as necessary -- do this differently
+ * for aio and sio.
+ */
+ if ( ( ( struct_ptr->bufs_in_use == 0 )
+ &&
+ ( ! struct_ptr->use_aio )
+ )
+ ||
+ ( ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size )
+ &&
+ ( struct_ptr->use_aio )
+ )
+ ) {
struct_ptr->bufs_in_use++;
}
@@ -3450,35 +6319,40 @@ H5C2_jb_bjf__write_trans_num(H5C2_jbrb_t * struct_ptr,
/* Update the check sum if required */
if ( struct_ptr->chksum_cur_msg ) {
- struct_ptr->msg_chksum =
- H5_checksum_metadata((const void *)(struct_ptr->head),
- H5C2__TRANS_NUM_SIZE,
+ struct_ptr->msg_chksum =
+ H5_checksum_metadata((const void *)(struct_ptr->head),
+ H5C2__TRANS_NUM_SIZE,
struct_ptr->msg_chksum);
}
/* update head pointer */
struct_ptr->head = &(struct_ptr->head[H5C2__TRANS_NUM_SIZE]);
- /* update rb_free_space */
- struct_ptr->rb_free_space -= H5C2__TRANS_NUM_SIZE;
-
/* update current buffer usage */
struct_ptr->cur_buf_free_space -= H5C2__TRANS_NUM_SIZE;
- /* update end of buffer space */
- struct_ptr->rb_space_to_rollover -= H5C2__TRANS_NUM_SIZE;
+ /* update fields used only with SIO: */
+ if( ! struct_ptr->use_aio ) {
+
+ /* update rb_free_space */
+ struct_ptr->rb_free_space -= H5C2__TRANS_NUM_SIZE;
+
+ /* update end of buffer space */
+ struct_ptr->rb_space_to_rollover -= H5C2__TRANS_NUM_SIZE;
+ }
+
if ( is_end_trans == TRUE ) {
(*struct_ptr->trans_tracking)[struct_ptr->put] = trans_num;
- }
+ }
HDassert( struct_ptr->cur_buf_free_space > 0 );
} else {
/* Here, handle the case where the write will reach the edge
- * of a buffer. This gets a bit more complex, so for now at
+ * of a buffer. This gets a bit more complex, so for now at
* least, we will construct a buffer containing a binary representation
* of the transaction number, and then call H5C2_jb__write_to_buffer().
* If this proves too costly, further optimizations will be necessary.
@@ -3492,9 +6366,11 @@ H5C2_jb_bjf__write_trans_num(H5C2_jbrb_t * struct_ptr,
HDassert( p == &(buf[H5C2__TRANS_NUM_SIZE]) );
- if ( H5C2_jb__write_to_buffer(struct_ptr, H5C2__TRANS_NUM_SIZE,
+ if ( H5C2_jb__write_to_buffer(struct_ptr,
+ H5C2__TRANS_NUM_SIZE,
(const char *)buf,
- is_end_trans, trans_num) != SUCCEED ) {
+ is_end_trans,
+ trans_num) != SUCCEED ) {
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
"H5C2_jb__write_to_buffer() failed.")
@@ -3503,9 +6379,10 @@ H5C2_jb_bjf__write_trans_num(H5C2_jbrb_t * struct_ptr,
/* Update the check sum if required */
if ( struct_ptr->chksum_cur_msg ) {
- struct_ptr->msg_chksum = H5_checksum_metadata((const void *)(buf),
- H5C2__TRANS_NUM_SIZE,
- struct_ptr->msg_chksum);
+ struct_ptr->msg_chksum =
+ H5_checksum_metadata((const void *)(buf),
+ H5C2__TRANS_NUM_SIZE,
+ struct_ptr->msg_chksum);
}
}
@@ -3530,8 +6407,8 @@ done:
*
******************************************************************************/
-herr_t
-H5C2_jb__bin2hex(const uint8_t * buf,
+herr_t
+H5C2_jb__bin2hex(const uint8_t * buf,
char * hexdata,
size_t * hexlength,
size_t buf_size)
@@ -3540,7 +6417,7 @@ H5C2_jb__bin2hex(const uint8_t * buf,
size_t v; /* Local index variable */
uint8_t c;
char * t;
-
+
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5C2_jb__bin2hex)
t = hexdata;
@@ -3553,8 +6430,9 @@ H5C2_jb__bin2hex(const uint8_t * buf,
t[2] = ' ';
} /* end for */
+
t[3] = '\n';
- t[4] = 0;
+ t[4] = '\0';
* hexlength = v * 3 + 2;
@@ -3570,16 +6448,16 @@ H5C2_jb__bin2hex(const uint8_t * buf,
* Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
* Wednesday, February 6, 2008
*
- * Purpose: Insert the supplied comment in the journal file. This
- * call may be ignored if the journal file is machine
+ * Purpose: Insert the supplied comment in the journal file. This
+ * call may be ignored if the journal file is machine
* readable.
*
* Returns: SUCCEED on success.
*
* Changes: Turned this function into a switch board function,
- * calling either the human readable or the binary
- * journal file version of the function as indicated
- * by struct_ptr->human_readable.
+ * calling either the human readable or the binary
+ * journal file version of the function as indicated
+ * by struct_ptr->human_readable.
*
* The original version of this file has been renamed
* to H5C2_jb_hrjf__comment().
@@ -3588,14 +6466,14 @@ H5C2_jb__bin2hex(const uint8_t * buf,
*
******************************************************************************/
-herr_t
+herr_t
H5C2_jb__comment(H5C2_jbrb_t * struct_ptr,
const char * comment_ptr)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5C2_jb__comment, FAIL)
-
+
/* Check Arguments */
HDassert( struct_ptr != NULL );
HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
@@ -3632,7 +6510,7 @@ done:
* Wednesday, February 6, 2008
*
* Purpose: Verify that the supplied transaction is in progress,
- * and that at least one journal entry has been written
+ * and that at least one journal entry has been written
* under it. Then construct an end transaction message,
* and write it to the current journal buffer. Make note
* that the supplied transaction is closed, and that no
@@ -3641,9 +6519,9 @@ done:
* Returns: SUCCEED on success.
*
* Changes: Turned this function into a switch board function,
- * calling either the human readable or the binary
- * journal file version of the function as indicated
- * by struct_ptr->human_readable.
+ * calling either the human readable or the binary
+ * journal file version of the function as indicated
+ * by struct_ptr->human_readable.
*
* The original version of this file has been renamed
* to H5C2_jb_hrjf__end_transaction().
@@ -3680,8 +6558,10 @@ H5C2_jb__end_transaction(H5C2_jbrb_t * struct_ptr,
}
}
+ H5C2__JBRB__UPDATE_STATS_FOR_TRANS_COMPLETED(struct_ptr);
+
done:
-
+
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5C2_jb__end_transaction */
@@ -3699,9 +6579,9 @@ done:
* Returns: SUCCEED on success.
*
* Changes: Turned this function into a switch board function,
- * calling either the human readable or the binary
- * journal file version of the function as indicated
- * by struct_ptr->human_readable.
+ * calling either the human readable or the binary
+ * journal file version of the function as indicated
+ * by struct_ptr->human_readable.
*
* The original version of this file has been renamed
* to H5C2_jb_hrjf__eoa().
@@ -3710,14 +6590,14 @@ done:
*
******************************************************************************/
-herr_t
+herr_t
H5C2_jb__eoa(H5C2_jbrb_t * struct_ptr,
haddr_t eoa)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5C2_jb__eoa, FAIL)
-
+
/* Check Arguments */
HDassert( struct_ptr );
HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
@@ -3750,23 +6630,18 @@ done:
*
* Function: H5C2_jb__flush
*
- * Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
- * Wednesday, February 6, 2008
+ * Programmer: John Mainzer -- 1/14/10
*
- * Purpose: Verify that there is no transaction in progress. Then
- * flush all journal entries in the journal buffers to the
- * journal file. Do not return until all entries are on
- * disk.
+ * Purpose: Determine whether AIO is enabled, and then call the
+ * appropriate flush routine.
*
* Returns: SUCCEED on success.
*
******************************************************************************/
-herr_t
+herr_t
H5C2_jb__flush(H5C2_jbrb_t * struct_ptr)
{
- int result;
- int i;
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5C2_jb__flush, FAIL)
@@ -3774,7 +6649,7 @@ H5C2_jb__flush(H5C2_jbrb_t * struct_ptr)
/* Check Arguments */
HDassert(struct_ptr);
HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
-
+
/* Check if transaction is in progress */
if (struct_ptr->trans_in_prog != FALSE) {
@@ -3783,257 +6658,77 @@ H5C2_jb__flush(H5C2_jbrb_t * struct_ptr)
"Attempt to flush buffers with transaction in progress.")
} /* end if */
- if (struct_ptr->get > struct_ptr->put) {
-
- /* write from get through end of buffer */
- result = HDwrite(struct_ptr->journal_file_fd,
- (*struct_ptr->buf)[struct_ptr->get],
- (struct_ptr->num_bufs - struct_ptr->get) * struct_ptr->buf_size);
-
- if ( result == -1 ) {
-
- HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
- "Journal file write failed(1).")
- }
-
- struct_ptr->bufs_in_use -= (struct_ptr->num_bufs - struct_ptr->get);
- struct_ptr->rb_free_space += (struct_ptr->num_bufs - struct_ptr->get) * struct_ptr->buf_size;
- struct_ptr->get = 0;
-
- } /* end if */
-
- if (struct_ptr->get < struct_ptr->put) {
+ if ( struct_ptr->use_aio ) {
- /* write from get up to, but not including, put */
- result = HDwrite(struct_ptr->journal_file_fd,
- (*struct_ptr->buf)[struct_ptr->get],
- (struct_ptr->put - struct_ptr->get) * struct_ptr->buf_size);
-
- if ( result == -1 ) {
-
- HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
- "Journal file write failed (2).")
- }
-
- struct_ptr->bufs_in_use -= (struct_ptr->put - struct_ptr->get);
- struct_ptr->rb_free_space += (struct_ptr->put - struct_ptr->get) * struct_ptr->buf_size;
- struct_ptr->get = struct_ptr->put;
-
- } /* end if */
-
- if ( struct_ptr->cur_buf_free_space != struct_ptr->buf_size ) {
-
- /* flush partially filled portion of current journal buffer to disk */
- result = HDwrite(struct_ptr->journal_file_fd,
- (*struct_ptr->buf)[struct_ptr->put],
- struct_ptr->buf_size - struct_ptr->cur_buf_free_space);
-
- if ( result == -1 ) {
-
- HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
- "Journal file write failed (3).")
- }
-
- struct_ptr->bufs_in_use--;
- struct_ptr->rb_free_space += (struct_ptr->buf_size - struct_ptr->cur_buf_free_space);
-
- } /* end if */
-
- HDassert(struct_ptr->bufs_in_use == 0);
- HDassert(struct_ptr->rb_free_space == struct_ptr->num_bufs * struct_ptr->buf_size);
-
- /* perform sync to ensure everything gets to disk before returning */
- /* Note: there is no HDfsync function, so for now, the standard
- fsync is being used. */
- if(fsync(struct_ptr->journal_file_fd) < 0)
- HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, "Journal file sync failed.")
-
- /* record last transaction number that made it to disk */
- struct_ptr->last_trans_on_disk =
- (*struct_ptr->trans_tracking)[struct_ptr->put];
-
- /* MIKE: optimization note: don't reset to top of ring buffer.
- * instead, keep filling out current buffer so we can keep writes
- * on block boundaries.
- */
- struct_ptr->cur_buf_free_space = struct_ptr->buf_size;
- struct_ptr->rb_space_to_rollover = struct_ptr->num_bufs * struct_ptr->buf_size;
- struct_ptr->head = (*struct_ptr->buf)[0];
- struct_ptr->put = 0;
-
- /* Propogate the last transaction on in the buffers throughout the
- * transaction tracking array. */
- for(i = 0; i < struct_ptr->num_bufs; i++)
- (*struct_ptr->trans_tracking)[i] = struct_ptr->last_trans_on_disk;
-
- /* update get index */
- struct_ptr->get = struct_ptr->put;
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5C2_jb__flush */
-
-
-/******************************************************************************
- *
- * Function: H5C2_jb__flush_full_buffers
- *
- * Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
- * Wednesday, February 6, 2008
- *
- * Purpose: Flush all the dirtied buffers in the ring buffer
- * starting with the buffer referenced by struct_ptr->get
- * and ending with the buffer right before the one
- * referenced by struct_ptr->put.
- *
- * Returns: SUCCEED on success.
- *
- ******************************************************************************/
-
-herr_t
-H5C2_jb__flush_full_buffers(H5C2_jbrb_t * struct_ptr)
-{
- int result;
- herr_t ret_value = SUCCEED;
-
- FUNC_ENTER_NOAPI(H5C2_jb__flush_full_buffers, FAIL)
-
- /* this asserts that at least one buffer is in use */
- HDassert(struct_ptr->bufs_in_use > 0);
- /* write an assert to verify that at least one buffer is full */
- HDassert( (struct_ptr->put != struct_ptr->get) ||
- (struct_ptr->rb_free_space == 0) );
-
- /* flush all full, dirtied journal buffers to disk */
- if (struct_ptr->get < struct_ptr->put) {
-
- /* can write solid chunk from get up to, but not
- * including, put
- */
- result = HDwrite(struct_ptr->journal_file_fd,
- (*struct_ptr->buf)[struct_ptr->get],
- (struct_ptr->put - struct_ptr->get) *
- struct_ptr->buf_size);
-
- if ( result == -1 ) {
-
- HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
- "Journal file write failed (1).")
- }
-
- struct_ptr->bufs_in_use -= (struct_ptr->put - struct_ptr->get);
- struct_ptr->rb_free_space += (struct_ptr->put - struct_ptr->get) * struct_ptr->buf_size;
-
- } /* end if */
-
- else {
-
- /* write from get through end of buffer */
- result = HDwrite(struct_ptr->journal_file_fd,
- (*struct_ptr->buf)[struct_ptr->get],
- (struct_ptr->num_bufs - struct_ptr->get) * struct_ptr->buf_size);
-
- if ( result == -1 ) {
-
- HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
- "Journal file write failed (2).")
- }
-
- struct_ptr->bufs_in_use -= (struct_ptr->num_bufs - struct_ptr->get);
- struct_ptr->rb_free_space += (struct_ptr->num_bufs - struct_ptr->get) *
- struct_ptr->buf_size;
-
- /* if put = 0, then everything that needs to be flushed will have been
- * flushed, so we can stop here. Otherwise, need to flush all buffers
- * from the start of the ring buffer's allocated space up to, but not
- * including, the buffer indexed by put.
- */
- if (struct_ptr->put != 0) {
-
- result = HDwrite(struct_ptr->journal_file_fd,
- (*struct_ptr->buf)[0],
- (struct_ptr->put) * struct_ptr->buf_size);
-
- if ( result == -1 ) {
-
- HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
- "Journal file write failed(3).")
- } /* end if */
-
- struct_ptr->rb_free_space += (struct_ptr->put * struct_ptr->buf_size);
-
- } /* end if */
-
- struct_ptr->bufs_in_use -= struct_ptr->put;
-
- } /* end else */
-
- HDassert(struct_ptr->bufs_in_use <= 1);
-
- /* update get index */
- struct_ptr->get = struct_ptr->put;
-
- /* record last transaction number that made it to disk */
- if (struct_ptr->put == 0) {
-
- struct_ptr->last_trans_on_disk =
- (*struct_ptr->trans_tracking)[struct_ptr->num_bufs - 1];
+ ret_value = H5C2_jb_aio__flush(struct_ptr);
} else {
- struct_ptr->last_trans_on_disk =
- (*struct_ptr->trans_tracking)[struct_ptr->put - 1];
+ ret_value = H5C2_jb_sio__flush(struct_ptr);
}
done:
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5C2_jb__flush_full_buffers */
+} /* H5C2_jb__flush() */
/******************************************************************************
*
* Function: H5C2_jb__get_last_transaction_on_disk
*
- * Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
- * Wednesday, February 6, 2008
+ * Programmer: JRM -- 1/20/10
*
- * Purpose: Lookup the number of the last transaction to have been
- * fully written to disk, and place its transaction
- * number in *trans_num_ptr. If no transaction has made
- * it to disk, load zero into *trans_num_ptr.
+ * Purpose: Determine whether we are using aio for journal
+ * entry writes, and then call the appropriate
+ * function.
*
* Returns: SUCCEED on success.
*
******************************************************************************/
-herr_t
+herr_t
H5C2_jb__get_last_transaction_on_disk(H5C2_jbrb_t * struct_ptr,
uint64_t * trans_num_ptr)
{
+ herr_t result;
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5C2_jb__get_last_transaction_on_disk, FAIL)
-
+
/* Check Arguments */
HDassert( struct_ptr != NULL );
- HDassert( trans_num_ptr != NULL );
HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+ HDassert( trans_num_ptr != NULL );
- /* JRM: In machine readable version, lets check to see if a sync is
- * necessary, and call it only if it is.
- */
- /* perform a sync to ensure everything gets to disk before continuing */
- /* Note: there is no HDfsync function, so for now, the standard
- fsync is being used. */
- if(fsync(struct_ptr->journal_file_fd) < 0 )
- HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, "Jounal file sync failed.")
+ if ( struct_ptr->use_aio ) {
- * trans_num_ptr = struct_ptr->last_trans_on_disk;
+ result = H5C2_jb_aio__get_last_transaction_on_disk(struct_ptr,
+ trans_num_ptr);
+
+ if ( result != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_aio__get_last_transaction_on_disk failed")
+ }
+
+ } else {
+
+ result = H5C2_jb_sio__get_last_transaction_on_disk(struct_ptr,
+ trans_num_ptr);
+
+ if ( result != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_sio__get_last_transaction_on_disk failed")
+ }
+ }
done:
+
FUNC_LEAVE_NOAPI(ret_value)
+
} /* end H5C2_jb__get_last_transaction_on_disk */
@@ -4044,19 +6739,19 @@ done:
* Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
* Wednesday, February 6, 2008
*
- * Purpose: Insert the supplied comment in the journal file. This
- * call may be ignored if the journal file is machine
+ * Purpose: Insert the supplied comment in the journal file. This
+ * call may be ignored if the journal file is machine
* readable.
*
* Returns: SUCCEED on success.
*
- * Changes: Renamed H5C2_jb__comment() to H5C2_jb_hrjf__comment().
+ * Changes: Renamed H5C2_jb__comment() to H5C2_jb_hrjf__comment().
*
* JRM -- 5/2/09
*
******************************************************************************/
-static herr_t
+static herr_t
H5C2_jb_hrjf__comment(H5C2_jbrb_t * struct_ptr,
const char * comment_ptr)
{
@@ -4065,15 +6760,15 @@ H5C2_jb_hrjf__comment(H5C2_jbrb_t * struct_ptr,
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5C2_jb_hrjf__comment, FAIL)
-
+
/* Check Arguments */
HDassert(struct_ptr);
HDassert(comment_ptr);
HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
HDassert(struct_ptr->hdf5_file_name);
- /* Verify that header message is present in journal file or ring buffer.
- * If not, write it.
+ /* Verify that header message is present in journal file or ring buffer.
+ * If not, write it.
*/
if ( struct_ptr->header_present == FALSE ) {
@@ -4086,21 +6781,39 @@ H5C2_jb_hrjf__comment(H5C2_jbrb_t * struct_ptr,
} /* end if */
temp_len = HDstrlen(comment_ptr) + 11;
- if(NULL == (temp = H5MM_malloc(temp_len + 1)))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "allocation of temp buffer failed.")
+
+ if ( NULL == (temp = (char *)H5MM_malloc(temp_len + 1)) ) {
+
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
+ "allocation of temp buffer failed.")
+ }
/* Write comment message */
HDsnprintf(temp, (temp_len + 1), "C comment %s\n", comment_ptr);
- HDassert(temp_len == HDstrlen(temp));
- if(H5C2_jb__write_to_buffer(struct_ptr, temp_len, temp, FALSE, struct_ptr->cur_trans) < 0)
- HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "H5C2_jb__write_to_buffer() failed.\n")
+ HDassert ( temp_len == HDstrlen(temp) );
+
+ if ( H5C2_jb__write_to_buffer(struct_ptr,
+ temp_len,
+ temp,
+ FALSE,
+ struct_ptr->cur_trans) < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
+ "H5C2_jb__write_to_buffer() failed.\n")
+ }
done:
- if(NULL != temp) {
- temp = H5MM_xfree(temp);
- if(NULL != temp)
- HDONE_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "free of assembly buffer failed.")
+
+ if ( NULL != temp ) {
+
+ temp = (char *)H5MM_xfree(temp);
+
+ if ( NULL != temp ) {
+
+ HDONE_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \
+ "free of assembly buffer failed.")
+ }
} /* end if */
FUNC_LEAVE_NOAPI(ret_value)
@@ -4116,7 +6829,7 @@ done:
* Wednesday, February 6, 2008
*
* Purpose: Verify that the supplied transaction is in progress,
- * and that at least one journal entry has been written
+ * and that at least one journal entry has been written
* under it. Then construct an end transaction message,
* and write it to the current journal buffer. Make note
* that the supplied transaction is closed, and that no
@@ -4125,7 +6838,7 @@ done:
* Returns: SUCCEED on success.
*
* Changes: Renamed H5C2_jb__end_transaction() to
- * H5C2_jb_hrjf__end_transaction().
+ * H5C2_jb_hrjf__end_transaction().
* JRM -- 5/2/09
*
*****************************************************************************/
@@ -4142,7 +6855,7 @@ H5C2_jb_hrjf__end_transaction(H5C2_jbrb_t * struct_ptr,
/* Check Arguments */
HDassert(struct_ptr);
HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
-
+
/* Verify that the supplied transaction is in progress */
if ( ( struct_ptr->trans_in_prog != TRUE ) ||
( struct_ptr->cur_trans != trans_num ) ) {
@@ -4150,9 +6863,9 @@ H5C2_jb_hrjf__end_transaction(H5C2_jbrb_t * struct_ptr,
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"Transaction not in progress or bad transaction number.")
} /* end if */
-
- /* Verify that at least one journal entry has been written under
- * the current transaction
+
+ /* Verify that at least one journal entry has been written under
+ * the current transaction
*/
if ( struct_ptr->jentry_written != TRUE ) {
@@ -4165,15 +6878,15 @@ H5C2_jb_hrjf__end_transaction(H5C2_jbrb_t * struct_ptr,
HDsnprintf(temp, (size_t)25, "3 end_trans %llu\n", trans_num);
/* Write end transaction message */
- if ( H5C2_jb__write_to_buffer(struct_ptr, HDstrlen(temp), temp,
+ if ( H5C2_jb__write_to_buffer(struct_ptr, HDstrlen(temp), temp,
TRUE, trans_num ) < 0 ) {
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
"H5C2_jb__write_to_buffer() failed.\n")
} /* end if */
- /* reset boolean flag indicating if at least one journal entry has
- * been written under transaction
+ /* reset boolean flag indicating if at least one journal entry has
+ * been written under transaction
*/
struct_ptr->jentry_written = FALSE;
@@ -4181,7 +6894,7 @@ H5C2_jb_hrjf__end_transaction(H5C2_jbrb_t * struct_ptr,
struct_ptr->trans_in_prog = FALSE;
done:
-
+
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5C2_jb_hrjf__end_transaction */
@@ -4198,12 +6911,12 @@ done:
*
* Returns: SUCCEED on success.
*
- * Changes: Renamed H5C2_jb__eoa() to H5C2_jb_hrjf__eoa().
+ * Changes: Renamed H5C2_jb__eoa() to H5C2_jb_hrjf__eoa().
* JRM -- 5/2/09
*
******************************************************************************/
-static herr_t
+static herr_t
H5C2_jb_hrjf__eoa(H5C2_jbrb_t * struct_ptr,
haddr_t eoa)
{
@@ -4212,26 +6925,38 @@ H5C2_jb_hrjf__eoa(H5C2_jbrb_t * struct_ptr,
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5C2_jb_hrjf__eoa, FAIL)
-
+
/* Check Arguments */
HDassert(struct_ptr);
HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
HDassert(struct_ptr->hdf5_file_name);
- /* Verify that header message is present in journal file or ring buffer.
- * If not, write it.
+ /* Verify that header message is present in journal file or ring buffer.
+ * If not, write it.
*/
- if(struct_ptr->header_present == FALSE ) {
- if(H5C2_jb__write_header_entry(struct_ptr) != SUCCEED)
- HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "H5C2_jb__write_header_entry() failed.\n")
+ if ( struct_ptr->header_present == FALSE ) {
+
+ if ( H5C2_jb__write_header_entry(struct_ptr) != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
+ "H5C2_jb__write_header_entry() failed.\n")
+ }
} /* end if */
/* Write EOA message */
HDsnprintf(temp, temp_len, "E eoa_value 0x%llx\n", eoa);
- HDassert(HDstrlen(temp) < temp_len);
- if(H5C2_jb__write_to_buffer(struct_ptr, HDstrlen(temp), temp, FALSE, struct_ptr->cur_trans) < 0)
- HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "H5C2_jb__write_to_buffer() failed.\n")
+ HDassert ( HDstrlen(temp) < temp_len );
+
+ if ( H5C2_jb__write_to_buffer(struct_ptr,
+ HDstrlen(temp),
+ temp,
+ FALSE,
+ struct_ptr->cur_trans) < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
+ "H5C2_jb__write_to_buffer() failed.\n")
+ }
done:
@@ -4254,13 +6979,13 @@ done:
*
* Returns: SUCCEED on success.
*
- * Changes: Renamed H5C2_jb__journal_entry() to
- * H5C2_jb_hrjf__journal_entry().
+ * Changes: Renamed H5C2_jb__journal_entry() to
+ * H5C2_jb_hrjf__journal_entry().
* JRM -- 5/2/09
*
******************************************************************************/
-static herr_t
+static herr_t
H5C2_jb_hrjf__journal_entry(H5C2_jbrb_t * struct_ptr,
uint64_t trans_num,
haddr_t base_addr,
@@ -4277,18 +7002,18 @@ H5C2_jb_hrjf__journal_entry(H5C2_jbrb_t * struct_ptr,
FUNC_ENTER_NOAPI(H5C2_jb_hrjf__journal_entry, FAIL)
/* Check Arguments */
- HDassert(struct_ptr);
+ HDassert(struct_ptr != NULL);
HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
/* Make a copy of body data */
- if ( (bodydata = H5MM_malloc(length)) == NULL ) {
+ if ( (bodydata = (uint8_t *)H5MM_malloc(length)) == NULL ) {
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
"allocation of assembly buffer failed.");
}
HDmemcpy(bodydata, body, length);
-
+
/* Verify that the supplied transaction is in progress */
if ( ( struct_ptr->trans_in_prog != TRUE ) ||
( struct_ptr->cur_trans != trans_num ) ) {
@@ -4297,27 +7022,31 @@ H5C2_jb_hrjf__journal_entry(H5C2_jbrb_t * struct_ptr,
"Transaction not in progress or bad transaction number.")
} /* end if */
- if ( (temp = H5MM_malloc(length + 100)) == NULL ) {
+ if ( (temp = (char *)H5MM_malloc(length + 100)) == NULL ) {
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
"allocation of assembly buffer failed.");
}
- if ( (hexdata = H5MM_malloc(length * 40)) == NULL ) {
+ if ( (hexdata = (char *)H5MM_malloc(length * 40)) == NULL ) {
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
"allocation of assembly buffer failed.");
}
/* Write journal entry */
- HDsnprintf(temp,
+ HDsnprintf(temp,
(size_t)(length + 100),
- "2 trans_num %llu length %zu base_addr 0x%lx body ",
- trans_num,
- length,
+ "2 trans_num %llu length %zu base_addr 0x%lx body ",
+ trans_num,
+ length,
(unsigned long)base_addr);
- if ( H5C2_jb__write_to_buffer(struct_ptr, HDstrlen(temp), temp, FALSE, trans_num) < 0 ) {
+ if ( H5C2_jb__write_to_buffer(struct_ptr,
+ HDstrlen(temp),
+ temp,
+ FALSE,
+ trans_num) < 0 ) {
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
"H5C2_jb__write_to_buffer() failed.\n")
@@ -4326,14 +7055,18 @@ H5C2_jb_hrjf__journal_entry(H5C2_jbrb_t * struct_ptr,
/* Convert data from binary to hex */
H5C2_jb__bin2hex(bodydata, hexdata, &hexlength, length);
- if ( H5C2_jb__write_to_buffer(struct_ptr, hexlength, hexdata, FALSE, trans_num) < 0 ) {
+ if ( H5C2_jb__write_to_buffer(struct_ptr,
+ hexlength,
+ hexdata,
+ FALSE,
+ trans_num) < 0 ) {
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
"H5C2_jb__write_to_buffer() failed.\n")
} /* end if */
- /* Indicate that at least one journal entry has been written under
- * this transaction
+ /* Indicate that at least one journal entry has been written under
+ * this transaction
*/
if ( struct_ptr->jentry_written == FALSE ) {
@@ -4341,22 +7074,38 @@ H5C2_jb_hrjf__journal_entry(H5C2_jbrb_t * struct_ptr,
}
done:
- if(bodydata != NULL) {
- bodydata = H5MM_xfree(bodydata);
- if(bodydata != NULL)
- HDONE_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "free of assembly buffer failed.")
+
+ if ( bodydata != NULL ) {
+
+ bodydata = (uint8_t *)H5MM_xfree(bodydata);
+
+ if ( bodydata != NULL ) {
+
+ HDONE_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \
+ "free of assembly buffer failed.")
+ }
} /* end if */
- if(temp != NULL) {
- temp = H5MM_xfree(temp);
- if(temp != NULL)
- HDONE_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "free of assembly buffer failed.")
+ if ( temp != NULL ) {
+
+ temp = (char *)H5MM_xfree(temp);
+
+ if ( temp != NULL ) {
+
+ HDONE_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \
+ "free of assembly buffer failed.")
+ }
} /* end if */
- if(hexdata != NULL) {
- hexdata = H5MM_xfree(hexdata);
- if(hexdata != NULL)
- HDONE_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "free of assembly buffer failed.")
+ if ( hexdata != NULL ) {
+
+ hexdata = (char *)H5MM_xfree(hexdata);
+
+ if ( hexdata != NULL ) {
+
+ HDONE_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \
+ "free of assembly buffer failed.")
+ }
} /* end if */
FUNC_LEAVE_NOAPI(ret_value)
@@ -4372,21 +7121,21 @@ done:
* Wednesday, February 6, 2008
*
* Purpose: Verify that there is no transaction in progress, and
- * that the supplied transaction number greater than
- * the last. Then construct a start transaction message,
+ * that the supplied transaction number greater than
+ * the last. Then construct a start transaction message,
* and write it to the current journal buffer. Make note
* of the fact that the supplied transaction is in
* progress.
*
* Returns: SUCCEED on success.
*
- * Changes: Renamed H5C2_jb__start_transaction() to
- * H5C2_jb_hrjf__start_transaction().
+ * Changes: Renamed H5C2_jb__start_transaction() to
+ * H5C2_jb_hrjf__start_transaction().
* JRM -- 5/2/09
*
******************************************************************************/
-static herr_t
+static herr_t
H5C2_jb_hrjf__start_transaction(H5C2_jbrb_t * struct_ptr,
uint64_t trans_num)
@@ -4397,9 +7146,9 @@ H5C2_jb_hrjf__start_transaction(H5C2_jbrb_t * struct_ptr,
FUNC_ENTER_NOAPI(H5C2_jb_hrjf__start_transaction, FAIL)
/* Check Arguments */
- HDassert(struct_ptr);
- HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
-
+ HDassert( struct_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+
/* Verify that there is no transaction in progress */
if ( struct_ptr->trans_in_prog != FALSE ) {
@@ -4407,12 +7156,6 @@ H5C2_jb_hrjf__start_transaction(H5C2_jbrb_t * struct_ptr,
"Transaction already in progress.")
} /* end if */
- /* JRM: Heads up: we may relax this constraint to rquire that the
- * new transaction number is greater than the old, but possibly
- * not the next integer in sequence. Will this cause problems
- * with testing?
- */
-
/* Verify that the supplied transaction number greater than the last */
if ( (struct_ptr->cur_trans) >= trans_num ) {
@@ -4420,8 +7163,8 @@ H5C2_jb_hrjf__start_transaction(H5C2_jbrb_t * struct_ptr,
"New transaction out of sequence.")
} /* end if */
- /* Verify that header message is present in journal file or ring buffer.
- * If not, write it.
+ /* Verify that header message is present in journal file or ring buffer.
+ * If not, write it.
*/
if ( struct_ptr->header_present == FALSE ) {
@@ -4435,19 +7178,23 @@ H5C2_jb_hrjf__start_transaction(H5C2_jbrb_t * struct_ptr,
/* Write start transaction message */
HDsnprintf(temp, (size_t)150, "1 bgn_trans %llu\n", trans_num);
- if ( H5C2_jb__write_to_buffer(struct_ptr, HDstrlen(temp), temp,
- FALSE, trans_num) < 0 ) {
+
+ if ( H5C2_jb__write_to_buffer(struct_ptr,
+ HDstrlen(temp),
+ temp,
+ FALSE,
+ trans_num) < 0 ) {
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
"H5C2_jb__write_to_buffer() failed.\n")
} /* end if */
-
+
/* Make note of the fact that supplied transaction is in progress */
struct_ptr->trans_in_prog = TRUE;
struct_ptr->cur_trans = trans_num;
done:
-
+
FUNC_LEAVE_NOAPI(ret_value)
} /* H5C2_jb_hrjf__start_transaction() */
@@ -4472,26 +7219,33 @@ done:
* Added the journal_magic parameter and related code.
*
* Also deleted code to write the header message.
- * Since the base address of the journal magic in
+ * Since the base address of the journal magic in
* the HDF5 file isn't available at this time, wait
* until our first real entry to write the header.
*
* JRM -- 4/16/09
* Added the sizeof_addr and sizeof_size parameters, and
- * associated code. These parameters must contain the
+ * associated code. These parameters must contain the
* values of the same name in the instance of H5F_file_t
* associated with the target file.
*
+ * JRM -- 12/7/09
+ * Added initialization for posix aio fields in
+ * H5C2_jbrb_t.
+ *
+ * JRM -- 2/21/10
+ * Added call to H5C2_jb_stats__reset();
+ *
******************************************************************************/
-herr_t
-H5C2_jb__init(H5C2_jbrb_t * struct_ptr,
+herr_t
+H5C2_jb__init(H5C2_jbrb_t * struct_ptr,
const int32_t journal_magic,
- const char * HDF5_file_name,
- const char * journal_file_name,
- size_t buf_size,
- int num_bufs,
- hbool_t use_aio,
+ const char * HDF5_file_name,
+ const char * journal_file_name,
+ size_t buf_size,
+ int num_bufs,
+ hbool_t use_aio,
hbool_t human_readable,
size_t sizeof_addr,
size_t sizeof_size)
@@ -4517,6 +7271,7 @@ H5C2_jb__init(H5C2_jbrb_t * struct_ptr,
struct_ptr->num_bufs = num_bufs;
struct_ptr->buf_size = buf_size;
struct_ptr->bufs_in_use = 0;
+ struct_ptr->writes_in_progress = 0;
struct_ptr->jvers = H5C2__JOURNAL_VERSION;
struct_ptr->get = 0;
struct_ptr->put = 0;
@@ -4529,6 +7284,8 @@ H5C2_jb__init(H5C2_jbrb_t * struct_ptr,
struct_ptr->msg_chksum = 0;
struct_ptr->journal_is_empty = TRUE;
struct_ptr->cur_trans = 0;
+ struct_ptr->last_trans_queued = 0;
+ struct_ptr->last_trans_written = 0;
struct_ptr->last_trans_on_disk = 0;
struct_ptr->trans_in_prog = FALSE;
struct_ptr->jname = HDstrdup(journal_file_name);
@@ -4537,7 +7294,7 @@ H5C2_jb__init(H5C2_jbrb_t * struct_ptr,
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
"allocation of space for copy of journal_file_name failed.");
- }
+ }
struct_ptr->hdf5_file_name = HDstrdup(HDF5_file_name);
@@ -4545,40 +7302,57 @@ H5C2_jb__init(H5C2_jbrb_t * struct_ptr,
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
"allocation of space for copy of HDF5_file_name failed.");
- }
+ }
struct_ptr->header_present = FALSE;
struct_ptr->cur_buf_free_space = buf_size;
- struct_ptr->rb_space_to_rollover = num_bufs * buf_size;
- struct_ptr->rb_free_space = num_bufs * buf_size;
+ struct_ptr->rb_space_to_rollover = (size_t)num_bufs * buf_size;
+ struct_ptr->rb_free_space = (size_t)num_bufs * buf_size;
struct_ptr->head = NULL;
struct_ptr->trans_tracking = NULL;
+ struct_ptr->aio_ctl_blks = NULL;
+ struct_ptr->aio_next_buf_offset = (off_t)0;
+#if 1
+ struct_ptr->use_aio_fsync = use_aio;
+#else
+ struct_ptr->use_aio_fsync = FALSE;
+#endif
+ struct_ptr->aio_sync_q_head = NULL;
+ struct_ptr->aio_sync_q_tail = NULL;
+ struct_ptr->aio_sync_q_len = 0;
struct_ptr->buf = NULL;
-
-
+
/* Open journal file */
- struct_ptr->journal_file_fd =
+#if 0 /* JRM */
+ HDfprintf(stdout, "%s: journal file name = %s.\n", FUNC, journal_file_name);
+#endif /* JRM */
+ struct_ptr->journal_file_fd =
HDopen(journal_file_name, O_WRONLY|O_CREAT|O_EXCL, 0777);
if ( struct_ptr->journal_file_fd == -1) {
+#if 0 /* JRM */
+ HDfprintf(stdout, "%s: errno = %d (%s).\n",
+ FUNC, errno, strerror(errno));
+#endif /* JRM */
HGOTO_ERROR(H5E_FILE, H5E_CANTCREATE, FAIL, \
"Can't create journal file. Does it already exist?")
} /* end if */
-
+
/* Allocate space for the ring buffer's journal buffer pointers */
- struct_ptr->buf = H5MM_malloc(struct_ptr->num_bufs * sizeof(char *));
+ struct_ptr->buf = (char *((*)[]))
+ H5MM_malloc((size_t)(struct_ptr->num_bufs) * sizeof(char *));
if ( struct_ptr->buf == NULL ) {
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
"allocation of buf pointer array failed.");
} /* end if */
-
+
/* Allocate space for journal buffers */
- (*struct_ptr->buf)[0] =
- H5MM_malloc(struct_ptr->buf_size * struct_ptr->num_bufs);
+ (*struct_ptr->buf)[0] = (char *)
+ H5MM_malloc(struct_ptr->buf_size * (size_t)(struct_ptr->num_bufs));
if ( (*struct_ptr->buf)[0] == NULL ) {
@@ -4586,38 +7360,72 @@ H5C2_jb__init(H5C2_jbrb_t * struct_ptr,
"allocation of buffers failed.");
} /* end if */
- /* Allocate space for the purposes of tracking the last
- * transaction on disk
+ /* Allocate space for the purposes of tracking the last
+ * transaction on disk
*/
- struct_ptr->trans_tracking =
- H5MM_malloc(struct_ptr->num_bufs * sizeof(unsigned long));
+ struct_ptr->trans_tracking = (uint64_t (*)[])
+ H5MM_malloc((size_t)(struct_ptr->num_bufs) * sizeof(uint64_t));
if ( struct_ptr->trans_tracking == NULL ) {
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
"allocation of trans_tracking failed.");
} /* end if */
-
+
/* Initialize the transaction tracking array */
for (i=0; i<struct_ptr->num_bufs; i++)
{
(*struct_ptr->trans_tracking)[i] = 0;
}
-
- /* Make journal buffer pointers point to the right location in
- * chunk of allocated memory above
+
+ /* Make journal buffer pointers point to the right location in
+ * chunk of allocated memory above
*/
for ( i = 1; i < struct_ptr->num_bufs; i++ )
{
- (*struct_ptr->buf)[i] =
- &((*struct_ptr->buf)[0])[i * struct_ptr->buf_size];
+ (*struct_ptr->buf)[i] =
+ &((*struct_ptr->buf)[0])[i * (int)(struct_ptr->buf_size)];
}
/* Define head pointer to point at where we are writing to in the buffer */
struct_ptr->head = (*struct_ptr->buf)[struct_ptr->put];
-done:
+ /* if we are using aio, allocate the array of struct aiocb used to manage
+ * and track the asychronous writes.
+ */
+ if ( struct_ptr->use_aio ) {
+
+ struct_ptr->aio_ctl_blks = (struct aiocb (*)[])
+ H5MM_malloc(sizeof(struct aiocb) *
+ (size_t)(struct_ptr->num_bufs));
+ if ( struct_ptr->aio_ctl_blks == NULL ) {
+
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
+ "allocation of aio_ctl_blks failed.");
+ }
+
+ /* Set the aio_fildes field of each aio control block to -1. We
+ * use this value to indicate that no asynchronous write is currently
+ * in progress.
+ *
+ * Don't bother with zeroing out the blocks now -- we will do this
+ * to each block just prior to use.
+ */
+ for ( i = 0; i < struct_ptr->num_bufs; i++ )
+ {
+ ((*(struct_ptr->aio_ctl_blks))[i]).aio_fildes = -1;
+ }
+ }
+
+ if ( H5C2_jb_stats__reset(struct_ptr) != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_stats__reset() failed.")
+ }
+
+done:
+
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5C2_jb__init */
@@ -4638,9 +7446,9 @@ done:
* Returns: SUCCEED on success.
*
* Changes: Turned this function into a switch board function,
- * calling either the human readable or the binary
- * journal file version of the function as indicated
- * by struct_ptr->human_readable.
+ * calling either the human readable or the binary
+ * journal file version of the function as indicated
+ * by struct_ptr->human_readable.
*
* The original version of this file has been renamed
* to H5C2_jb_hrjf__journal_entry().
@@ -4649,7 +7457,7 @@ done:
*
******************************************************************************/
-herr_t
+herr_t
H5C2_jb__journal_entry(H5C2_jbrb_t * struct_ptr,
uint64_t trans_num,
haddr_t base_addr,
@@ -4666,7 +7474,7 @@ H5C2_jb__journal_entry(H5C2_jbrb_t * struct_ptr,
if ( struct_ptr->human_readable ) {
- if ( H5C2_jb_hrjf__journal_entry(struct_ptr, trans_num, base_addr,
+ if ( H5C2_jb_hrjf__journal_entry(struct_ptr, trans_num, base_addr,
length, body) != SUCCEED ) {
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
@@ -4691,14 +7499,796 @@ done:
/******************************************************************************
*
+ * Function: H5C2_jb_sio__flush
+ *
+ * Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
+ * Wednesday, February 6, 2008
+ *
+ * Purpose: Verify that there is no transaction in progress. Then
+ * flush all journal entries in the journal buffers to the
+ * journal file. Do not return until all entries are on
+ * disk.
+ *
+ * Returns: SUCCEED on success.
+ *
+ * Changes: Renamed function from H5C2_jb__flush() to
+ * H5C2_jb_sio__flush(). Added code to verify that
+ * SIO is selected.
+ *
+ * JRM -- 1/14/10
+ *
+ ******************************************************************************/
+
+static herr_t
+H5C2_jb_sio__flush(H5C2_jbrb_t * struct_ptr)
+{
+ int result;
+ int i;
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_sio__flush, FAIL)
+
+ /* Check Arguments */
+ HDassert(struct_ptr);
+ HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
+ HDassert(struct_ptr->use_aio == FALSE);
+
+ /* Check if transaction is in progress */
+
+ if (struct_ptr->trans_in_prog != FALSE) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "Attempt to flush buffers with transaction in progress.")
+ } /* end if */
+
+ if (struct_ptr->get > struct_ptr->put) {
+
+ /* write from get through end of buffer */
+ result = HDwrite(struct_ptr->journal_file_fd,
+ (*struct_ptr->buf)[struct_ptr->get],
+ (size_t)(struct_ptr->num_bufs - struct_ptr->get) *
+ struct_ptr->buf_size);
+
+ if ( result == -1 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
+ "Journal file write failed(1).")
+ }
+
+ struct_ptr->bufs_in_use -= (struct_ptr->num_bufs - struct_ptr->get);
+ struct_ptr->rb_free_space +=
+ (size_t)(struct_ptr->num_bufs - struct_ptr->get) * struct_ptr->buf_size;
+ struct_ptr->get = 0;
+
+ } /* end if */
+
+ if (struct_ptr->get < struct_ptr->put) {
+
+ /* write from get up to, but not including, put */
+ result = HDwrite(struct_ptr->journal_file_fd,
+ (*struct_ptr->buf)[struct_ptr->get],
+ (size_t)(struct_ptr->put - struct_ptr->get) *
+ struct_ptr->buf_size);
+
+ if ( result == -1 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
+ "Journal file write failed (2).")
+ }
+
+ struct_ptr->bufs_in_use -= (struct_ptr->put - struct_ptr->get);
+ struct_ptr->rb_free_space +=
+ (size_t)(struct_ptr->put - struct_ptr->get) *
+ struct_ptr->buf_size;
+ struct_ptr->get = struct_ptr->put;
+
+ } /* end if */
+
+ if ( struct_ptr->cur_buf_free_space != struct_ptr->buf_size ) {
+
+ /* flush partially filled portion of current journal buffer to disk */
+ result = HDwrite(struct_ptr->journal_file_fd,
+ (*struct_ptr->buf)[struct_ptr->put],
+ struct_ptr->buf_size - struct_ptr->cur_buf_free_space);
+
+ if ( result == -1 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
+ "Journal file write failed (3).")
+ }
+
+ struct_ptr->bufs_in_use--;
+ struct_ptr->rb_free_space +=
+ (struct_ptr->buf_size - struct_ptr->cur_buf_free_space);
+
+ } /* end if */
+
+ HDassert(struct_ptr->bufs_in_use == 0);
+ HDassert(struct_ptr->rb_free_space ==
+ (size_t)(struct_ptr->num_bufs) * struct_ptr->buf_size);
+
+ /* perform sync to ensure everything gets to disk before returning
+ *
+ * Note: there is no HDfsync function, so for now, the standard
+ * fsync is being used.
+ */
+ if ( fsync(struct_ptr->journal_file_fd) < 0 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, "Journal file sync failed.")
+ }
+
+ H5C2__JBRB__UPDATE_STATS_FOR_CALL_TO_FSYNC(struct_ptr)
+
+ /* record last transaction number that made it to disk */
+ struct_ptr->last_trans_on_disk =
+ (*struct_ptr->trans_tracking)[struct_ptr->put];
+
+ /* MIKE: optimization note: don't reset to top of ring buffer.
+ * instead, keep filling out current buffer so we can keep writes
+ * on block boundaries.
+ */
+ struct_ptr->cur_buf_free_space = struct_ptr->buf_size;
+ struct_ptr->rb_space_to_rollover =
+ (size_t)(struct_ptr->num_bufs) * struct_ptr->buf_size;
+ struct_ptr->head = (*struct_ptr->buf)[0];
+ struct_ptr->put = 0;
+
+ /* Propogate the last transaction on in the buffers throughout the
+ * transaction tracking array. */
+ for ( i = 0; i < struct_ptr->num_bufs; i++ ) {
+
+ (*struct_ptr->trans_tracking)[i] = struct_ptr->last_trans_on_disk;
+ }
+
+ /* update get index */
+ struct_ptr->get = struct_ptr->put;
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* end H5C2_jb_sio__flush */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_sio__flush_full_buffers
+ *
+ * Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
+ * Wednesday, February 6, 2008
+ *
+ * Purpose: Flush all the dirtied buffers in the ring buffer
+ * starting with the buffer referenced by struct_ptr->get
+ * and ending with the buffer right before the one
+ * referenced by struct_ptr->put.
+ *
+ * Returns: SUCCEED on success.
+ *
+ * Changes: Changed name from H5C2_jb__flush_full_buffers() to
+ * H5C2_jb_sio__flush_full_buffers().
+ *
+ * JRM -- 1/14/10
+ *
+ ******************************************************************************/
+
+static herr_t
+H5C2_jb_sio__flush_full_buffers(H5C2_jbrb_t * struct_ptr)
+{
+ int result;
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_sio__flush_full_buffers, FAIL)
+
+ /* this asserts that at least one buffer is in use */
+ HDassert( struct_ptr->bufs_in_use > 0 );
+
+ /* write an assert to verify that at least one buffer is full */
+ HDassert( (struct_ptr->put != struct_ptr->get) ||
+ (struct_ptr->rb_free_space == 0) );
+
+ /* flush all full, dirtied journal buffers to disk */
+ if ( struct_ptr->get < struct_ptr->put ) {
+
+ /* can write solid chunk from get up to, but not
+ * including, put
+ */
+ result = HDwrite(struct_ptr->journal_file_fd,
+ (*struct_ptr->buf)[struct_ptr->get],
+ (size_t)(struct_ptr->put - struct_ptr->get) *
+ struct_ptr->buf_size);
+
+ if ( result == -1 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
+ "Journal file write failed (1).")
+ }
+
+ struct_ptr->bufs_in_use -= (struct_ptr->put - struct_ptr->get);
+ struct_ptr->rb_free_space +=
+ (size_t)(struct_ptr->put - struct_ptr->get) *
+ struct_ptr->buf_size;
+
+ } /* end if */
+
+ else {
+
+ /* write from get through end of buffer */
+ result = HDwrite(struct_ptr->journal_file_fd,
+ (*struct_ptr->buf)[struct_ptr->get],
+ (size_t)(struct_ptr->num_bufs - struct_ptr->get) *
+ struct_ptr->buf_size);
+
+ if ( result == -1 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
+ "Journal file write failed (2).")
+ }
+
+ struct_ptr->bufs_in_use -= (struct_ptr->num_bufs - struct_ptr->get);
+ struct_ptr->rb_free_space +=
+ (size_t)(struct_ptr->num_bufs - struct_ptr->get) *
+ struct_ptr->buf_size;
+
+ /* if put = 0, then everything that needs to be flushed will have been
+ * flushed, so we can stop here. Otherwise, need to flush all buffers
+ * from the start of the ring buffer's allocated space up to, but not
+ * including, the buffer indexed by put.
+ */
+ if (struct_ptr->put != 0) {
+
+ result = HDwrite(struct_ptr->journal_file_fd,
+ (*struct_ptr->buf)[0],
+ (size_t)(struct_ptr->put) * struct_ptr->buf_size);
+
+ if ( result == -1 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \
+ "Journal file write failed(3).")
+ } /* end if */
+
+ struct_ptr->rb_free_space +=
+ ((size_t)(struct_ptr->put) * struct_ptr->buf_size);
+
+ } /* end if */
+
+ struct_ptr->bufs_in_use -= struct_ptr->put;
+
+ } /* end else */
+
+ HDassert(struct_ptr->bufs_in_use <= 1);
+
+ /* update get index */
+ struct_ptr->get = struct_ptr->put;
+
+ /* record last transaction number that made it to disk */
+ if (struct_ptr->put == 0) {
+
+ struct_ptr->last_trans_on_disk =
+ (*struct_ptr->trans_tracking)[struct_ptr->num_bufs - 1];
+
+ } else {
+
+ struct_ptr->last_trans_on_disk =
+ (*struct_ptr->trans_tracking)[struct_ptr->put - 1];
+ }
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* end H5C2_jb_sio__flush_full_buffers */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_sio__get_last_transaction_on_disk
+ *
+ * Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
+ * Wednesday, February 6, 2008
+ *
+ * Purpose: Lookup the number of the last transaction to have been
+ * fully written to disk, and place its transaction
+ * number in *trans_num_ptr. If no transaction has made
+ * it to disk, load zero into *trans_num_ptr.
+ *
+ * Returns: SUCCEED on success.
+ *
+ * Changes: Renamed the function from
+ *
+ * H5C2_jb__get_last_transaction_on_disk()
+ *
+ * to
+ *
+ * H5C2_jb_sio__get_last_transaction_on_disk()
+ *
+ * and added some additional sanity checks.
+ *
+ * JRM -- 1/20/10
+ *
+ ******************************************************************************/
+
+static herr_t
+H5C2_jb_sio__get_last_transaction_on_disk(H5C2_jbrb_t * struct_ptr,
+ uint64_t * trans_num_ptr)
+{
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_sio__get_last_transaction_on_disk, FAIL)
+
+ /* Check Arguments */
+ HDassert( struct_ptr != NULL );
+ HDassert( trans_num_ptr != NULL );
+ HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC );
+
+ /* JRM: In machine readable version, lets check to see if a sync is
+ * necessary, and call it only if it is.
+ */
+ /* perform a sync to ensure everything gets to disk before continuing */
+ /* Note: there is no HDfsync function, so for now, the standard
+ fsync is being used. */
+ if(fsync(struct_ptr->journal_file_fd) < 0 ) {
+
+ HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, "Jounal file sync failed.")
+ }
+
+ H5C2__JBRB__UPDATE_STATS_FOR_CALL_TO_FSYNC(struct_ptr)
+
+ * trans_num_ptr = struct_ptr->last_trans_on_disk;
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* end H5C2_jb_sio__get_last_transaction_on_disk */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_sio__write_to_buffer
+ *
+ * Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
+ * Wednesday, February 6, 2008
+ *
+ * Purpose: Put the contents of data into the journal buffers. This
+ * is done as follows: While the data to be written is
+ * larger than the amount of space left in the ring buffer,
+ * the ring buffer is filled to capacity with data and
+ * flushed. This repeats until the unwritten data remaining
+ * can fit in the ring buffer without having to loop around
+ * to the top.
+ *
+ * At this point, the rest of the data can just be written
+ * without having to break it up further. In the event
+ * the data covers more than one journal buffer, the get
+ * and put indices are updated to state this fact. Any
+ * journal buffers that were filled during the write are
+ * flushed.
+ *
+ * Returns: SUCCEED on success.
+ *
+ * Changes: Changed the name of the function from
+ * H5C2_jb__write_to_buffer() to
+ * H5C2_jb_sio__write_to_buffer(). Added assert to
+ * verify that struct_ptr->use_aio is FALSE.
+ *
+ * JRM -- 1/14/10
+ *
+ ******************************************************************************/
+
+static herr_t
+H5C2_jb_sio__write_to_buffer(H5C2_jbrb_t * struct_ptr,
+ size_t size,
+ const char * data,
+ hbool_t is_end_trans,
+ uint64_t trans_num)
+{
+ herr_t ret_value = SUCCEED;
+ uint64_t track_last_trans = 0;
+ int oldput = 0;
+ int i;
+
+ FUNC_ENTER_NOAPI(H5C2_jb_sio__write_to_buffer, FAIL)
+
+ /* Check Arguments */
+ HDassert(struct_ptr);
+ HDassert(data);
+ HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
+ HDassert(struct_ptr->use_aio == FALSE);
+ HDassert( ( struct_ptr->human_readable == FALSE ) ||
+ ( HDstrlen(data) == size ) );
+ HDassert(struct_ptr->rb_space_to_rollover <=
+ ((size_t)(struct_ptr->num_bufs)) * struct_ptr->buf_size);
+ HDassert(struct_ptr->rb_space_to_rollover > 0);
+
+ /* If the data size exceeds the bounds of the ring buffer's allocated
+ * memory, loop around to top
+ */
+ if (size >= struct_ptr->rb_space_to_rollover) {
+
+ while (size >= struct_ptr->rb_space_to_rollover) {
+
+ /* Assertions */
+ HDassert(size != 0);
+ HDassert( ( struct_ptr->human_readable == FALSE ) ||
+ ( HDstrlen(data) >= struct_ptr->rb_space_to_rollover ) );
+
+ /* fill up remaining space in the ring buffer */
+ HDmemcpy(struct_ptr->head, data, struct_ptr->rb_space_to_rollover);
+
+ /* move head to point to start of ring buffer */
+ struct_ptr->head = (*struct_ptr->buf)[0];
+
+ /* make note of last transaction on disk */
+ track_last_trans = (*struct_ptr->trans_tracking)[struct_ptr->put];
+
+ /* update rb_free_space */
+ struct_ptr->rb_free_space -= struct_ptr->rb_space_to_rollover;
+
+ /* Fill out the remainder of the trans_tracking array with
+ the most recent transaction in the array.*/
+ (*struct_ptr->trans_tracking)[0] = track_last_trans;
+ for (i=struct_ptr->put; i<struct_ptr->num_bufs; i++)
+ {
+ (*struct_ptr->trans_tracking)[i] = track_last_trans;
+ }
+
+ /* reset put index */
+ struct_ptr->put = 0;
+
+ /* update bufs_in_use as necessary */
+ struct_ptr->bufs_in_use = struct_ptr->num_bufs - struct_ptr->get;
+
+ /* check to see if trans_tracking needs to be updated. If so,
+ * then update it
+ */
+ if ((size == struct_ptr->rb_space_to_rollover) &&
+ (is_end_trans == TRUE)) {
+
+ (*struct_ptr->trans_tracking)[struct_ptr->num_bufs - 1]
+ = trans_num;
+ (*struct_ptr->trans_tracking)[0] = trans_num;
+ }
+
+ /* flush buffers */
+ if ( H5C2_jb_sio__flush_full_buffers(struct_ptr) < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
+ "H5C2_jb_sio__flush_full_buffers() failed.\n")
+ }
+
+ /* update remaining size of data to be written */
+ size = size - struct_ptr->rb_space_to_rollover;
+
+ /* update the data pointer to point to the remaining data to be
+ * written
+ */
+ data = &data[struct_ptr->rb_space_to_rollover];
+
+ /* update the amount of space left at end of ring buffer */
+ struct_ptr->rb_space_to_rollover =
+ struct_ptr->buf_size * (size_t)(struct_ptr->num_bufs);
+
+ /* update the amount of space in the current buffer */
+ struct_ptr->cur_buf_free_space = struct_ptr->buf_size;
+
+ } /* end while */
+ } /* end if */
+
+ /* If the size of the data exceeds the bounds of a single journal
+ * buffer, will write into multiple
+ */
+ if (size > struct_ptr->cur_buf_free_space) {
+
+ HDassert(struct_ptr->cur_buf_free_space != 0);
+
+ /* write data into journal buffers */
+ HDmemcpy(struct_ptr->head, data, size);
+
+ /* update head pointer */
+ struct_ptr->head = &struct_ptr->head[size];
+
+ /* make note of last transaction on disk */
+ track_last_trans = (*struct_ptr->trans_tracking)[struct_ptr->put];
+ oldput = struct_ptr->put;
+
+ /* update rb_free_space */
+ struct_ptr->rb_free_space -= size;
+
+ /* update put index */
+ struct_ptr->put += (int)
+ ((size - struct_ptr->cur_buf_free_space)/(struct_ptr->buf_size) + 1);
+
+ /* Drag the last transaction in a filled buffer value residing in the
+ old put location through the trans_tracking array to the new
+ corresponding put position. */
+ for (i=oldput; i<struct_ptr->put+1; i++)
+ {
+ (*struct_ptr->trans_tracking)[i] = track_last_trans;
+ }
+
+ /* update current buffer usage */
+ struct_ptr->cur_buf_free_space =
+ struct_ptr->rb_space_to_rollover - size -
+ (((size_t)(struct_ptr->num_bufs)) - ((size_t)(struct_ptr->put + 1))) *
+ (struct_ptr->buf_size );
+
+ /* update bufs_in_use as necessary */
+ struct_ptr->bufs_in_use = struct_ptr->put - struct_ptr->get;
+ if (struct_ptr->cur_buf_free_space < struct_ptr->buf_size) {
+
+ struct_ptr->bufs_in_use++;
+ }
+
+ /* check to see if trans_tracking needs to be updated. If so,
+ * then update it
+ */
+ if ( is_end_trans == TRUE ) {
+
+ if ( struct_ptr->cur_buf_free_space == struct_ptr->buf_size ) {
+
+ (*struct_ptr->trans_tracking)[struct_ptr->put - 1] = trans_num;
+
+ } else {
+
+ (*struct_ptr->trans_tracking)[struct_ptr->put] = trans_num;
+ }
+
+ } /* end if */
+
+ /* flush buffers */
+ if ( H5C2_jb_sio__flush_full_buffers(struct_ptr) < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
+ "H5C2_jb_siok__flush_full_buffers() failed.\n")
+ }
+
+ /* update space left at end of ring buffer */
+ struct_ptr->rb_space_to_rollover -= size;
+
+ } /* end if */
+
+ /* if the data can fit in the remaining space in the current journal
+ * buffer indexed by put
+ */
+ else if (size > 0) {
+
+ HDassert(size <= struct_ptr->cur_buf_free_space);
+
+ /* write data into journal buffer */
+ HDmemcpy(struct_ptr->head, data, size);
+
+ /* increment bufs_in_use as necessary */
+ if ( ( struct_ptr->bufs_in_use == 0 ) ) {
+
+ struct_ptr->bufs_in_use++;
+ }
+
+ /* update head pointer */
+ struct_ptr->head = &struct_ptr->head[size];
+
+ /* update rb_free_space */
+ struct_ptr->rb_free_space -= size;
+
+ /* update current buffer usage */
+ struct_ptr->cur_buf_free_space -= size;
+
+ /* update end of buffer space */
+ struct_ptr->rb_space_to_rollover -= size;
+
+ /* check to see if trans_tracking needs to be updated. If so,
+ then update it */
+ if (is_end_trans == TRUE) {
+
+ (*struct_ptr->trans_tracking)[struct_ptr->put]
+ = trans_num;
+ } /* end if */
+
+ /* if buffer is full, flush it, and loop to the top of the
+ * ring buffer if at the end.
+ */
+ if (struct_ptr->cur_buf_free_space == 0) {
+
+ if ( struct_ptr->put != (struct_ptr->num_bufs - 1) ) {
+ struct_ptr->put += 1;
+
+ /* Drag trans_tracking value into next buffer */
+ (*struct_ptr->trans_tracking)[struct_ptr->put] =
+ (*struct_ptr->trans_tracking)[struct_ptr->put - 1];
+
+ } /* end if */
+
+ else {
+
+ struct_ptr->put = 0;
+
+ /* Drag trans_tracking value into next buffer */
+ (*struct_ptr->trans_tracking)[0]
+ = (*struct_ptr->trans_tracking)[struct_ptr->num_bufs - 1];
+
+ /* reset head pointer and free space values */
+ struct_ptr->head = (*struct_ptr->buf)[0];
+ struct_ptr->rb_space_to_rollover =
+ struct_ptr->buf_size * (size_t)(struct_ptr->num_bufs);
+
+ } /* end else */
+
+ if ( H5C2_jb_sio__flush_full_buffers(struct_ptr) < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
+ "H5C2_jb_sio__flush_full_buffers() failed.\n")
+ } /* end if */
+
+ struct_ptr->cur_buf_free_space = struct_ptr->buf_size;
+
+ } /* end if */
+
+ } /* end else */
+
+ HDassert(struct_ptr->bufs_in_use <= struct_ptr->num_bufs);
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* end H5C2_jb_sio__write_to_buffer */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_stats__dump
+ *
+ * Programmer: JRM -- 2/21/20
+ *
+ * Purpose: If H5C2__JBRB__COLLECT_STATS is TRUE, dump the
+ * contents of the journal buffer ring buffer stats
+ * fields to stdout.
+ *
+ * If H5C2__JBRB__COLLECT_STATS is FALSE, do nothing.
+ *
+ * Returns: void
+ *
+ * Changes: None.
+ *
+ ******************************************************************************/
+
+herr_t
+H5C2_jb_stats__dump(H5C2_jbrb_t * struct_ptr)
+{
+ herr_t ret_value = SUCCEED; /* Return value */
+#if H5C2__JBRB__COLLECT_STATS
+ double calls_to_aio_error_per_async_sync_await = 0.0;
+#endif /* H5C2__JBRB__COLLECT_STATS */
+
+ FUNC_ENTER_NOAPI(H5C2_jb_stats__dump, FAIL)
+
+ /* This would normally be an assert, but we need to use an HGOTO_ERROR
+ * call to shut up the compiler.
+ */
+ if ( ( struct_ptr == NULL ) ||
+ ( struct_ptr->magic != H5C2__H5C2_JBRB_T_MAGIC ) ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad struct_ptr on entry")
+ }
+
+#if H5C2__JBRB__COLLECT_STATS
+ if ( struct_ptr->async_syncs_completed_by_await > 0 ) {
+
+ calls_to_aio_error_per_async_sync_await =
+ (double)(struct_ptr->calls_to_aio_error_awaiting_sync) /
+ (double)(struct_ptr->async_syncs_completed_by_await);
+ }
+
+ HDfprintf(stdout,
+ "buf count/size = %lld/%lld, trans completed = %lld\n",
+ (long long)(struct_ptr->num_bufs),
+ (long long)(struct_ptr->buf_size),
+ (long long)(struct_ptr->transactions_completed));
+ HDfprintf(stdout,
+ "buf writes queued full/part/total = %lld/%lld/%lld\n",
+ (long long)(struct_ptr->full_buf_writes_queued),
+ (long long)(struct_ptr->partial_buf_writes_queued),
+ (long long)(struct_ptr->buf_writes_queued));
+
+ HDfprintf(stdout,
+ "buf writes completed by test/await/total = %lld/%lld/%lld\n",
+ (long long)(struct_ptr->buf_writes_completed_by_test),
+ (long long)(struct_ptr->buf_writes_completed_by_await),
+ (long long)(struct_ptr->buf_writes_completed));
+
+ HDfprintf(stdout,
+ "async syncs queued = %lld, max sync q len = %lld.\n",
+ (long long)(struct_ptr->async_syncs_queued),
+ (long long)(struct_ptr->max_sync_q_len));
+
+ HDfprintf(stdout,
+ "async syncs completed by test/await/total = %lld/%lld/%lld.\n",
+ (long long)(struct_ptr->async_syncs_completed_by_test),
+ (long long)(struct_ptr->async_syncs_completed_by_await),
+ (long long)(struct_ptr->async_syncs_completed));
+
+ HDfprintf(stdout,
+ "ave calls to aio_error() per aio_fsync() await = %f.\n",
+ calls_to_aio_error_per_async_sync_await);
+
+ HDfprintf(stdout, "calls to fsync() = %lld.\n",
+ (long long)(struct_ptr->calls_to_fsync));
+#endif /* H5C2__JBRB__COLLECT_STATS */
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_stats__dump() */
+
+
+/******************************************************************************
+ *
+ * Function: H5C2_jb_stats__reset
+ *
+ * Programmer: JRM -- 2/21/20
+ *
+ * Purpose: If H5C2__JBRB__COLLECT_STATS is TRUE, reset the
+ * stats fields in the instance of H5C2_jbrb_t
+ * pointed to by struct_ptr.
+ *
+ * If H5C2__JBRB__COLLECT_STATS is FALSE, do nothing.
+ *
+ * Returns: void
+ *
+ * Changes: None.
+ *
+ ******************************************************************************/
+
+herr_t
+H5C2_jb_stats__reset(H5C2_jbrb_t * struct_ptr)
+{
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5C2_jb_stats__reset, FAIL)
+
+ /* This would normally be an assert, but we need to use an HGOTO_ERROR
+ * call to shut up the compiler.
+ */
+ if ( ( struct_ptr == NULL ) ||
+ ( struct_ptr->magic != H5C2__H5C2_JBRB_T_MAGIC ) ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad struct_ptr")
+ }
+
+#if H5C2__JBRB__COLLECT_STATS
+ struct_ptr->transactions_completed = 0;
+ struct_ptr->buf_writes_queued = 0;
+ struct_ptr->full_buf_writes_queued = 0;
+ struct_ptr->partial_buf_writes_queued = 0;
+ struct_ptr->buf_writes_completed = 0;
+ struct_ptr->buf_writes_completed_by_test = 0;
+ struct_ptr->buf_writes_completed_by_await = 0;
+ struct_ptr->async_syncs_queued = 0;
+ struct_ptr->async_syncs_completed = 0;
+ struct_ptr->async_syncs_completed_by_test = 0;
+ struct_ptr->async_syncs_completed_by_await = 0;
+ struct_ptr->calls_to_aio_error_awaiting_sync = 0;
+ struct_ptr->max_sync_q_len = 0;
+ struct_ptr->calls_to_fsync = 0;
+#endif /* H5C2__JBRB__COLLECT_STATS */
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2_jb_stats__reset() */
+
+
+/******************************************************************************
+ *
* Function: H5C2_jb__start_transaction
*
* Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
* Wednesday, February 6, 2008
*
* Purpose: Verify that there is no transaction in progress, and
- * that the supplied transaction number greater than
- * the last. Then construct a start transaction message,
+ * that the supplied transaction number greater than
+ * the last. Then construct a start transaction message,
* and write it to the current journal buffer. Make note
* of the fact that the supplied transaction is in
* progress.
@@ -4706,9 +8296,9 @@ done:
* Returns: SUCCEED on success.
*
* Changes: Turned this function into a switch board function,
- * calling either the human readable or the binary
- * journal file version of the function as indicated
- * by struct_ptr->human_readable.
+ * calling either the human readable or the binary
+ * journal file version of the function as indicated
+ * by struct_ptr->human_readable.
*
* The original version of this file has been renamed
* to H5C2_jb_hrjf__start_transaction().
@@ -4717,7 +8307,7 @@ done:
*
******************************************************************************/
-herr_t
+herr_t
H5C2_jb__start_transaction(H5C2_jbrb_t * struct_ptr,
uint64_t trans_num)
@@ -4732,7 +8322,7 @@ H5C2_jb__start_transaction(H5C2_jbrb_t * struct_ptr,
if ( struct_ptr->human_readable ) {
- if ( H5C2_jb_hrjf__start_transaction(struct_ptr, trans_num)
+ if ( H5C2_jb_hrjf__start_transaction(struct_ptr, trans_num)
!= SUCCEED ) {
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
@@ -4740,16 +8330,16 @@ H5C2_jb__start_transaction(H5C2_jbrb_t * struct_ptr,
}
} else {
- if ( H5C2_jb_bjf__start_transaction(struct_ptr, trans_num)
+ if ( H5C2_jb_bjf__start_transaction(struct_ptr, trans_num)
!= SUCCEED ) {
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
"H5C2_jb_bjf__start_transaction() failed.")
}
}
-
+
done:
-
+
FUNC_LEAVE_NOAPI(ret_value)
} /* H5C2_jb__start_transaction() */
@@ -4765,31 +8355,49 @@ done:
* Purpose: Verify that the journal buffers are empty, and that the
* journal file has been truncated. Then close and delete
* the journal file associated with *struct_ptr, and free
- * all dynamically allocated memory associated with
+ * all dynamically allocated memory associated with
* *struct_ptr.
*
* Returns: SUCCEED on success.
*
+ * Changes: JRM -- 12/7/09
+ * Added code to free the aio control blocks if necessary.
+ *
+ * JRM -- 2/21/10
+ * Added call to H5C2_jb_stats__dump().
+ *
******************************************************************************/
-herr_t
+herr_t
H5C2_jb__takedown(H5C2_jbrb_t * struct_ptr)
{
herr_t ret_value = SUCCEED;
-
+
FUNC_ENTER_NOAPI(H5C2_jb__takedown, FAIL)
/* Check Arguments */
HDassert(struct_ptr);
HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
+ /* dump the stats before we start the takedown, as the dump
+ * routine may want to look at some of *struct_ptr's regular
+ * fields, as well as the stats fields.
+ */
+#if H5C2__JBRB__DUMP_STATS_ON_TAKEDOWN
+ if ( H5C2_jb_stats__dump(struct_ptr) != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_jb_stats__dump() failed.")
+ }
+#endif /* H5C2__JBRB__DUMP_STATS_ON_TAKEDOWN */
+
/* Verify that the journal buffers are empty */
if ( struct_ptr->bufs_in_use != 0 ) {
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"Attempt to takedown with non-empty buffers.")
- } /* end if */
+ } /* end if */
/* Verify that the journal file has been truncated */
if (struct_ptr->journal_is_empty != TRUE) {
@@ -4801,19 +8409,20 @@ H5C2_jb__takedown(H5C2_jbrb_t * struct_ptr)
/* Close and delete the journal file associated with struct_ptr */
if ( HDclose(struct_ptr->journal_file_fd) < 0 ) {
- HGOTO_ERROR(H5E_IO, H5E_CLOSEERROR, FAIL, "Jounal file close failed.")
+ HGOTO_ERROR(H5E_IO, H5E_CLOSEERROR, FAIL, "Journal file close failed.")
} /* end if */
if ( HDremove(struct_ptr->jname) < 0) {
- HGOTO_ERROR(H5E_IO, H5E_REMOVEFAIL, FAIL, "Jounal file close failed.")
+ HGOTO_ERROR(H5E_IO, H5E_REMOVEFAIL, FAIL, \
+ "Journal file close failed.")
} /* end if */
/* Free all memory associated with struct_ptr */
if ( struct_ptr->jname != NULL ) {
- struct_ptr->jname = H5MM_xfree(struct_ptr->jname);
+ struct_ptr->jname = (char *)H5MM_xfree(struct_ptr->jname);
if ( struct_ptr->jname != NULL ) {
@@ -4824,7 +8433,8 @@ H5C2_jb__takedown(H5C2_jbrb_t * struct_ptr)
if ( struct_ptr->hdf5_file_name != NULL ) {
- struct_ptr->hdf5_file_name = H5MM_xfree(struct_ptr->hdf5_file_name);
+ struct_ptr->hdf5_file_name =
+ (char *)H5MM_xfree(struct_ptr->hdf5_file_name);
if ( struct_ptr->hdf5_file_name != NULL ) {
@@ -4835,7 +8445,7 @@ H5C2_jb__takedown(H5C2_jbrb_t * struct_ptr)
if ( (*struct_ptr->buf)[0] != NULL ) {
- (*struct_ptr->buf)[0] = H5MM_xfree((*struct_ptr->buf)[0]);
+ (*struct_ptr->buf)[0] = (char *)H5MM_xfree((*struct_ptr->buf)[0]);
if ( (*struct_ptr->buf)[0] != NULL ) {
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \
@@ -4845,7 +8455,7 @@ H5C2_jb__takedown(H5C2_jbrb_t * struct_ptr)
if ( struct_ptr->buf != NULL ) {
- struct_ptr->buf = H5MM_xfree(struct_ptr->buf);
+ struct_ptr->buf = (char *((*)[]))H5MM_xfree(struct_ptr->buf);
if ( struct_ptr->buf != NULL ) {
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \
@@ -4855,7 +8465,8 @@ H5C2_jb__takedown(H5C2_jbrb_t * struct_ptr)
if ( struct_ptr->trans_tracking != NULL ) {
- struct_ptr->trans_tracking = H5MM_xfree(struct_ptr->trans_tracking);
+ struct_ptr->trans_tracking =
+ (uint64_t (*)[])H5MM_xfree(struct_ptr->trans_tracking);
if ( struct_ptr->trans_tracking != NULL ) {
@@ -4864,6 +8475,18 @@ H5C2_jb__takedown(H5C2_jbrb_t * struct_ptr)
}
}
+ if ( struct_ptr->aio_ctl_blks != NULL ) {
+
+ struct_ptr->aio_ctl_blks =
+ (struct aiocb (*)[])H5MM_xfree(struct_ptr->aio_ctl_blks);
+
+ if ( struct_ptr->aio_ctl_blks != NULL ) {
+
+ HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \
+ "free of AIO control blocks array failed.");
+ }
+ }
+
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -4878,16 +8501,20 @@ done:
* Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
* Thursday, February 7, 2008
*
- * Purpose: Verify that there is no transaction in progress, and
+ * Purpose: Verify that there is no transaction in progress, and
* that the journal entry buffers are empty. Truncate
* the journal file. Does not return until the file
* is truncated on disk.
*
* Returns: SUCCEED on success.
*
+ * Changes: Added code to reset fields used exclusively by
+ * AIO.
+ * JRM -- 1/12/10
+ *
******************************************************************************/
-herr_t
+herr_t
H5C2_jb__trunc(H5C2_jbrb_t * struct_ptr)
{
@@ -4899,7 +8526,7 @@ H5C2_jb__trunc(H5C2_jbrb_t * struct_ptr)
/* Check Arguments */
HDassert(struct_ptr);
HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
-
+
/* Verify that there is no transaction in progress */
if ( struct_ptr->trans_in_prog != FALSE ) {
@@ -4912,7 +8539,7 @@ H5C2_jb__trunc(H5C2_jbrb_t * struct_ptr)
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"Attempt to truncate with non-empty buffers.")
- } /* end if */
+ } /* end if */
/* Truncate the journal file */
if ( HDftruncate(struct_ptr->journal_file_fd, (off_t)0) < 0 ) {
@@ -4923,11 +8550,14 @@ H5C2_jb__trunc(H5C2_jbrb_t * struct_ptr)
/* Start back to top of journal buffer and journal file */
struct_ptr->header_present = FALSE;
struct_ptr->journal_is_empty = TRUE;
+ struct_ptr->aio_next_buf_offset = 0;
/* reset the transaction number fields */
struct_ptr->cur_trans = 0;
+ struct_ptr->last_trans_queued = 0;
+ struct_ptr->last_trans_written = 0;
struct_ptr->last_trans_on_disk = 0;
-
+
/* reset the transaction tracking array */
for (i=0; i<struct_ptr->num_bufs; i++)
{
@@ -4954,21 +8584,21 @@ done:
* 2/12/09
*
* Purpose: Write the header message to the journal file.
- *
+ *
* This message appear exactly once in every journal
* file, and is always the first message in the file.
- * It identifies the journal file, and contains
- * information required to run the journal, should
+ * It identifies the journal file, and contains
+ * information required to run the journal, should
* that be necessary.
*
* It is always in human readable format.
- *
+ *
* Returns: SUCCEED on success.
* FAIL on failure.
*
* Changes: JRM -- 3/21/09
- * Moved the entry tag strings into #defines.
- * Replaced all white space in the creation date
+ * Moved the entry tag strings into #defines.
+ * Replaced all white space in the creation date
* string with underscores.
*
* JRM -- 4/16/09
@@ -4977,7 +8607,7 @@ done:
*
******************************************************************************/
-herr_t
+herr_t
H5C2_jb__write_header_entry(H5C2_jbrb_t * struct_ptr)
{
@@ -4990,7 +8620,7 @@ H5C2_jb__write_header_entry(H5C2_jbrb_t * struct_ptr)
size_t file_name_len;
size_t buf_len;
time_t current_date;
-
+
FUNC_ENTER_NOAPI(H5C2_jb__write_header_entry, FAIL)
/* Check Arguments */
@@ -5005,16 +8635,16 @@ H5C2_jb__write_header_entry(H5C2_jbrb_t * struct_ptr)
HDassert( file_name_len > 0 );
buf_len = file_name_len + 256;
-
+
/* Allocate space for journal buffers */
- buf = H5MM_malloc(buf_len);
+ buf = (char *)H5MM_malloc(buf_len);
if ( buf == NULL ) {
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
"buffer allocation failed.");
} /* end if */
-
+
/* Get the current date */
current_date = HDtime(NULL);
@@ -5030,7 +8660,7 @@ H5C2_jb__write_header_entry(H5C2_jbrb_t * struct_ptr)
} else {
- /* copy the string into time_buf, replacing white space with
+ /* copy the string into time_buf, replacing white space with
* underscores.
*
* Do this to make parsing the header easier.
@@ -5059,14 +8689,14 @@ H5C2_jb__write_header_entry(H5C2_jbrb_t * struct_ptr)
if ( struct_ptr->human_readable ) {
- chars_written =
- HDsnprintf(buf,
+ chars_written =
+ HDsnprintf(buf,
buf_len - 1,
"0 %s %ld %s %s %s %d %s %10.10s %s %d\n",
H5C2_JNL__VER_NUM_TAG,
- struct_ptr->jvers,
+ struct_ptr->jvers,
H5C2_JNL__TGT_FILE_NAME_TAG,
- struct_ptr->hdf5_file_name,
+ struct_ptr->hdf5_file_name,
H5C2_JNL__JNL_MAGIC_TAG,
(int)(struct_ptr->journal_magic),
H5C2_JNL__CREATION_DATE_TAG,
@@ -5076,24 +8706,24 @@ H5C2_jb__write_header_entry(H5C2_jbrb_t * struct_ptr)
} else {
- /* Only include the offset and length widths in header for a binary
- * journal file. Leave this data out of the human readable journal
+ /* Only include the offset and length widths in header for a binary
+ * journal file. Leave this data out of the human readable journal
* file header because:
*
- * 1) Everything is in ASCII so it isn't needed, and
+ * 1) Everything is in ASCII so it isn't needed, and
*
- * 2) If we included it anyway, we would have to update the
+ * 2) If we included it anyway, we would have to update the
* tests for the human readable journal file code.
*/
- chars_written =
- HDsnprintf(buf,
+ chars_written =
+ HDsnprintf(buf,
buf_len - 1,
"0 %s %ld %s %s %s %d %s %10.10s %s %d %s %d %s %d\n",
H5C2_JNL__VER_NUM_TAG,
- struct_ptr->jvers,
+ struct_ptr->jvers,
H5C2_JNL__TGT_FILE_NAME_TAG,
- struct_ptr->hdf5_file_name,
+ struct_ptr->hdf5_file_name,
H5C2_JNL__JNL_MAGIC_TAG,
(int)(struct_ptr->journal_magic),
H5C2_JNL__CREATION_DATE_TAG,
@@ -5107,7 +8737,7 @@ H5C2_jb__write_header_entry(H5C2_jbrb_t * struct_ptr)
}
- if ( chars_written >= buf_len - 1 ) {
+ if ( chars_written >= (int)(buf_len - 1) ) {
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTCOPY, FAIL, \
"tried to overwrite buffer.");
@@ -5116,9 +8746,11 @@ H5C2_jb__write_header_entry(H5C2_jbrb_t * struct_ptr)
HDassert( HDstrlen(buf) < buf_len );
/* Write the header message into the ring buffer */
- if ( H5C2_jb__write_to_buffer(struct_ptr, HDstrlen(buf), buf, FALSE,
+ if ( H5C2_jb__write_to_buffer(struct_ptr, HDstrlen(buf), buf, FALSE,
(uint64_t)0) < 0) {
-
+#if 1 /* JRM */
+ HDfprintf(stdout, "%s: H5C2_jb__write_to_buffer() failed.\n", FUNC);
+#endif /* JRM */
HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
"H5C2_jb__write_to_buffer() failed.\n")
} /* end if */
@@ -5128,13 +8760,20 @@ H5C2_jb__write_header_entry(H5C2_jbrb_t * struct_ptr)
struct_ptr->journal_is_empty = FALSE;
done:
- if(buf != NULL) {
- buf = H5MM_xfree(buf);
- if(buf != NULL)
- HDONE_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "free of buf failed.")
+
+ if ( buf != NULL ) {
+
+ buf = (char *)H5MM_xfree(buf);
+
+ if ( buf != NULL ) {
+
+ HDONE_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \
+ "free of buf failed.")
+ }
} /* end if */
FUNC_LEAVE_NOAPI(ret_value)
+
} /* end H5C2_jb__write_header_entry() */
@@ -5142,273 +8781,55 @@ done:
*
* Function: H5C2_jb__write_to_buffer
*
- * Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
- * Wednesday, February 6, 2008
+ * Programmer: John Mainzer
+ * 1/14/10
*
- * Purpose: Put the contents of data into the journal buffers. This
- * is done as follows: While the data to be written is
- * larger than the amount of space left in the ring buffer,
- * the ring buffer is filled to capacity with data and
- * flushed. This repeats until the unwritten data remaining
- * can fit in the ring buffer without having to loop around
- * to the top.
+ * Purpose: Test to see whether AIO is enabled, and the
+ * call the appropriate version of the function.
*
- * At this point, the rest of the data can just be written
- * without having to break it up further. In the event
- * the data covers more than one journal buffer, the get
- * and put indices are updated to state this fact. Any
- * journal buffers that were filled during the write are
- * flushed.
+ * At some point we may wish to replace this switch
+ * function with a function pointer in struct H5C2_jbrb_t.
*
* Returns: SUCCEED on success.
*
******************************************************************************/
-herr_t
-H5C2_jb__write_to_buffer(H5C2_jbrb_t * struct_ptr,
- size_t size,
- const char * data,
- hbool_t is_end_trans,
- uint64_t trans_num)
+herr_t
+H5C2_jb__write_to_buffer(H5C2_jbrb_t * struct_ptr,
+ size_t size,
+ const char * data,
+ hbool_t is_end_trans,
+ uint64_t trans_num)
{
herr_t ret_value = SUCCEED;
- unsigned long track_last_trans = 0;
- int oldput = 0;
- int i;
-
+
FUNC_ENTER_NOAPI(H5C2_jb__write_to_buffer, FAIL)
/* Check Arguments */
- HDassert(struct_ptr);
- HDassert(data);
- HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC);
- HDassert( ( struct_ptr->human_readable == FALSE ) ||
- ( HDstrlen(data) == size ) );
- HDassert(struct_ptr->rb_space_to_rollover <=
- struct_ptr->num_bufs * struct_ptr->buf_size);
- HDassert(struct_ptr->rb_space_to_rollover > 0);
-
- /* If the data size exceeds the bounds of the ring buffer's allocated
- * memory, loop around to top
- */
- if (size >= struct_ptr->rb_space_to_rollover) {
-
- while (size >= struct_ptr->rb_space_to_rollover) {
-
- /* Assertions */
- HDassert(size != 0);
- HDassert( ( struct_ptr->human_readable == FALSE ) ||
- ( HDstrlen(data) >= struct_ptr->rb_space_to_rollover ) );
-
- /* fill up remaining space in the ring buffer */
- HDmemcpy(struct_ptr->head, data, struct_ptr->rb_space_to_rollover);
-
- /* move head to point to start of ring buffer */
- struct_ptr->head = (*struct_ptr->buf)[0];
-
- /* make note of last transaction on disk */
- track_last_trans = (*struct_ptr->trans_tracking)[struct_ptr->put];
-
- /* update rb_free_space */
- struct_ptr->rb_free_space -= struct_ptr->rb_space_to_rollover;
-
- /* Fill out the remainder of the trans_tracking array with
- the most recent transaction in the array.*/
- (*struct_ptr->trans_tracking)[0] = track_last_trans;
- for (i=struct_ptr->put; i<struct_ptr->num_bufs; i++)
- {
- (*struct_ptr->trans_tracking)[i] = track_last_trans;
- }
-
- /* reset put index */
- struct_ptr->put = 0;
-
- /* update bufs_in_use as necessary */
- struct_ptr->bufs_in_use = struct_ptr->num_bufs - struct_ptr->get;
-
- /* check to see if trans_tracking needs to be updated. If so,
- then update it */
- if ((size == struct_ptr->rb_space_to_rollover) &&
- (is_end_trans == TRUE)) {
-
- (*struct_ptr->trans_tracking)[struct_ptr->num_bufs - 1]
- = trans_num;
- (*struct_ptr->trans_tracking)[0] = trans_num;
- }
-
- /* flush buffers */
- if ( H5C2_jb__flush_full_buffers(struct_ptr) < 0 ) {
-
- HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
- "H5C2_jb__flush_full_buffers() failed.\n")
- }
-
- /* update remaining size of data to be written */
- size = size - struct_ptr->rb_space_to_rollover;
-
- /* update the data pointer to point to the remaining data to be
- * written
- */
- data = &data[struct_ptr->rb_space_to_rollover];
-
- /* update the amount of space left at end of ring buffer */
- struct_ptr->rb_space_to_rollover =
- struct_ptr->buf_size * struct_ptr->num_bufs;
-
- /* update the amount of space in the current buffer */
- struct_ptr->cur_buf_free_space = struct_ptr->buf_size;
-
- } /* end while */
- } /* end if */
-
- /* If the size of the data exceeds the bounds of a single journal
- * buffer, will write into multiple
- */
- if (size > struct_ptr->cur_buf_free_space) {
-
- HDassert(struct_ptr->cur_buf_free_space != 0);
-
- /* write data into journal buffers */
- HDmemcpy(struct_ptr->head, data, size);
-
- /* update head pointer */
- struct_ptr->head = &struct_ptr->head[size];
-
- /* make note of last transaction on disk */
- track_last_trans = (*struct_ptr->trans_tracking)[struct_ptr->put];
- oldput = struct_ptr->put;
-
- /* update rb_free_space */
- struct_ptr->rb_free_space -= size;
-
- /* update put index */
- struct_ptr->put +=
- (size-struct_ptr->cur_buf_free_space)/(struct_ptr->buf_size) + 1;
-
- /* Drag the last transaction in a filled buffer value residing in the
- old put location through the trans_tracking array to the new
- corresponding put position. */
- for (i=oldput; i<struct_ptr->put+1; i++)
- {
- (*struct_ptr->trans_tracking)[i] = track_last_trans;
- }
-
- /* update current buffer usage */
- struct_ptr->cur_buf_free_space =
- struct_ptr->rb_space_to_rollover - size -
- (struct_ptr->num_bufs - (struct_ptr->put + 1)) *
- (struct_ptr->buf_size );
-
- /* update bufs_in_use as necessary */
- struct_ptr->bufs_in_use = struct_ptr->put - struct_ptr->get;
- if (struct_ptr->cur_buf_free_space < struct_ptr->buf_size) {
-
- struct_ptr->bufs_in_use++;
- }
-
- /* check to see if trans_tracking needs to be updated. If so,
- then update it */
- if (is_end_trans == TRUE) {
-
- if (struct_ptr->cur_buf_free_space == struct_ptr->buf_size) {
- (*struct_ptr->trans_tracking)[struct_ptr->put - 1] = trans_num;
- }
- else {
- (*struct_ptr->trans_tracking)[struct_ptr->put] = trans_num;
- }
-
- } /* end if */
-
- /* flush buffers */
- if ( H5C2_jb__flush_full_buffers(struct_ptr) < 0 ) {
-
- HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
- "H5C2_jb__flush_full_buffers() failed.\n")
- }
+ if ( ( struct_ptr == NULL ) ||
+ ( struct_ptr->magic != H5C2__H5C2_JBRB_T_MAGIC ) ) {
- /* update space left at end of ring buffer */
- struct_ptr->rb_space_to_rollover -= size;
-
- } /* end if */
-
- /* if the data can fit in the remaining space in the current journal
- * buffer indexed by put
- */
- else if (size > 0) {
-
- HDassert(size <= struct_ptr->cur_buf_free_space);
-
- /* write data into journal buffer */
- HDmemcpy(struct_ptr->head, data, size);
-
- /* increment bufs_in_use as necessary */
- if ( ( struct_ptr->bufs_in_use == 0 ) ) {
-
- struct_ptr->bufs_in_use++;
- }
-
- /* update head pointer */
- struct_ptr->head = &struct_ptr->head[size];
-
- /* update rb_free_space */
- struct_ptr->rb_free_space -= size;
-
- /* update current buffer usage */
- struct_ptr->cur_buf_free_space -= size;
-
- /* update end of buffer space */
- struct_ptr->rb_space_to_rollover -= size;
-
- /* check to see if trans_tracking needs to be updated. If so,
- then update it */
- if (is_end_trans == TRUE) {
-
- (*struct_ptr->trans_tracking)[struct_ptr->put]
- = trans_num;
- } /* end if */
-
- /* if buffer is full, flush it, and loop to the top of the
- * ring buffer if at the end.
- */
- if (struct_ptr->cur_buf_free_space == 0) {
-
- if ( struct_ptr->put != (struct_ptr->num_bufs - 1) ) {
- struct_ptr->put += 1;
-
- /* Drag trans_tracking value into next buffer */
- (*struct_ptr->trans_tracking)[struct_ptr->put] =
- (*struct_ptr->trans_tracking)[struct_ptr->put - 1];
-
- } /* end if */
-
- else {
-
- struct_ptr->put = 0;
-
- /* Drag trans_tracking value into next buffer */
- (*struct_ptr->trans_tracking)[0]
- = (*struct_ptr->trans_tracking)[struct_ptr->num_bufs - 1];
-
- /* reset head pointer and free space values */
- struct_ptr->head = (*struct_ptr->buf)[0];
- struct_ptr->rb_space_to_rollover =
- struct_ptr->buf_size * struct_ptr->num_bufs;
-
- } /* end else */
-
- if ( H5C2_jb__flush_full_buffers(struct_ptr) < 0 ) {
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "bad struct_ptr on entry.")
+ }
- HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \
- "H5C2_jb__flush_full_buffers() failed.\n")
- } /* end if */
+ if ( struct_ptr->use_aio ) {
- struct_ptr->cur_buf_free_space = struct_ptr->buf_size;
+ ret_value = H5C2_jb_aio__write_to_buffer(struct_ptr,
+ size,
+ data,
+ is_end_trans,
+ trans_num);
- } /* end if */
+ } else {
- } /* end else */
+ ret_value = H5C2_jb_sio__write_to_buffer(struct_ptr,
+ size,
+ data,
+ is_end_trans,
+ trans_num);
- HDassert(struct_ptr->bufs_in_use <= struct_ptr->num_bufs);
+ }
done:
diff --git a/src/H5C2pkg.h b/src/H5C2pkg.h
index 9909ca2..74fa64e 100644
--- a/src/H5C2pkg.h
+++ b/src/H5C2pkg.h
@@ -35,7 +35,6 @@
#ifndef _H5C2pkg_H
#define _H5C2pkg_H
-
/* Get package's private header */
#include "H5C2private.h"
@@ -46,6 +45,56 @@
/******************************************************************************
*
+ * Structure: H5C2_jbrb_sync_q_entry_t
+ *
+ * Programmer: John Mainzer
+ * 2/6/10
+ *
+ * Purpose: Instances of the H5C2_jbrb_sync_q_entry_t structure
+ * are used to maintain a queue of pending aio_fsync()
+ * operations.
+ *
+ * The basic idea is to issue a call to aio_fsync()
+ * after each transaction if that transaction has
+ * triggered a buffer write, and place the associated
+ * AIO control block on a queue of asynchronous syncs
+ * in progress. Then, whenever we are asked for the
+ * ID of the last transaction on disk, we simply scan
+ * this queue to see what if any syncs have completed,
+ * and update the last transaction on disk accordingly.
+ *
+ * The fields of this structure are discussed below:
+ *
+ *
+ * magic: Unsigned 32-bit integer always set to
+ * H5C2__H5C2_JBRB_SYNC_Q_T_MAGIC. This field is used
+ * to validate pointers to instances of
+ * H5C2_jbrb_sync_q_entry_t.
+ *
+ * last_trans_in_sync: ID of the last transaction that will be on disk
+ * when the associated aio_fsync() completes.
+ *
+ * clt_blk Instance of aiocb used in the associated call to
+ * aio_fsync().
+ *
+ * next: Pointer to the next instance of
+ * H5C2_jbrb_sync_q_entry_t in the list of same,
+ * or NULL if there is no next instance.
+ *
+ ******************************************************************************/
+
+#define H5C2__H5C2_JBRB_SYNC_Q_T_MAGIC (unsigned)0x00DA030
+
+struct H5C2_jbrb_sync_q_entry_t
+{
+ uint32_t magic;
+ uint64_t last_trans_in_sync;
+ struct aiocb ctl_blk;
+ struct H5C2_jbrb_sync_q_entry_t * next;
+};
+
+/******************************************************************************
+ *
* Structure: H5C2_jbrb_t
*
* Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
@@ -61,19 +110,19 @@
* The fields of this structure are discussed below:
*
*
- * magic: Unsigned 32-bit integer always set to
- * H5C2__H5C2_JBRB_T_MAGIC. This field is used to
+ * magic: Unsigned 32-bit integer always set to
+ * H5C2__H5C2_JBRB_T_MAGIC. This field is used to
* validate pointers to instances of H5C_jbrb_t.
*
* journal_magic: int32_t used to store a randomly selected integer
- * used to tag both the journal file and the
- * mdj_config_block. Should the journal ever be
- * run, we will check to see if the magic number
- * from the target HDF5 file matches that in the
+ * used to tag both the journal file and the
+ * mdj_config_block. Should the journal ever be
+ * run, we will check to see if the magic number
+ * from the target HDF5 file matches that in the
* journal, and refuse to run the journal if it does
* not.
*
- * journal_file_fd: File Descriptor of the journal file that is being
+ * journal_file_fd: File Descriptor of the journal file that is being
* written to from this ring buffer.
*
* num_bufs: The number of journal buffers in the ring buffer. This
@@ -82,21 +131,24 @@
* one for holding the last set of journal entries while
* they are being written to disk).
*
- * buf_size: The size of each journal buffer in the ring buffer. This
- * value is user specified, and will determine how much
- * data each journal buffer can hold before a move to
- * another journal buffer in the ring buffer is necessary.
- * Typically, this will be a multiple of the block size of
- * the underlying file system.
+ * buf_size: The size of each journal buffer in the ring buffer.
+ * This value is user specified, and will determine how
+ * much data each journal buffer can hold before a move
+ * to another journal buffer in the ring buffer is
+ * necessary. Typically, this will be a multiple of
+ * the block size of the underlying file system.
*
* bufs_in_use: This is the current number of dirty journal buffers
* in the ring buffer.
*
+ * writes_in_progress: Number of asynchronous writes in progress. Defined
+ * iff use_aio (see below) is TRUE.
+ *
* jvers: The journal version number. This is used to keep track
* of the formatting changes of the journal file.
*
* get: Number of the journal buffer that is next in line to
- * be written to disk. (i.e. the least recently dirtied
+ * be written to disk. (i.e. the least recently dirtied
* journal buffer).
*
* put: Number of the journal buffer that is currently being
@@ -111,25 +163,25 @@
* human_readable: Boolean flag that indicates whether the journal file
* is to be human readable or machine readable.
*
- * offset_width: If human_readable is FALSE, this field contains the
- * width of offsets in the HDF5 file in bytes (as
- * specified in the superblock -- sizeof_addr in
+ * offset_width: If human_readable is FALSE, this field contains the
+ * width of offsets in the HDF5 file in bytes (as
+ * specified in the superblock -- sizeof_addr in
* H5F_file_t).
*
* If human_readable is TRUE, this field is undefined.
*
* length_width: If human_readable is FALSE, this field contains the
- * width of lengths in the HDF5 file in bytes (as
- * specified in the super block -- sizeof_size in
+ * width of lengths in the HDF5 file in bytes (as
+ * specified in the super block -- sizeof_size in
* H5F_file_t).
*
* chksum_cur_msg: Boolean flag that is only defined if human_readable
* is false. It is used to indicate whether the current
- * journal message must be checksumed. If true, the
+ * journal message must be checksumed. If true, the
* message checksum to date is stored in the msg_chksum
* (discussed below).
*
- * If the journal message is being checksumed, this
+ * If the journal message is being checksumed, this
* field will be set back to FALSE when the checksum
* of the messages is written to buffer.
*
@@ -137,7 +189,7 @@
* journal file message. Note that not all messages
* are checksumed -- this field is only defined when
* chksum_cur_msg is TRUE.
- *
+ *
* journal_is_empty: Boolean flag that indicates if the journal file
* associated with the ring buffer is currently
* empty.
@@ -145,17 +197,29 @@
* cur_trans: Current transaction number, used to differentiate
* between differing journal entries in the journal file.
*
+ * last_trans_queued: Number of the last transaction that has been
+ * successfully queued (i.e. the associated aio_write()
+ * call has returned without error. At present, this
+ * field is only defined when use_aio (see above) is
+ * TRUE, and only used when use_aio_fsync (see below)
+ * is TRUE as well.
+ *
+ * last_trans_written: Number of the last transaction that has been
+ * successfully written. At present, this field is
+ * only defined when use_aio (see above) is TRUE.
+ *
* last_trans_on_disk: Number of the last transaction that has successfully
* made it to disk.
*
* trans_in_prog: Boolean flag that indicates if a transaction is in
* progress or not.
*
- * jname: Character array containing the name of the journal file.
+ * jname: Character array containing the name of the journal
+ * file.
*
* hdf5_file_name: Character array containing the name of the HDF5 file
* associated with this journal file.
- *
+ *
* header_present: Boolean flag that indicates if the header message has
* been written into the current journal file or journal
* buffer.
@@ -165,14 +229,14 @@
* ring buffer needs to switch to writing to the next
* journal buffer.
*
- * rb_space_to_rollover: The amount of space left at the end of the ring
+ * rb_space_to_rollover: The amount of space left at the end of the ring
* buffer, starting at the head pointer, and ending at
* the end of the ring buffer's allocate space. This
* is used to keep track of when a rollover to the start
* of the ring buffer must occur.
*
* rb_free_space: The amount of unused space in the ring buffer.
- *
+ *
* head: A pointer to the location in the active journal buffer
* that is to be written to.
*
@@ -181,16 +245,114 @@
* is used when the buffers are flushed to determine which
* is the last transaction successfully on disk.
*
+ * aio_ctl_blks An array of size num_bufs of instances of struct
+ * aiocb, or NULL if use_aio is FALSE.
+ *
+ * Each instance of struct aiocb is associated with
+ * the buffer at the same index in buf, and is used
+ * to manage posix aio for that buffer.
+ *
+ * Note that it is said to be good practice to zero
+ * out each instance of struct aiocb before each
+ * write.
+ *
+ * aio_next_buf_offset: Offset in the journal file at which to write the
+ * next buffer to the journal file. This field is
+ * undefined if use_aio is FALSE.
+ *
+ * use_aio_fsync: Boolean flag indicating whether we should attempt to
+ * use aio_fsync() to sync out journal writes. This
+ * field is initialized to TRUE whenever use_aio (see
+ * above) is set to TRUE, and then set to FALSE
+ * if we determine that aio_fsync() is not supported
+ * on the current host.
+ *
+ * aio_sync_q_head: Pointer to the first element in the aio sync queue,
+ * or NULL if that queue is empty.
+ *
+ * aio_sync_q_tail: Pointer to the last element in the aio sync queue,
+ * or NULL if that queue is empty.
+ *
+ * aio_sync_q_len: Number of elements on the aio sync queue. Note that
+ * aio_sync_q_head and aio_sync_q_tail must be NULL
+ * if this field contains zero, and may not be NULL if
+ * the sync queue length is greater than zero.
+ *
* buf: Array of char pointers to each journal buffer in the
- * ring buffer. This is allocated as a single chunk of
+ * ring buffer. This is allocated as a single chunk of
* memory, and thus data can be written past a buffer
* boundary provided it will not extend past the end
* of the total area allocated for the ring buffer.
*
+ * The following fields are used to collect statistics on the activities
+ * of the journal entry write code. These fields are only defined when
+ * H5C2__JBRB__COLLECT_STATS is TRUE. Descriptions of the individual
+ * stats collection fields follow:
+ *
+ * transactions_completed: uint64_t used to track the number of transactions
+ * completed. This is simply the number of calls to
+ * H5C2_jb__end_transaction().
+ *
+ * buf_writes_queued: uint64_t used to track the number of asynchronous
+ * buffer writes queued (via aio_write()).
+ *
+ * full_buf_writes_queued: uint64_t used to track the number of
+ * full asynchronous buffer writes queued
+ * (via aio_write()).
+ *
+ * partial_buf_writes_queued; uint64_t used to track the number of
+ * partial (i.e. writes of a buffer that isn't full)
+ * buffer writes queued (via aio_write()).
+ *
+ * buf_writes_completed: uint64_t used to track the total number of
+ * asynchronous buffer writes (queued via aio_write())
+ * that have completed.
+ *
+ * buf_writes_completed_by_test: uint64_t used to track the number of
+ * asynchronous buffer writes completed by test
+ * (i.e. the write was found to be complete in a
+ * routine check for completed writes without any
+ * waiting.)
+ *
+ * buf_writes_completed_by_await: uint64_t used to track the number of
+ * asynchronous buffer writes completed by await
+ * (i.e. the write was completed via a call to
+ * aio_suspend()) because processing could not
+ * continue until the write completed.
+ *
+ * async_syncs_queued: uint64_t used to track the number of asynchronous
+ * syncs queued (via aio_fsync()).
+ *
+ *
+ * async_syncs_completed: uin64_t used to track the number of asynchronous
+ * syncs completed.
+ *
+ * async_syncs_completed_by_test; uint64_t used to track the number of
+ * asynchronous syncs completed by test
+ * (i.e. the sync was found to be complete in a
+ * routine check for completed writes without any
+ * waiting.).
+ *
+ * async_syncs_completed_by_await; uint64_t used to track the number of
+ * asynchronous syncs completed by await
+ * (i.e. the sync was completed busy waiting
+ * with repeated calls to aio_error()).
+ *
+ * calls_to_aio_error_awaiting_sync: uint64_t used to track the number of
+ * calls to aio_error() made while busy waiting for
+ * the completion of aio_fsync()s.
+ *
+ * max_sync_q_len: uint64_t used to track the maximum value of
+ *
+ * calls_to_fsync: uint64_t used to track the number of calls to
+ * fsync().
+ *
******************************************************************************/
-#define H5C2__H5C2_JBRB_T_MAGIC (unsigned)0x00D0A03
-#define H5C2__JOURNAL_VERSION 1
+#define H5C2__H5C2_JBRB_T_MAGIC (unsigned)0x00D0A03
+#define H5C2__JOURNAL_VERSION 1
+#define H5C2__JBRB__COLLECT_STATS 0
+#define H5C2__JBRB__DUMP_STATS_ON_TAKEDOWN 0
/* tags used to mark entries in the journal file header */
#define H5C2_JNL__VER_NUM_TAG "ver_num"
@@ -201,7 +363,7 @@
#define H5C2_JNL__OFFSET_WIDTH_TAG "offset_width"
#define H5C2_JNL__LENGTH_WIDTH_TAG "length_width"
-/* signatures and versions used to mark the beginnings of journal file
+/* signatures and versions used to mark the beginnings of journal file
* messages in binary journal files.
*/
@@ -215,47 +377,74 @@
#define H5C2_BJNL__END_ADDR_SPACE_SIG "eoas"
#define H5C2_BJNL__END_ADDR_SPACE_VER ((uint8_t)(0))
-struct H5C2_jbrb_t
+struct H5C2_jbrb_t
{
- uint32_t magic;
- int32_t journal_magic;
- int journal_file_fd;
- int num_bufs;
- size_t buf_size;
- int bufs_in_use;
- unsigned long jvers;
- int get;
- int put;
- hbool_t jentry_written;
- hbool_t use_aio;
- hbool_t human_readable;
- int offset_width;
- int length_width;
- hbool_t chksum_cur_msg;
- uint32_t msg_chksum;
- hbool_t journal_is_empty;
- uint64_t cur_trans;
- uint64_t last_trans_on_disk;
- hbool_t trans_in_prog;
- const char * jname;
- const char * hdf5_file_name;
- hbool_t header_present;
- size_t cur_buf_free_space;
- size_t rb_space_to_rollover;
- size_t rb_free_space;
- char * head;
- unsigned long (*trans_tracking)[];
- char *((*buf)[]);
+ uint32_t magic;
+ int32_t journal_magic;
+ int journal_file_fd;
+ int num_bufs;
+ size_t buf_size;
+ int bufs_in_use;
+ int writes_in_progress;
+ unsigned long jvers;
+ int get;
+ int put;
+ hbool_t jentry_written;
+ hbool_t use_aio;
+ hbool_t human_readable;
+ int offset_width;
+ int length_width;
+ hbool_t chksum_cur_msg;
+ uint32_t msg_chksum;
+ hbool_t journal_is_empty;
+ uint64_t cur_trans;
+ uint64_t last_trans_queued;
+ uint64_t last_trans_written;
+ uint64_t last_trans_on_disk;
+ hbool_t trans_in_prog;
+ char * jname;
+ char * hdf5_file_name;
+ hbool_t header_present;
+ size_t cur_buf_free_space;
+ size_t rb_space_to_rollover;
+ size_t rb_free_space;
+ char * head;
+ uint64_t (*trans_tracking)[];
+ struct aiocb (*aio_ctl_blks)[];
+ off_t aio_next_buf_offset;
+ hbool_t use_aio_fsync;
+ struct H5C2_jbrb_sync_q_entry_t * aio_sync_q_head;
+ struct H5C2_jbrb_sync_q_entry_t * aio_sync_q_tail;
+ uint64_t aio_sync_q_len;
+ char *((*buf)[]);
+#if H5C2__JBRB__COLLECT_STATS
+ uint64_t transactions_completed;
+ uint64_t buf_writes_queued;
+ uint64_t full_buf_writes_queued;
+ uint64_t partial_buf_writes_queued;
+ uint64_t buf_writes_completed;
+ uint64_t buf_writes_completed_by_test;
+ uint64_t buf_writes_completed_by_await;
+ uint64_t async_syncs_queued;
+ uint64_t async_syncs_completed;
+ uint64_t async_syncs_completed_by_test;
+ uint64_t async_syncs_completed_by_await;
+ uint64_t calls_to_aio_error_awaiting_sync;
+ uint64_t max_sync_q_len;
+ uint64_t calls_to_fsync;
+#endif /* H5C2__JBRB__COLLECT_STATS */
};
-/* With the introduction of the fractal heap, it is now possible for
+/* With the introduction of the fractal heap, it is now possible for
* entries to be dirtied, resized, and/or renamed in the flush callbacks.
* As a result, on flushes, it may be necessary to make multiple passes
* through the slist before it is empty. The H5C2__MAX_PASSES_ON_FLUSH
* #define is used to set an upper limit on the number of passes.
- * The current value was obtained via personal communication with
+ * The current value was obtained via personal communication with
* Quincey. I have applied a fudge factor of 2.
+ *
+ * -- JRM
*/
#define H5C2__MAX_PASSES_ON_FLUSH 4
@@ -265,8 +454,8 @@ struct H5C2_jbrb_t
*
* structure H5C2_mdjsc_record_t
*
- * A dynamically allocate array of instances of H5C2_mdjsc_record_t is
- * used to record metadata journaling status change callbacks -- of which
+ * A dynamically allocate array of instances of H5C2_mdjsc_record_t is
+ * used to record metadata journaling status change callbacks -- of which
* there can be an arbitrary number.
*
* The fields in the structure are discussed individually below:
@@ -275,20 +464,20 @@ struct H5C2_jbrb_t
* to be called on metadata journaling start or stop. NULL
* if this record is not in use.
*
- * Note that the cache must be clean when this callback
+ * Note that the cache must be clean when this callback
* is called.
*
* data_ptr: Pointer to void. This value is supplied on registration,
- * and is passed to *fcn_ptr. NULL if this record is not
+ * and is passed to *fcn_ptr. NULL if this record is not
* in use.
*
* fl_next: Index of the next free entry in the metadata status change
- * callback table, or -1 if there is no next free entry or
+ * callback table, or -1 if there is no next free entry or
* if the entry is in use.
*
****************************************************************************/
-typedef struct H5C2_mdjsc_record_t
+typedef struct H5C2_mdjsc_record_t
{
H5C2_mdj_status_change_func_t fcn_ptr;
void * data_ptr;
@@ -334,11 +523,11 @@ typedef struct H5C2_mdjsc_record_t
*
* JRM - 9/26/05
*
- * magic: Unsigned 32 bit integer always set to H5C2__H5C2_T_MAGIC.
- * This field is used to validate pointers to instances of
+ * magic: Unsigned 32 bit integer always set to H5C2__H5C2_T_MAGIC.
+ * This field is used to validate pointers to instances of
* H5C2_t.
*
- * flush_in_progress: Boolean flag indicating whether a flush is in
+ * flush_in_progress: Boolean flag indicating whether a flush is in
* progress.
*
* trace_file_ptr: File pointer pointing to the trace file, which is used
@@ -347,7 +536,7 @@ typedef struct H5C2_mdjsc_record_t
* no trace file should be recorded.
*
* Since much of the code supporting the parallel metadata
- * cache is in H5AC, we don't write the trace file from
+ * cache is in H5AC, we don't write the trace file from
* H5C2. Instead, H5AC reads the trace_file_ptr as needed.
*
* When we get to using H5C2 in other places, we may add
@@ -420,10 +609,10 @@ typedef struct H5C2_mdjsc_record_t
* writes. The following field is used to implement this.
*
* evictions_enabled: Boolean flag that is initialized to TRUE. When
- * this flag is set to FALSE, the metadata cache will not
+ * this flag is set to FALSE, the metadata cache will not
* attempt to evict entries to make space for newly protected
* entries, and instead the will grow without limit.
- *
+ *
* Needless to say, this feature must be used with care.
*
*
@@ -494,7 +683,7 @@ typedef struct H5C2_mdjsc_record_t
* following two fields have been added. They are only compiled in when
* H5C2_DO_SANITY_CHECKS is TRUE.
*
- * slist_len_increase: Number of entries that have been added to the
+ * slist_len_increase: Number of entries that have been added to the
* slist since the last time this field was set to zero.
*
* slist_size_increase: Total size of all entries that have been added
@@ -817,39 +1006,39 @@ typedef struct H5C2_mdjsc_record_t
*
* Metadata journaling fields:
*
- * The following fields are used to support metadata journaling. The
+ * The following fields are used to support metadata journaling. The
* objective here is to journal all changes in metadata, so that we will
* be able to re-construct a HDF5 file with a consistent set of metadata
* in the event of a crash.
*
- * mdj_enabled: Boolean flag used to indicate whether journaling is
- * currently enabled. In general, the values of the
- * remaining fields in this section are undefined if
+ * mdj_enabled: Boolean flag used to indicate whether journaling is
+ * currently enabled. In general, the values of the
+ * remaining fields in this section are undefined if
* mdj_enabled is FALSE.
*
* trans_in_progress Boolean flag used to indicate whether a metadata
- * transaction is in progress.
+ * transaction is in progress.
*
- * For purposes of metadata journaling, a transaction is a
- * sequence of operations on metadata selected such that
- * the HDF5 file metadata is in a consistent state both at
- * the beginning and at the end of the sequence.
+ * For purposes of metadata journaling, a transaction is a
+ * sequence of operations on metadata selected such that
+ * the HDF5 file metadata is in a consistent state both at
+ * the beginning and at the end of the sequence.
*
* At least to begin with, transactions will be closely tied
* to user level API calls.
*
- * trans_api_name: Array of char of length H5C2__MAX_API_NAME_LEN + 1. Used
- * to store the name of the API call associated with the
+ * trans_api_name: Array of char of length H5C2__MAX_API_NAME_LEN + 1. Used
+ * to store the name of the API call associated with the
* current transaction.
*
- * trans_num: uint64_t containing the id assigned to the current
- * transaction (if trans_in_progress is TRUE), or of the
+ * trans_num: uint64_t containing the id assigned to the current
+ * transaction (if trans_in_progress is TRUE), or of the
* last transaction completed (if trans_in_progress is FALSE),
* or zero if no transaction has been initiated yet.
*
- * last_trans_on_disk: uint64_t containing the id assigned to the
+ * last_trans_on_disk: uint64_t containing the id assigned to the
* last transaction all of whose associated journal entries
- * are on disk in the journal file.
+ * are on disk in the journal file.
*
* We must track this value, as to avoid messages from the
* future, we must not write a cache entry to file until
@@ -858,21 +1047,21 @@ typedef struct H5C2_mdjsc_record_t
* file.
*
* jnl_magic: Randomly selected int32_t used to reduce the possibility
- * of running the wrong journal on an HDF5 file. The basic
- * idea is to pick a random number, store it in both the HDF5
- * file and the journal file, and then refuse to run the
+ * of running the wrong journal on an HDF5 file. The basic
+ * idea is to pick a random number, store it in both the HDF5
+ * file and the journal file, and then refuse to run the
* journal unless the numbers match.
*
* jnl_file_name_len: Length of the journal file name, or zero if the
* journal file name is undefined.
*
- * jnl_file_name: Array of char of length H5C2__MAX_JOURNAL_FILE_NAME_LEN
+ * jnl_file_name: Array of char of length H5C2__MAX_JOURNAL_FILE_NAME_LEN
* + 1 used to store the journal file path.
*
* mdj_jbrb: Instance of H5C2_jbrb_t used to manage logging of journal
* entries to the journal file.
*
- * While a transaction is in progress, we must maintain a list of the
+ * While a transaction is in progress, we must maintain a list of the
* entries that have been modified during the transaction so we can
* generate the appropriate journal entries. The following fields are
* used to maintain this list:
@@ -883,56 +1072,56 @@ typedef struct H5C2_mdjsc_record_t
* transaction list.
*
* tl_head_ptr: Pointer to the head of the doubly linked list of entries
- * dirtied in the current transaction. Note that cache entries
- * on this list are linked by their trans_next and trans_prev
+ * dirtied in the current transaction. Note that cache entries
+ * on this list are linked by their trans_next and trans_prev
* fields.
*
* This field is NULL if the list is empty.
*
* tl_tail_ptr: Pointer to the tail of the doubly linked list of entries
- * dirtied in the current transaction. Note that cache entries
- * on this list are linked by their trans_next and trans_prev
+ * dirtied in the current transaction. Note that cache entries
+ * on this list are linked by their trans_next and trans_prev
* fields.
*
* This field is NULL if the list is empty.
*
- * When an entry is dirtied in a transaction, we must not flush it until
- * all the journal entries generated by the transaction have reached disk
+ * When an entry is dirtied in a transaction, we must not flush it until
+ * all the journal entries generated by the transaction have reached disk
* in the journal file.
*
* We could just leave these entries in the LRU and skip over them when
- * we scan the list for candidates for eviction. However, this will be
+ * we scan the list for candidates for eviction. However, this will be
* costly, so we store them on the journal write in progress list instead
- * until all the journal entries for the specified transaction reaches
+ * until all the journal entries for the specified transaction reaches
* disk.
*
- * jwipl_len: Number of entries currently residing on the journal
+ * jwipl_len: Number of entries currently residing on the journal
* entry write in progress list.
*
* jwipl_size: Number of bytes of cache entries currently residing on the
* journal entry write in progress list.
*
* jwipl_head_ptr: Pointer to the head of the doubly linked list of entries
- * dirtied in some transaction n, where at least some of the
+ * dirtied in some transaction n, where at least some of the
* journal entries generated in transaction n have not yet
* made it to disk in the journal file.
*
- * Entries on this list are linked by their next and prev
+ * Entries on this list are linked by their next and prev
* fields.
*
* This field is NULL if the list is empty.
*
* jwipl_tail_ptr: Pointer to the tail of the doubly linked list of entries
- * dirtied in some transaction n, where at least some of the
+ * dirtied in some transaction n, where at least some of the
* journal entries generated in transaction n have not yet
* made it to disk in the journal file.
*
- * Entries on this list are linked by their next and prev
+ * Entries on this list are linked by their next and prev
* fields.
*
* This field is NULL if the list is empty.
*
- * It is necessary to turn off some optimization while journaling is
+ * It is necessary to turn off some optimization while journaling is
* in progress, so as to avoid generating dirty metadata during a flush.
* The following fields are used to maintain a list of functions to be
* called when journaling is enabled or disabled. Note that the metadata
@@ -940,15 +1129,15 @@ typedef struct H5C2_mdjsc_record_t
*
* The metadata journaling status change callback table is initaly allocated
* with H5C2__MIN_MDJSC_CB_TBL_LEN entries. The table size is doubled
- * whenever an entry is added to a full table, and halved whenever the
- * active entries to total entries ratio drops below
- * H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO and the upper half of the table is
- * empty (Since entries are removed from the table by specifying the
+ * whenever an entry is added to a full table, and halved whenever the
+ * active entries to total entries ratio drops below
+ * H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO and the upper half of the table is
+ * empty (Since entries are removed from the table by specifying the
* index of the entry, we can't compress the table).
*
* mdjsc_cb_tbl: Base address of a dynamically allocated array of instances
- * of H5C2_mdjsc_record_t used to record an arbitrarily long
- * list of functions to call whenever journaling is enabled or
+ * of H5C2_mdjsc_record_t used to record an arbitrarily long
+ * list of functions to call whenever journaling is enabled or
* disabled.
*
* mdjsc_cb_tbl_len: Number of entries currently allocated in *mdjsc_cb_tbl.
@@ -960,7 +1149,7 @@ typedef struct H5C2_mdjsc_record_t
* or -1 if the table is full.
*
* mdjsc_cb_tbl_max_idx_in_use: Maximum of the indicies of metadata journaling
- * status change callback table entries in use, or -1 if the
+ * status change callback table entries in use, or -1 if the
* table is empty;
*
* Statistics collection fields:
@@ -979,23 +1168,23 @@ typedef struct H5C2_mdjsc_record_t
* equal to the array index has not been in cache when
* requested in the current epoch.
*
- * write_protects: Array of int64 of length H5C2__MAX_NUM_TYPE_IDS + 1. The
- * cells are used to record the number of times an entry with
- * type id equal to the array index has been write protected
+ * write_protects: Array of int64 of length H5C2__MAX_NUM_TYPE_IDS + 1. The
+ * cells are used to record the number of times an entry with
+ * type id equal to the array index has been write protected
* in the current epoch.
*
* Observe that (hits + misses) = (write_protects + read_protects).
*
- * read_protects: Array of int64 of length H5C2__MAX_NUM_TYPE_IDS + 1. The
- * cells are used to record the number of times an entry with
- * type id equal to the array index has been read protected in
+ * read_protects: Array of int64 of length H5C2__MAX_NUM_TYPE_IDS + 1. The
+ * cells are used to record the number of times an entry with
+ * type id equal to the array index has been read protected in
* the current epoch.
*
* Observe that (hits + misses) = (write_protects + read_protects).
*
- * max_read_protects: Array of int32 of length H5C2__MAX_NUM_TYPE_IDS + 1.
- * The cells are used to maximum number of simultaneous read
- * protects on any entry with type id equal to the array index
+ * max_read_protects: Array of int32 of length H5C2__MAX_NUM_TYPE_IDS + 1.
+ * The cells are used to maximum number of simultaneous read
+ * protects on any entry with type id equal to the array index
* in the current epoch.
*
* insertions: Array of int64 of length H5C2__MAX_NUM_TYPE_IDS + 1. The cells
@@ -1003,9 +1192,9 @@ typedef struct H5C2_mdjsc_record_t
* id equal to the array index has been inserted into the
* cache in the current epoch.
*
- * pinned_insertions: Array of int64 of length H5C2__MAX_NUM_TYPE_IDS + 1.
- * The cells are used to record the number of times an entry
- * with type id equal to the array index has been inserted
+ * pinned_insertions: Array of int64 of length H5C2__MAX_NUM_TYPE_IDS + 1.
+ * The cells are used to record the number of times an entry
+ * with type id equal to the array index has been inserted
* pinned into the cache in the current epoch.
*
* clears: Array of int64 of length H5C2__MAX_NUM_TYPE_IDS + 1. The cells
@@ -1028,13 +1217,13 @@ typedef struct H5C2_mdjsc_record_t
* id equal to the array index has been renamed in the current
* epoch.
*
- * entry_flush_renames: Array of int64 of length H5C2__MAX_NUM_TYPE_IDS + 1.
- * The cells are used to record the number of times an entry
+ * entry_flush_renames: Array of int64 of length H5C2__MAX_NUM_TYPE_IDS + 1.
+ * The cells are used to record the number of times an entry
* with type id equal to the array index has been renamed
* during its flush callback in the current epoch.
*
- * cache_flush_renames: Array of int64 of length H5C2__MAX_NUM_TYPE_IDS + 1.
- * The cells are used to record the number of times an entry
+ * cache_flush_renames: Array of int64 of length H5C2__MAX_NUM_TYPE_IDS + 1.
+ * The cells are used to record the number of times an entry
* with type id equal to the array index has been renamed
* during a cache flush in the current epoch.
*
@@ -1073,14 +1262,14 @@ typedef struct H5C2_mdjsc_record_t
* with type id equal to the array index has decreased in
* size in the current epoch.
*
- * entry_flush_size_changes: Array of int64 of length
- * H5C2__MAX_NUM_TYPE_IDS + 1. The cells are used to record
- * the number of times an entry with type id equal to the
+ * entry_flush_size_changes: Array of int64 of length
+ * H5C2__MAX_NUM_TYPE_IDS + 1. The cells are used to record
+ * the number of times an entry with type id equal to the
* array index has changed size while in its flush callback.
*
- * cache_flush_size_changes: Array of int64 of length
- * H5C2__MAX_NUM_TYPE_IDS + 1. The cells are used to record
- * the number of times an entry with type id equal to the
+ * cache_flush_size_changes: Array of int64 of length
+ * H5C2__MAX_NUM_TYPE_IDS + 1. The cells are used to record
+ * the number of times an entry with type id equal to the
* array index has changed size during a cache flush
*
* total_ht_insertions: Number of times entries have been inserted into the
@@ -1278,7 +1467,7 @@ struct H5C2_t
int64_t cache_hits;
int64_t cache_accesses;
-
+
hbool_t mdj_enabled;
hbool_t trans_in_progress;
char trans_api_name[H5C2__MAX_API_NAME_LEN];
@@ -1286,7 +1475,7 @@ struct H5C2_t
uint64_t last_trans_on_disk;
int32_t jnl_magic;
int32_t jnl_file_name_len;
- char jnl_file_name[H5C2__MAX_JOURNAL_FILE_NAME_LEN
+ char jnl_file_name[H5C2__MAX_JOURNAL_FILE_NAME_LEN
+ 1];
struct H5C2_jbrb_t mdj_jbrb;
int32_t tl_len;
@@ -1302,7 +1491,7 @@ struct H5C2_t
int32_t num_mdjsc_cbs;
int32_t mdjsc_cb_tbl_fl_head;
int32_t mdjsc_cb_tbl_max_idx_in_use;
-
+
#if H5C2_COLLECT_CACHE_STATS
/* stats fields */
@@ -1468,10 +1657,10 @@ struct H5C2_t
*
* JRM - 9/8/05
*
- * - Added a set of macros supporting doubly linked lists using the new
- * trans_next and trans_prev fields in H5C2_cache_entry_t. These
+ * - Added a set of macros supporting doubly linked lists using the new
+ * trans_next and trans_prev fields in H5C2_cache_entry_t. These
* fields are used to maintain a list of entries that have been dirtied
- * in the current transaction. At the end of the transaction, this
+ * in the current transaction. At the end of the transaction, this
* list is used to generate the needed journal entries.
*
* JRM -- 3/27/08
@@ -1720,70 +1909,70 @@ if ( ( (entry_ptr) == NULL ) || \
#define H5C2__AUX_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val)\
H5C2__AUX_DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \
- fail_val) \
- if ( (head_ptr) == NULL ) \
- { \
- (head_ptr) = (entry_ptr); \
- (tail_ptr) = (entry_ptr); \
- } \
- else \
- { \
- (tail_ptr)->aux_next = (entry_ptr); \
- (entry_ptr)->aux_prev = (tail_ptr); \
- (tail_ptr) = (entry_ptr); \
- } \
- (len)++; \
+ fail_val) \
+ if ( (head_ptr) == NULL ) \
+ { \
+ (head_ptr) = (entry_ptr); \
+ (tail_ptr) = (entry_ptr); \
+ } \
+ else \
+ { \
+ (tail_ptr)->aux_next = (entry_ptr); \
+ (entry_ptr)->aux_prev = (tail_ptr); \
+ (tail_ptr) = (entry_ptr); \
+ } \
+ (len)++; \
(Size) += entry_ptr->size;
#define H5C2__AUX_DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
H5C2__AUX_DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \
- fv) \
- if ( (head_ptr) == NULL ) \
- { \
- (head_ptr) = (entry_ptr); \
- (tail_ptr) = (entry_ptr); \
- } \
- else \
- { \
- (head_ptr)->aux_prev = (entry_ptr); \
- (entry_ptr)->aux_next = (head_ptr); \
- (head_ptr) = (entry_ptr); \
- } \
- (len)++; \
+ fv) \
+ if ( (head_ptr) == NULL ) \
+ { \
+ (head_ptr) = (entry_ptr); \
+ (tail_ptr) = (entry_ptr); \
+ } \
+ else \
+ { \
+ (head_ptr)->aux_prev = (entry_ptr); \
+ (entry_ptr)->aux_next = (head_ptr); \
+ (head_ptr) = (entry_ptr); \
+ } \
+ (len)++; \
(Size) += entry_ptr->size;
#define H5C2__AUX_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
H5C2__AUX_DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \
- fv) \
- { \
- if ( (head_ptr) == (entry_ptr) ) \
- { \
- (head_ptr) = (entry_ptr)->aux_next; \
- if ( (head_ptr) != NULL ) \
- { \
- (head_ptr)->aux_prev = NULL; \
- } \
- } \
- else \
- { \
- (entry_ptr)->aux_prev->aux_next = (entry_ptr)->aux_next; \
- } \
- if ( (tail_ptr) == (entry_ptr) ) \
- { \
- (tail_ptr) = (entry_ptr)->aux_prev; \
- if ( (tail_ptr) != NULL ) \
- { \
- (tail_ptr)->aux_next = NULL; \
- } \
- } \
- else \
- { \
- (entry_ptr)->aux_next->aux_prev = (entry_ptr)->aux_prev; \
- } \
- entry_ptr->aux_next = NULL; \
- entry_ptr->aux_prev = NULL; \
- (len)--; \
- (Size) -= entry_ptr->size; \
+ fv) \
+ { \
+ if ( (head_ptr) == (entry_ptr) ) \
+ { \
+ (head_ptr) = (entry_ptr)->aux_next; \
+ if ( (head_ptr) != NULL ) \
+ { \
+ (head_ptr)->aux_prev = NULL; \
+ } \
+ } \
+ else \
+ { \
+ (entry_ptr)->aux_prev->aux_next = (entry_ptr)->aux_next; \
+ } \
+ if ( (tail_ptr) == (entry_ptr) ) \
+ { \
+ (tail_ptr) = (entry_ptr)->aux_prev; \
+ if ( (tail_ptr) != NULL ) \
+ { \
+ (tail_ptr)->aux_next = NULL; \
+ } \
+ } \
+ else \
+ { \
+ (entry_ptr)->aux_next->aux_prev = (entry_ptr)->aux_prev; \
+ } \
+ entry_ptr->aux_next = NULL; \
+ entry_ptr->aux_prev = NULL; \
+ (len)--; \
+ (Size) -= entry_ptr->size; \
}
#if H5C2_DO_SANITY_CHECKS
@@ -1974,7 +2163,7 @@ if ( ( (entry_ptr) == NULL ) || \
* More pinned entry stats related updates.
*
* JRM -- 3/31/07
- * Updated H5C2__UPDATE_STATS_FOR_PROTECT() to keep stats on
+ * Updated H5C2__UPDATE_STATS_FOR_PROTECT() to keep stats on
* read and write protects.
*
***********************************************************************/
@@ -2010,22 +2199,22 @@ if ( ( (entry_ptr) == NULL ) || \
(((cache_ptr)->renames)[(entry_ptr)->type->id])++;
#define H5C2__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)\
- if ( cache_ptr->flush_in_progress ) { \
- ((cache_ptr)->cache_flush_size_changes[(entry_ptr)->type->id])++; \
- } \
- if ( entry_ptr->flush_in_progress ) { \
- ((cache_ptr)->entry_flush_size_changes[(entry_ptr)->type->id])++; \
- } \
- if ( (entry_ptr)->size < (new_size) ) { \
- ((cache_ptr)->size_increases[(entry_ptr)->type->id])++; \
- if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size ) \
- (cache_ptr)->max_index_size = (cache_ptr)->index_size; \
- if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \
- (cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
- if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size ) \
- (cache_ptr)->max_pl_size = (cache_ptr)->pl_size; \
- } else if ( (entry_ptr)->size > (new_size) ) { \
- ((cache_ptr)->size_decreases[(entry_ptr)->type->id])++; \
+ if ( cache_ptr->flush_in_progress ) { \
+ ((cache_ptr)->cache_flush_size_changes[(entry_ptr)->type->id])++; \
+ } \
+ if ( entry_ptr->flush_in_progress ) { \
+ ((cache_ptr)->entry_flush_size_changes[(entry_ptr)->type->id])++; \
+ } \
+ if ( (entry_ptr)->size < (new_size) ) { \
+ ((cache_ptr)->size_increases[(entry_ptr)->type->id])++; \
+ if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size ) \
+ (cache_ptr)->max_index_size = (cache_ptr)->index_size; \
+ if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \
+ (cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
+ if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size ) \
+ (cache_ptr)->max_pl_size = (cache_ptr)->pl_size; \
+ } else if ( (entry_ptr)->size > (new_size) ) { \
+ ((cache_ptr)->size_decreases[(entry_ptr)->type->id])++; \
}
#define H5C2__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) \
@@ -2049,9 +2238,9 @@ if ( ( (entry_ptr) == NULL ) || \
#if H5C2_COLLECT_CACHE_ENTRY_STATS
#define H5C2__RESET_CACHE_ENTRY_STATS(entry_ptr) \
- (entry_ptr)->accesses = 0; \
- (entry_ptr)->clears = 0; \
- (entry_ptr)->flushes = 0; \
+ (entry_ptr)->accesses = 0; \
+ (entry_ptr)->clears = 0; \
+ (entry_ptr)->flushes = 0; \
(entry_ptr)->pins = 0;
#define H5C2__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) \
@@ -2277,100 +2466,100 @@ if ( ( (entry_ptr) == NULL ) || \
#if H5C2_DO_SANITY_CHECKS
#define H5C2__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
-if ( ( (cache_ptr) == NULL ) || \
- ( (cache_ptr)->magic != H5C2__H5C2_T_MAGIC ) || \
- ( (entry_ptr) == NULL ) || \
- ( ! H5F_addr_defined((entry_ptr)->addr) ) || \
- ( (entry_ptr)->ht_next != NULL ) || \
- ( (entry_ptr)->ht_prev != NULL ) || \
- ( (entry_ptr)->size <= 0 ) || \
+if ( ( (cache_ptr) == NULL ) || \
+ ( (cache_ptr)->magic != H5C2__H5C2_T_MAGIC ) || \
+ ( (entry_ptr) == NULL ) || \
+ ( ! H5F_addr_defined((entry_ptr)->addr) ) || \
+ ( (entry_ptr)->ht_next != NULL ) || \
+ ( (entry_ptr)->ht_prev != NULL ) || \
+ ( (entry_ptr)->size <= 0 ) || \
( (k = H5C2__HASH_FCN((entry_ptr)->addr)) < 0 ) || \
( k >= H5C2__HASH_TABLE_LEN ) ) { \
- HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, \
- "Pre HT insert SC failed") \
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, \
+ "Pre HT insert SC failed") \
}
-#define H5C2__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr) \
+#define H5C2__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr) \
if ( ( (cache_ptr) == NULL ) || \
- ( (cache_ptr)->magic != H5C2__H5C2_T_MAGIC ) || \
+ ( (cache_ptr)->magic != H5C2__H5C2_T_MAGIC ) || \
( (cache_ptr)->index_len < 1 ) || \
( (entry_ptr) == NULL ) || \
( (cache_ptr)->index_size < (entry_ptr)->size ) || \
( ! H5F_addr_defined((entry_ptr)->addr) ) || \
( (entry_ptr)->size <= 0 ) || \
- ( H5C2__HASH_FCN((entry_ptr)->addr) < 0 ) || \
- ( H5C2__HASH_FCN((entry_ptr)->addr) >= H5C2__HASH_TABLE_LEN ) || \
- ( ((cache_ptr)->index)[(H5C2__HASH_FCN((entry_ptr)->addr))] \
+ ( H5C2__HASH_FCN((entry_ptr)->addr) < 0 ) || \
+ ( H5C2__HASH_FCN((entry_ptr)->addr) >= H5C2__HASH_TABLE_LEN ) || \
+ ( ((cache_ptr)->index)[(H5C2__HASH_FCN((entry_ptr)->addr))] \
== NULL ) || \
- ( ( ((cache_ptr)->index)[(H5C2__HASH_FCN((entry_ptr)->addr))] \
+ ( ( ((cache_ptr)->index)[(H5C2__HASH_FCN((entry_ptr)->addr))] \
!= (entry_ptr) ) && \
( (entry_ptr)->ht_prev == NULL ) ) || \
- ( ( ((cache_ptr)->index)[(H5C2__HASH_FCN((entry_ptr)->addr))] == \
+ ( ( ((cache_ptr)->index)[(H5C2__HASH_FCN((entry_ptr)->addr))] == \
(entry_ptr) ) && \
( (entry_ptr)->ht_prev != NULL ) ) ) { \
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Pre HT remove SC failed") \
}
#define H5C2__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val) \
-if ( ( (cache_ptr) == NULL ) || \
- ( (cache_ptr)->magic != H5C2__H5C2_T_MAGIC ) || \
- ( ! H5F_addr_defined(Addr) ) || \
+if ( ( (cache_ptr) == NULL ) || \
+ ( (cache_ptr)->magic != H5C2__H5C2_T_MAGIC ) || \
+ ( ! H5F_addr_defined(Addr) ) || \
( H5C2__HASH_FCN(Addr) < 0 ) || \
- ( H5C2__HASH_FCN(Addr) >= H5C2__HASH_TABLE_LEN ) ) { \
- HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "Pre HT search SC failed") \
+ ( H5C2__HASH_FCN(Addr) >= H5C2__HASH_TABLE_LEN ) ) { \
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "Pre HT search SC failed") \
}
#define H5C2__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) \
-if ( ( (cache_ptr) == NULL ) || \
- ( (cache_ptr)->magic != H5C2__H5C2_T_MAGIC ) || \
- ( (cache_ptr)->index_len < 1 ) || \
- ( (entry_ptr) == NULL ) || \
- ( (cache_ptr)->index_size < (entry_ptr)->size ) || \
- ( H5F_addr_ne((entry_ptr)->addr, (Addr)) ) || \
- ( (entry_ptr)->size <= 0 ) || \
- ( ((cache_ptr)->index)[k] == NULL ) || \
- ( ( ((cache_ptr)->index)[k] != (entry_ptr) ) && \
- ( (entry_ptr)->ht_prev == NULL ) ) || \
- ( ( ((cache_ptr)->index)[k] == (entry_ptr) ) && \
- ( (entry_ptr)->ht_prev != NULL ) ) || \
- ( ( (entry_ptr)->ht_prev != NULL ) && \
- ( (entry_ptr)->ht_prev->ht_next != (entry_ptr) ) ) || \
- ( ( (entry_ptr)->ht_next != NULL ) && \
- ( (entry_ptr)->ht_next->ht_prev != (entry_ptr) ) ) ) { \
- HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, \
- "Post successful HT search SC failed") \
+if ( ( (cache_ptr) == NULL ) || \
+ ( (cache_ptr)->magic != H5C2__H5C2_T_MAGIC ) || \
+ ( (cache_ptr)->index_len < 1 ) || \
+ ( (entry_ptr) == NULL ) || \
+ ( (cache_ptr)->index_size < (entry_ptr)->size ) || \
+ ( H5F_addr_ne((entry_ptr)->addr, (Addr)) ) || \
+ ( (entry_ptr)->size <= 0 ) || \
+ ( ((cache_ptr)->index)[k] == NULL ) || \
+ ( ( ((cache_ptr)->index)[k] != (entry_ptr) ) && \
+ ( (entry_ptr)->ht_prev == NULL ) ) || \
+ ( ( ((cache_ptr)->index)[k] == (entry_ptr) ) && \
+ ( (entry_ptr)->ht_prev != NULL ) ) || \
+ ( ( (entry_ptr)->ht_prev != NULL ) && \
+ ( (entry_ptr)->ht_prev->ht_next != (entry_ptr) ) ) || \
+ ( ( (entry_ptr)->ht_next != NULL ) && \
+ ( (entry_ptr)->ht_next->ht_prev != (entry_ptr) ) ) ) { \
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, \
+ "Post successful HT search SC failed") \
}
#define H5C2__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val) \
-if ( ( (cache_ptr) == NULL ) || \
- ( ((cache_ptr)->index)[k] != (entry_ptr) ) || \
- ( (entry_ptr)->ht_prev != NULL ) ) { \
- HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, \
- "Post HT shift to front SC failed") \
-}
-
-#define H5C2__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) \
if ( ( (cache_ptr) == NULL ) || \
- ( (cache_ptr)->index_len <= 0 ) || \
- ( (cache_ptr)->index_size <= 0 ) || \
- ( (new_size) <= 0 ) || \
- ( (old_size) > (cache_ptr)->index_size ) || \
- ( (new_size) <= 0 ) || \
- ( ( (cache_ptr)->index_len == 1 ) && \
- ( (cache_ptr)->index_size != (old_size) ) ) ) { \
- HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
- "Pre HT entry size change SC failed") \
+ ( ((cache_ptr)->index)[k] != (entry_ptr) ) || \
+ ( (entry_ptr)->ht_prev != NULL ) ) { \
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, \
+ "Post HT shift to front SC failed") \
}
-#define H5C2__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) \
+#define H5C2__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) \
if ( ( (cache_ptr) == NULL ) || \
( (cache_ptr)->index_len <= 0 ) || \
( (cache_ptr)->index_size <= 0 ) || \
- ( (new_size) > (cache_ptr)->index_size ) || \
+ ( (new_size) <= 0 ) || \
+ ( (old_size) > (cache_ptr)->index_size ) || \
+ ( (new_size) <= 0 ) || \
( ( (cache_ptr)->index_len == 1 ) && \
- ( (cache_ptr)->index_size != (new_size) ) ) ) { \
+ ( (cache_ptr)->index_size != (old_size) ) ) ) { \
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
- "Post HT entry size change SC failed") \
+ "Pre HT entry size change SC failed") \
+}
+
+#define H5C2__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) \
+if ( ( (cache_ptr) == NULL ) || \
+ ( (cache_ptr)->index_len <= 0 ) || \
+ ( (cache_ptr)->index_size <= 0 ) || \
+ ( (new_size) > (cache_ptr)->index_size ) || \
+ ( ( (cache_ptr)->index_len == 1 ) && \
+ ( (cache_ptr)->index_size != (new_size) ) ) ) { \
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "Post HT entry size change SC failed") \
}
#else /* H5C2_DO_SANITY_CHECKS */
@@ -2387,30 +2576,30 @@ if ( ( (cache_ptr) == NULL ) || \
#define H5C2__INSERT_IN_INDEX(cache_ptr, entry_ptr, fail_val) \
-{ \
- int k; \
+{ \
+ int k; \
H5C2__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
k = H5C2__HASH_FCN((entry_ptr)->addr); \
- if ( ((cache_ptr)->index)[k] == NULL ) \
- { \
- ((cache_ptr)->index)[k] = (entry_ptr); \
- } \
- else \
- { \
- (entry_ptr)->ht_next = ((cache_ptr)->index)[k]; \
- (entry_ptr)->ht_next->ht_prev = (entry_ptr); \
- ((cache_ptr)->index)[k] = (entry_ptr); \
- } \
- (cache_ptr)->index_len++; \
- (cache_ptr)->index_size += (entry_ptr)->size; \
+ if ( ((cache_ptr)->index)[k] == NULL ) \
+ { \
+ ((cache_ptr)->index)[k] = (entry_ptr); \
+ } \
+ else \
+ { \
+ (entry_ptr)->ht_next = ((cache_ptr)->index)[k]; \
+ (entry_ptr)->ht_next->ht_prev = (entry_ptr); \
+ ((cache_ptr)->index)[k] = (entry_ptr); \
+ } \
+ (cache_ptr)->index_len++; \
+ (cache_ptr)->index_size += (entry_ptr)->size; \
H5C2__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) \
}
-#define H5C2__DELETE_FROM_INDEX(cache_ptr, entry_ptr) \
+#define H5C2__DELETE_FROM_INDEX(cache_ptr, entry_ptr) \
{ \
int k; \
- H5C2__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr) \
- k = H5C2__HASH_FCN((entry_ptr)->addr); \
+ H5C2__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr) \
+ k = H5C2__HASH_FCN((entry_ptr)->addr); \
if ( (entry_ptr)->ht_next ) \
{ \
(entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
@@ -2427,79 +2616,79 @@ if ( ( (cache_ptr) == NULL ) || \
(entry_ptr)->ht_prev = NULL; \
(cache_ptr)->index_len--; \
(cache_ptr)->index_size -= (entry_ptr)->size; \
- H5C2__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) \
+ H5C2__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) \
}
-#define H5C2__SEARCH_INDEX(cache_ptr, Addr, entry_ptr, fail_val) \
-{ \
- int k; \
- int depth = 0; \
+#define H5C2__SEARCH_INDEX(cache_ptr, Addr, entry_ptr, fail_val) \
+{ \
+ int k; \
+ int depth = 0; \
H5C2__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val) \
k = H5C2__HASH_FCN(Addr); \
- entry_ptr = ((cache_ptr)->index)[k]; \
- while ( ( entry_ptr ) && ( H5F_addr_ne(Addr, (entry_ptr)->addr) ) ) \
- { \
- (entry_ptr) = (entry_ptr)->ht_next; \
- (depth)++; \
- } \
- if ( entry_ptr ) \
- { \
+ entry_ptr = ((cache_ptr)->index)[k]; \
+ while ( ( entry_ptr ) && ( H5F_addr_ne(Addr, (entry_ptr)->addr) ) ) \
+ { \
+ (entry_ptr) = (entry_ptr)->ht_next; \
+ (depth)++; \
+ } \
+ if ( entry_ptr ) \
+ { \
H5C2__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) \
- if ( entry_ptr != ((cache_ptr)->index)[k] ) \
- { \
- if ( (entry_ptr)->ht_next ) \
- { \
- (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
- } \
- HDassert( (entry_ptr)->ht_prev != NULL ); \
- (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
- ((cache_ptr)->index)[k]->ht_prev = (entry_ptr); \
- (entry_ptr)->ht_next = ((cache_ptr)->index)[k]; \
- (entry_ptr)->ht_prev = NULL; \
- ((cache_ptr)->index)[k] = (entry_ptr); \
+ if ( entry_ptr != ((cache_ptr)->index)[k] ) \
+ { \
+ if ( (entry_ptr)->ht_next ) \
+ { \
+ (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
+ } \
+ HDassert( (entry_ptr)->ht_prev != NULL ); \
+ (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
+ ((cache_ptr)->index)[k]->ht_prev = (entry_ptr); \
+ (entry_ptr)->ht_next = ((cache_ptr)->index)[k]; \
+ (entry_ptr)->ht_prev = NULL; \
+ ((cache_ptr)->index)[k] = (entry_ptr); \
H5C2__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val) \
- } \
- } \
+ } \
+ } \
H5C2__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, (entry_ptr != NULL), depth) \
}
#define H5C2__SEARCH_INDEX_NO_STATS(cache_ptr, Addr, entry_ptr, fail_val) \
-{ \
- int k; \
- int depth = 0; \
+{ \
+ int k; \
+ int depth = 0; \
H5C2__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val) \
k = H5C2__HASH_FCN(Addr); \
- entry_ptr = ((cache_ptr)->index)[k]; \
- while ( ( entry_ptr ) && ( H5F_addr_ne(Addr, (entry_ptr)->addr) ) ) \
- { \
- (entry_ptr) = (entry_ptr)->ht_next; \
- (depth)++; \
- } \
- if ( entry_ptr ) \
- { \
+ entry_ptr = ((cache_ptr)->index)[k]; \
+ while ( ( entry_ptr ) && ( H5F_addr_ne(Addr, (entry_ptr)->addr) ) ) \
+ { \
+ (entry_ptr) = (entry_ptr)->ht_next; \
+ (depth)++; \
+ } \
+ if ( entry_ptr ) \
+ { \
H5C2__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) \
- if ( entry_ptr != ((cache_ptr)->index)[k] ) \
- { \
- if ( (entry_ptr)->ht_next ) \
- { \
- (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
- } \
- HDassert( (entry_ptr)->ht_prev != NULL ); \
- (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
- ((cache_ptr)->index)[k]->ht_prev = (entry_ptr); \
- (entry_ptr)->ht_next = ((cache_ptr)->index)[k]; \
- (entry_ptr)->ht_prev = NULL; \
- ((cache_ptr)->index)[k] = (entry_ptr); \
+ if ( entry_ptr != ((cache_ptr)->index)[k] ) \
+ { \
+ if ( (entry_ptr)->ht_next ) \
+ { \
+ (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
+ } \
+ HDassert( (entry_ptr)->ht_prev != NULL ); \
+ (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
+ ((cache_ptr)->index)[k]->ht_prev = (entry_ptr); \
+ (entry_ptr)->ht_next = ((cache_ptr)->index)[k]; \
+ (entry_ptr)->ht_prev = NULL; \
+ ((cache_ptr)->index)[k] = (entry_ptr); \
H5C2__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val) \
- } \
- } \
+ } \
+ } \
}
#define H5C2__UPDATE_INDEX_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \
-{ \
+{ \
H5C2__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) \
- (cache_ptr)->index_size -= old_size; \
- (cache_ptr)->index_size += new_size; \
+ (cache_ptr)->index_size -= old_size; \
+ (cache_ptr)->index_size += new_size; \
H5C2__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) \
}
@@ -2553,12 +2742,12 @@ if ( ( (cache_ptr) == NULL ) || \
* JRM -- 8/25/06
* Added the H5C2_DO_SANITY_CHECKS version of the macro.
*
- * This version maintains the slist_len_increase and
+ * This version maintains the slist_len_increase and
* slist_size_increase fields that are used in sanity
* checks in the flush routines.
*
- * All this is needed as the fractal heap needs to be
- * able to dirty, resize and/or rename entries during the
+ * All this is needed as the fractal heap needs to be
+ * able to dirty, resize and/or rename entries during the
* flush.
*
*-------------------------------------------------------------------------
@@ -2566,10 +2755,10 @@ if ( ( (cache_ptr) == NULL ) || \
#if H5C2_DO_SANITY_CHECKS
-#define H5C2__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( (entry_ptr)->size > 0 ); \
HDassert( H5F_addr_defined((entry_ptr)->addr) ); \
@@ -2593,10 +2782,10 @@ if ( ( (cache_ptr) == NULL ) || \
#else /* H5C2_DO_SANITY_CHECKS */
-#define H5C2__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( (entry_ptr)->size > 0 ); \
HDassert( H5F_addr_defined((entry_ptr)->addr) ); \
@@ -2645,16 +2834,16 @@ if ( ( (cache_ptr) == NULL ) || \
* Switched over to using skip list routines.
*
* JRM -- 3/28/07
- * Updated sanity checks for the new is_read_only and
+ * Updated sanity checks for the new is_read_only and
* ro_ref_count fields in H5C2_cache_entry_t.
*
*-------------------------------------------------------------------------
*/
-#define H5C2__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr) \
+#define H5C2__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -2693,11 +2882,11 @@ if ( ( (cache_ptr) == NULL ) || \
* JRM -- 8/27/06
* Added the H5C2_DO_SANITY_CHECKS version of the macro.
*
- * This version maintains the slist_size_increase field
+ * This version maintains the slist_size_increase field
* that are used in sanity checks in the flush routines.
*
- * All this is needed as the fractal heap needs to be
- * able to dirty, resize and/or rename entries during the
+ * All this is needed as the fractal heap needs to be
+ * able to dirty, resize and/or rename entries during the
* flush.
*
*-------------------------------------------------------------------------
@@ -2706,46 +2895,46 @@ if ( ( (cache_ptr) == NULL ) || \
#if H5C2_DO_SANITY_CHECKS
#define H5C2__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \
-{ \
- HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
- HDassert( (old_size) > 0 ); \
- HDassert( (new_size) > 0 ); \
- HDassert( (old_size) <= (cache_ptr)->slist_size ); \
- HDassert( (cache_ptr)->slist_len > 0 ); \
- HDassert( ((cache_ptr)->slist_len > 1) || \
- ( (cache_ptr)->slist_size == (old_size) ) ); \
- \
- (cache_ptr)->slist_size -= (old_size); \
- (cache_ptr)->slist_size += (new_size); \
- \
- (cache_ptr)->slist_size_increase -= (int64_t)(old_size); \
- (cache_ptr)->slist_size_increase += (int64_t)(new_size); \
- \
- HDassert( (new_size) <= (cache_ptr)->slist_size ); \
- HDassert( ( (cache_ptr)->slist_len > 1 ) || \
- ( (cache_ptr)->slist_size == (new_size) ) ); \
+{ \
+ HDassert( (cache_ptr) ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (old_size) > 0 ); \
+ HDassert( (new_size) > 0 ); \
+ HDassert( (old_size) <= (cache_ptr)->slist_size ); \
+ HDassert( (cache_ptr)->slist_len > 0 ); \
+ HDassert( ((cache_ptr)->slist_len > 1) || \
+ ( (cache_ptr)->slist_size == (old_size) ) ); \
+ \
+ (cache_ptr)->slist_size -= (old_size); \
+ (cache_ptr)->slist_size += (new_size); \
+ \
+ (cache_ptr)->slist_size_increase -= (int64_t)(old_size); \
+ (cache_ptr)->slist_size_increase += (int64_t)(new_size); \
+ \
+ HDassert( (new_size) <= (cache_ptr)->slist_size ); \
+ HDassert( ( (cache_ptr)->slist_len > 1 ) || \
+ ( (cache_ptr)->slist_size == (new_size) ) ); \
} /* H5C2__REMOVE_ENTRY_FROM_SLIST */
#else /* H5C2_DO_SANITY_CHECKS */
#define H5C2__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \
-{ \
- HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
- HDassert( (old_size) > 0 ); \
- HDassert( (new_size) > 0 ); \
- HDassert( (old_size) <= (cache_ptr)->slist_size ); \
- HDassert( (cache_ptr)->slist_len > 0 ); \
- HDassert( ((cache_ptr)->slist_len > 1) || \
- ( (cache_ptr)->slist_size == (old_size) ) ); \
- \
- (cache_ptr)->slist_size -= (old_size); \
- (cache_ptr)->slist_size += (new_size); \
- \
- HDassert( (new_size) <= (cache_ptr)->slist_size ); \
- HDassert( ( (cache_ptr)->slist_len > 1 ) || \
- ( (cache_ptr)->slist_size == (new_size) ) ); \
+{ \
+ HDassert( (cache_ptr) ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (old_size) > 0 ); \
+ HDassert( (new_size) > 0 ); \
+ HDassert( (old_size) <= (cache_ptr)->slist_size ); \
+ HDassert( (cache_ptr)->slist_len > 0 ); \
+ HDassert( ((cache_ptr)->slist_len > 1) || \
+ ( (cache_ptr)->slist_size == (old_size) ) ); \
+ \
+ (cache_ptr)->slist_size -= (old_size); \
+ (cache_ptr)->slist_size += (new_size); \
+ \
+ HDassert( (new_size) <= (cache_ptr)->slist_size ); \
+ HDassert( ( (cache_ptr)->slist_len > 1 ) || \
+ ( (cache_ptr)->slist_size == (new_size) ) ); \
} /* H5C2__REMOVE_ENTRY_FROM_SLIST */
#endif /* H5C2_DO_SANITY_CHECKS */
@@ -2788,7 +2977,7 @@ if ( ( (cache_ptr) == NULL ) || \
* to do if called for such an entry.
*
* JRM -- 3/28/07
- * Added sanity checks using the new is_read_only and
+ * Added sanity checks using the new is_read_only and
* ro_ref_count fields of struct H5C2_cache_entry_t.
*
* JRM -- 3/29/08
@@ -2801,99 +2990,99 @@ if ( ( (cache_ptr) == NULL ) || \
#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
#define H5C2__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, fail_val) \
-{ \
- HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
- HDassert( (entry_ptr) ); \
- HDassert( !((entry_ptr)->is_protected) ); \
- HDassert( !((entry_ptr)->is_read_only) ); \
- HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
- HDassert( (entry_ptr)->size > 0 ); \
- HDassert( (entry_ptr)->last_trans == 0 ); \
- \
- if ( ! ((entry_ptr)->is_pinned) ) { \
- \
- /* modified LRU specific code */ \
- \
- /* remove the entry from the LRU list, and re-insert it at the head.\
- */ \
- \
+{ \
+ HDassert( (cache_ptr) ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (entry_ptr) ); \
+ HDassert( !((entry_ptr)->is_protected) ); \
+ HDassert( !((entry_ptr)->is_read_only) ); \
+ HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
+ HDassert( (entry_ptr)->size > 0 ); \
+ HDassert( (entry_ptr)->last_trans == 0 ); \
+ \
+ if ( ! ((entry_ptr)->is_pinned) ) { \
+ \
+ /* modified LRU specific code */ \
+ \
+ /* remove the entry from the LRU list, and re-insert it at the head. \
+ */ \
+ \
H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
- (cache_ptr)->LRU_tail_ptr, \
- (cache_ptr)->LRU_list_len, \
- (cache_ptr)->LRU_list_size, (fail_val)) \
- \
+ (cache_ptr)->LRU_tail_ptr, \
+ (cache_ptr)->LRU_list_len, \
+ (cache_ptr)->LRU_list_size, (fail_val)) \
+ \
H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
- (cache_ptr)->LRU_tail_ptr, \
- (cache_ptr)->LRU_list_len, \
- (cache_ptr)->LRU_list_size, (fail_val)) \
- \
- /* Use the dirty flag to infer whether the entry is on the clean or \
- * dirty LRU list, and remove it. Then insert it at the head of \
- * the same LRU list. \
- * \
- * At least initially, all entries should be clean. That may \
- * change, so we may as well deal with both cases now. \
- */ \
- \
- if ( (entry_ptr)->is_dirty ) { \
+ (cache_ptr)->LRU_tail_ptr, \
+ (cache_ptr)->LRU_list_len, \
+ (cache_ptr)->LRU_list_size, (fail_val)) \
+ \
+ /* Use the dirty flag to infer whether the entry is on the clean or \
+ * dirty LRU list, and remove it. Then insert it at the head of \
+ * the same LRU list. \
+ * \
+ * At least initially, all entries should be clean. That may \
+ * change, so we may as well deal with both cases now. \
+ */ \
+ \
+ if ( (entry_ptr)->is_dirty ) { \
H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
- (cache_ptr)->dLRU_tail_ptr, \
- (cache_ptr)->dLRU_list_len, \
- (cache_ptr)->dLRU_list_size, (fail_val)) \
- \
+ (cache_ptr)->dLRU_tail_ptr, \
+ (cache_ptr)->dLRU_list_len, \
+ (cache_ptr)->dLRU_list_size, (fail_val)) \
+ \
H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
- (cache_ptr)->dLRU_tail_ptr, \
- (cache_ptr)->dLRU_list_len, \
- (cache_ptr)->dLRU_list_size, (fail_val)) \
- } else { \
+ (cache_ptr)->dLRU_tail_ptr, \
+ (cache_ptr)->dLRU_list_len, \
+ (cache_ptr)->dLRU_list_size, (fail_val)) \
+ } else { \
H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
- (cache_ptr)->cLRU_tail_ptr, \
- (cache_ptr)->cLRU_list_len, \
- (cache_ptr)->cLRU_list_size, (fail_val)) \
- \
+ (cache_ptr)->cLRU_tail_ptr, \
+ (cache_ptr)->cLRU_list_len, \
+ (cache_ptr)->cLRU_list_size, (fail_val)) \
+ \
H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
- (cache_ptr)->cLRU_tail_ptr, \
- (cache_ptr)->cLRU_list_len, \
- (cache_ptr)->cLRU_list_size, (fail_val)) \
- } \
- \
- /* End modified LRU specific code. */ \
- } \
+ (cache_ptr)->cLRU_tail_ptr, \
+ (cache_ptr)->cLRU_list_len, \
+ (cache_ptr)->cLRU_list_size, (fail_val)) \
+ } \
+ \
+ /* End modified LRU specific code. */ \
+ } \
} /* H5C2__FAKE_RP_FOR_MOST_RECENT_ACCESS */
#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
#define H5C2__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, fail_val) \
-{ \
- HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
- HDassert( (entry_ptr) ); \
- HDassert( !((entry_ptr)->is_protected) ); \
- HDassert( !((entry_ptr)->is_read_only) ); \
- HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
- HDassert( (entry_ptr)->size > 0 ); \
- HDassert( (entry_ptr)->last_trans == 0 ); \
- \
- if ( ! ((entry_ptr)->is_pinned) ) { \
- \
- /* modified LRU specific code */ \
- \
- /* remove the entry from the LRU list, and re-insert it at the head \
- */ \
- \
+{ \
+ HDassert( (cache_ptr) ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (entry_ptr) ); \
+ HDassert( !((entry_ptr)->is_protected) ); \
+ HDassert( !((entry_ptr)->is_read_only) ); \
+ HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
+ HDassert( (entry_ptr)->size > 0 ); \
+ HDassert( (entry_ptr)->last_trans == 0 ); \
+ \
+ if ( ! ((entry_ptr)->is_pinned) ) { \
+ \
+ /* modified LRU specific code */ \
+ \
+ /* remove the entry from the LRU list, and re-insert it at the head \
+ */ \
+ \
H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
- (cache_ptr)->LRU_tail_ptr, \
- (cache_ptr)->LRU_list_len, \
- (cache_ptr)->LRU_list_size, (fail_val)) \
- \
+ (cache_ptr)->LRU_tail_ptr, \
+ (cache_ptr)->LRU_list_len, \
+ (cache_ptr)->LRU_list_size, (fail_val)) \
+ \
H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
- (cache_ptr)->LRU_tail_ptr, \
- (cache_ptr)->LRU_list_len, \
- (cache_ptr)->LRU_list_size, (fail_val)) \
- \
- /* End modified LRU specific code. */ \
- } \
+ (cache_ptr)->LRU_tail_ptr, \
+ (cache_ptr)->LRU_list_len, \
+ (cache_ptr)->LRU_list_size, (fail_val)) \
+ \
+ /* End modified LRU specific code. */ \
+ } \
} /* H5C2__FAKE_RP_FOR_MOST_RECENT_ACCESS */
#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
@@ -2936,7 +3125,7 @@ if ( ( (cache_ptr) == NULL ) || \
* be called on a pinned entry. Added assert to verify this.
*
* JRM -- 3/28/07
- * Added sanity checks for the new is_read_only and
+ * Added sanity checks for the new is_read_only and
* ro_ref_count fields of struct H5C2_cache_entry_t.
*
* JRM -- 3/29/08
@@ -2948,10 +3137,10 @@ if ( ( (cache_ptr) == NULL ) || \
#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-#define H5C2__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -2964,7 +3153,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* remove the entry from the LRU list. */ \
\
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, (cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
\
@@ -2976,12 +3165,12 @@ if ( ( (cache_ptr) == NULL ) || \
\
if ( (entry_ptr)->is_dirty ) { \
\
- H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
+ H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
(cache_ptr)->dLRU_tail_ptr, \
(cache_ptr)->dLRU_list_len, \
(cache_ptr)->dLRU_list_size, (fail_val)) \
} else { \
- H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
+ H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
(cache_ptr)->cLRU_tail_ptr, \
(cache_ptr)->cLRU_list_len, \
(cache_ptr)->cLRU_list_size, (fail_val)) \
@@ -2991,10 +3180,10 @@ if ( ( (cache_ptr) == NULL ) || \
#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-#define H5C2__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -3007,7 +3196,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* remove the entry from the LRU list. */ \
\
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, (cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
\
@@ -3067,10 +3256,10 @@ if ( ( (cache_ptr) == NULL ) || \
#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-#define H5C2__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -3086,12 +3275,12 @@ if ( ( (cache_ptr) == NULL ) || \
* head. \
*/ \
\
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -3108,18 +3297,18 @@ if ( ( (cache_ptr) == NULL ) || \
*/ \
\
if ( (entry_ptr)->is_dirty ) { \
- H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
+ H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
(cache_ptr)->dLRU_tail_ptr, \
(cache_ptr)->dLRU_list_len, \
(cache_ptr)->dLRU_list_size, (fail_val)) \
} else { \
- H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
+ H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
(cache_ptr)->cLRU_tail_ptr, \
(cache_ptr)->cLRU_list_len, \
(cache_ptr)->cLRU_list_size, (fail_val)) \
} \
\
- H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
+ H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
(cache_ptr)->cLRU_tail_ptr, \
(cache_ptr)->cLRU_list_len, \
(cache_ptr)->cLRU_list_size, (fail_val)) \
@@ -3130,10 +3319,10 @@ if ( ( (cache_ptr) == NULL ) || \
#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-#define H5C2__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -3149,12 +3338,12 @@ if ( ( (cache_ptr) == NULL ) || \
* head. \
*/ \
\
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -3203,7 +3392,7 @@ if ( ( (cache_ptr) == NULL ) || \
* Inserted an assert to verify this.
*
* JRM - 8/9/06
- * Not any more. We must now allow insertion of pinned
+ * Not any more. We must now allow insertion of pinned
* entries. Updated macro to support this.
*
* JRM - 3/28/07
@@ -3211,13 +3400,13 @@ if ( ( (cache_ptr) == NULL ) || \
* ro_ref_count fields of struct H5C2_cache_entry_t.
*
* JRM - 3/29/30
- * Added sanity check that verifies that the last_trans field
- * of the entry matches the trans_num field of the cache.
- * Note that when journaling is disabled, both of these
- * fields should contain zero. Also verify that either
+ * Added sanity check that verifies that the last_trans field
+ * of the entry matches the trans_num field of the cache.
+ * Note that when journaling is disabled, both of these
+ * fields should contain zero. Also verify that either
* journaling is disabled or a transaction is in progress.
*
- * Added code to put the entry in the journal write in
+ * Added code to put the entry in the journal write in
* progress list if entries last_trans field is non-
* zero and the entry is not pinned.
*
@@ -3226,10 +3415,10 @@ if ( ( (cache_ptr) == NULL ) || \
#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-#define H5C2__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -3241,7 +3430,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
if ( (entry_ptr)->is_pinned ) { \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
(cache_ptr)->pel_tail_ptr, \
(cache_ptr)->pel_len, \
(cache_ptr)->pel_size, (fail_val)) \
@@ -3250,7 +3439,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (cache_ptr)->trans_in_progress ); \
- H5C2__DLL_PREPEND((entry_ptr), \
+ H5C2__DLL_PREPEND((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -3262,7 +3451,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* insert the entry at the head of the LRU list. */ \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -3272,12 +3461,12 @@ if ( ( (cache_ptr) == NULL ) || \
*/ \
\
if ( entry_ptr->is_dirty ) { \
- H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
+ H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
(cache_ptr)->dLRU_tail_ptr, \
(cache_ptr)->dLRU_list_len, \
(cache_ptr)->dLRU_list_size, (fail_val)) \
} else { \
- H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
+ H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
(cache_ptr)->cLRU_tail_ptr, \
(cache_ptr)->cLRU_list_len, \
(cache_ptr)->cLRU_list_size, (fail_val)) \
@@ -3289,10 +3478,10 @@ if ( ( (cache_ptr) == NULL ) || \
#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-#define H5C2__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -3304,7 +3493,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
if ( (entry_ptr)->is_pinned ) { \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
(cache_ptr)->pel_tail_ptr, \
(cache_ptr)->pel_len, \
(cache_ptr)->pel_size, (fail_val)) \
@@ -3313,7 +3502,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (cache_ptr)->trans_in_progress ); \
- H5C2__DLL_PREPEND((entry_ptr), \
+ H5C2__DLL_PREPEND((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -3325,7 +3514,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* insert the entry at the head of the LRU list. */ \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -3341,13 +3530,13 @@ if ( ( (cache_ptr) == NULL ) || \
*
* Macro: H5C2__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE
*
- * Purpose: Update the replacement policy data structures for the
- * completion of the last pending journal write for the
+ * Purpose: Update the replacement policy data structures for the
+ * completion of the last pending journal write for the
* specified un-pinned and un-protected cache entry.
*
* If an entry with a pending journal write is not protected
- * and is not pinned, it must be on the journal write in
- * progress list. Unlink it from that list, and add it to
+ * and is not pinned, it must be on the journal write in
+ * progress list. Unlink it from that list, and add it to
* the data structures used by the current replacement policy.
*
* At present, we only support the modified LRU policy, so
@@ -3371,11 +3560,11 @@ if ( ( (cache_ptr) == NULL ) || \
#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-#define H5C2__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE(cache_ptr, entry_ptr, \
+#define H5C2__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE(cache_ptr, entry_ptr, \
fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
@@ -3386,7 +3575,7 @@ if ( ( (cache_ptr) == NULL ) || \
HDassert( (entry_ptr)->is_dirty ); \
HDassert( (entry_ptr)->last_trans == 0 ); \
\
- H5C2__DLL_REMOVE((entry_ptr), \
+ H5C2__DLL_REMOVE((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -3397,7 +3586,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* insert the entry at the head of the LRU list. */ \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -3407,12 +3596,12 @@ if ( ( (cache_ptr) == NULL ) || \
*/ \
\
if ( entry_ptr->is_dirty ) { \
- H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
+ H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
(cache_ptr)->dLRU_tail_ptr, \
(cache_ptr)->dLRU_list_len, \
(cache_ptr)->dLRU_list_size, (fail_val)) \
} else { \
- H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
+ H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
(cache_ptr)->cLRU_tail_ptr, \
(cache_ptr)->cLRU_list_len, \
(cache_ptr)->cLRU_list_size, (fail_val)) \
@@ -3424,11 +3613,11 @@ if ( ( (cache_ptr) == NULL ) || \
#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-#define H5C2__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE(cache_ptr, entry_ptr, \
+#define H5C2__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE(cache_ptr, entry_ptr, \
fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
@@ -3439,7 +3628,7 @@ if ( ( (cache_ptr) == NULL ) || \
HDassert( (entry_ptr)->is_dirty ); \
HDassert( (entry_ptr)->last_trans == 0 ); \
\
- H5C2__DLL_REMOVE((entry_ptr), \
+ H5C2__DLL_REMOVE((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -3450,7 +3639,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* insert the entry at the head of the LRU list. */ \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -3470,8 +3659,8 @@ if ( ( (cache_ptr) == NULL ) || \
* load from disk of the specified cache entry.
*
* Note that we update the replacement policy for load only
- * as a convenience -- the newly loaded entry will be
- * protected immediately. If this starts to eat up a
+ * as a convenience -- the newly loaded entry will be
+ * protected immediately. If this starts to eat up a
* significant number of cycles, we will have to re-work
* the code to avoid this step.
*
@@ -3497,10 +3686,10 @@ if ( ( (cache_ptr) == NULL ) || \
#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-#define H5C2__UPDATE_RP_FOR_LOAD(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_LOAD(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_pinned) ); \
@@ -3513,7 +3702,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* insert the entry at the head of the LRU list. */ \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -3523,12 +3712,12 @@ if ( ( (cache_ptr) == NULL ) || \
*/ \
\
if ( entry_ptr->is_dirty ) { \
- H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
+ H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
(cache_ptr)->dLRU_tail_ptr, \
(cache_ptr)->dLRU_list_len, \
(cache_ptr)->dLRU_list_size, (fail_val)) \
} else { \
- H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
+ H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
(cache_ptr)->cLRU_tail_ptr, \
(cache_ptr)->cLRU_list_len, \
(cache_ptr)->cLRU_list_size, (fail_val)) \
@@ -3539,10 +3728,10 @@ if ( ( (cache_ptr) == NULL ) || \
#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-#define H5C2__UPDATE_RP_FOR_LOAD(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_LOAD(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_pinned) ); \
@@ -3555,7 +3744,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* insert the entry at the head of the LRU list. */ \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -3608,7 +3797,7 @@ if ( ( (cache_ptr) == NULL ) || \
* maintained by the replacement policy.
*
* JRM - 3/28/07
- * Added sanity checks based on the new is_read_only and
+ * Added sanity checks based on the new is_read_only and
* ro_ref_count fields of struct H5C2_cache_entry_t.
*
* JRM - 3/29/08
@@ -3620,10 +3809,10 @@ if ( ( (cache_ptr) == NULL ) || \
#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-#define H5C2__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -3632,7 +3821,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
if ( (entry_ptr)->is_pinned ) { \
\
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
(cache_ptr)->pel_tail_ptr, \
(cache_ptr)->pel_len, \
(cache_ptr)->pel_size, (fail_val)) \
@@ -3641,7 +3830,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (entry_ptr)->is_dirty ); \
- H5C2__DLL_REMOVE((entry_ptr), \
+ H5C2__DLL_REMOVE((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -3654,7 +3843,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* remove the entry from the LRU list. */ \
\
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -3665,14 +3854,14 @@ if ( ( (cache_ptr) == NULL ) || \
\
if ( (entry_ptr)->is_dirty ) { \
\
- H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
+ H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
(cache_ptr)->dLRU_tail_ptr, \
(cache_ptr)->dLRU_list_len, \
(cache_ptr)->dLRU_list_size, (fail_val)) \
\
} else { \
\
- H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
+ H5C2__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
(cache_ptr)->cLRU_tail_ptr, \
(cache_ptr)->cLRU_list_len, \
(cache_ptr)->cLRU_list_size, (fail_val)) \
@@ -3685,7 +3874,7 @@ if ( ( (cache_ptr) == NULL ) || \
* pinned, now add the entry to the protected list. \
*/ \
\
- H5C2__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr, \
+ H5C2__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr, \
(cache_ptr)->pl_tail_ptr, \
(cache_ptr)->pl_len, \
(cache_ptr)->pl_size, (fail_val)) \
@@ -3693,10 +3882,10 @@ if ( ( (cache_ptr) == NULL ) || \
#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-#define H5C2__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -3705,7 +3894,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
if ( (entry_ptr)->is_pinned ) { \
\
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
(cache_ptr)->pel_tail_ptr, \
(cache_ptr)->pel_len, \
(cache_ptr)->pel_size, (fail_val)) \
@@ -3714,7 +3903,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (entry_ptr)->is_dirty ); \
- H5C2__DLL_REMOVE((entry_ptr), \
+ H5C2__DLL_REMOVE((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -3727,7 +3916,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* remove the entry from the LRU list. */ \
\
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -3739,10 +3928,10 @@ if ( ( (cache_ptr) == NULL ) || \
* pinned, now add the entry to the protected list. \
*/ \
\
- H5C2__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr, \
- (cache_ptr)->pl_tail_ptr, \
- (cache_ptr)->pl_len, \
- (cache_ptr)->pl_size, (fail_val)) \
+ H5C2__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr, \
+ (cache_ptr)->pl_tail_ptr, \
+ (cache_ptr)->pl_len, \
+ (cache_ptr)->pl_size, (fail_val)) \
} /* H5C2__UPDATE_RP_FOR_PROTECT */
#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
@@ -3798,25 +3987,25 @@ if ( ( (cache_ptr) == NULL ) || \
* nothing to be done.
*
* JRM - 3/28/07
- * Added sanity checks using the new is_read_only and
+ * Added sanity checks using the new is_read_only and
* ro_ref_count fields of struct H5C2_cache_entry_t.
*
* JRM - 3/29/08
* Reworked macro to handle the case in which the renamed
* entry has a journal write pending -- this required the
- * addition of the had_jwip parameter. Also added some
- * related sanity checks.
+ * addition of the had_jwip parameter. Also added some
+ * related sanity checks.
*
*-------------------------------------------------------------------------
*/
#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-#define H5C2__UPDATE_RP_FOR_RENAME(cache_ptr, entry_ptr, was_dirty, \
+#define H5C2__UPDATE_RP_FOR_RENAME(cache_ptr, entry_ptr, was_dirty, \
had_jwip, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -3837,7 +4026,7 @@ if ( ( (cache_ptr) == NULL ) || \
HDassert( (entry_ptr)->last_trans != 0 ); \
HDassert( was_dirty ); \
HDassert( (entry_ptr)->is_dirty ); \
- H5C2__DLL_REMOVE((entry_ptr), \
+ H5C2__DLL_REMOVE((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -3850,7 +4039,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* remove the entry from the LRU list */ \
\
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -3860,7 +4049,7 @@ if ( ( (cache_ptr) == NULL ) || \
*/ \
if ( was_dirty ) { \
\
- H5C2__AUX_DLL_REMOVE((entry_ptr), \
+ H5C2__AUX_DLL_REMOVE((entry_ptr), \
(cache_ptr)->dLRU_head_ptr, \
(cache_ptr)->dLRU_tail_ptr, \
(cache_ptr)->dLRU_list_len, \
@@ -3869,7 +4058,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
} else { \
\
- H5C2__AUX_DLL_REMOVE((entry_ptr), \
+ H5C2__AUX_DLL_REMOVE((entry_ptr), \
(cache_ptr)->cLRU_head_ptr, \
(cache_ptr)->cLRU_tail_ptr, \
(cache_ptr)->cLRU_list_len, \
@@ -3886,7 +4075,7 @@ if ( ( (cache_ptr) == NULL ) || \
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (cache_ptr)->trans_in_progress ); \
HDassert( (entry_ptr)->is_dirty ); \
- H5C2__DLL_PREPEND((entry_ptr), \
+ H5C2__DLL_PREPEND((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -3896,7 +4085,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* begin modified LRU specific code */ \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -3907,7 +4096,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
if ( (entry_ptr)->is_dirty ) { \
\
- H5C2__AUX_DLL_PREPEND((entry_ptr), \
+ H5C2__AUX_DLL_PREPEND((entry_ptr), \
(cache_ptr)->dLRU_head_ptr, \
(cache_ptr)->dLRU_tail_ptr, \
(cache_ptr)->dLRU_list_len, \
@@ -3916,7 +4105,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
} else { \
\
- H5C2__AUX_DLL_PREPEND((entry_ptr), \
+ H5C2__AUX_DLL_PREPEND((entry_ptr), \
(cache_ptr)->cLRU_head_ptr, \
(cache_ptr)->cLRU_tail_ptr, \
(cache_ptr)->cLRU_list_len, \
@@ -3931,11 +4120,11 @@ if ( ( (cache_ptr) == NULL ) || \
#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-#define H5C2__UPDATE_RP_FOR_RENAME(cache_ptr, entry_ptr, was_dirty, \
+#define H5C2__UPDATE_RP_FOR_RENAME(cache_ptr, entry_ptr, was_dirty, \
had_jwip, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -3956,7 +4145,7 @@ if ( ( (cache_ptr) == NULL ) || \
HDassert( (entry_ptr)->last_trans != 0 ); \
HDassert( was_dirty ); \
HDassert( (entry_ptr)->is_dirty ); \
- H5C2__DLL_REMOVE((entry_ptr), \
+ H5C2__DLL_REMOVE((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -3969,7 +4158,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* remove the entry from the LRU list */ \
\
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -3984,7 +4173,7 @@ if ( ( (cache_ptr) == NULL ) || \
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (cache_ptr)->trans_in_progress ); \
HDassert( (entry_ptr)->is_dirty ); \
- H5C2__DLL_PREPEND((entry_ptr), \
+ H5C2__DLL_PREPEND((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -3994,7 +4183,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* begin modified LRU specific code */ \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -4017,7 +4206,7 @@ if ( ( (cache_ptr) == NULL ) || \
* To do this, determine if the entry is pinned. If it is,
* update the size of the pinned entry list.
*
- * If it isn't pinned, the entry must handled by the
+ * If it isn't pinned, the entry must handled by the
* replacement policy. Update the appropriate replacement
* policy data structures.
*
@@ -4033,13 +4222,13 @@ if ( ( (cache_ptr) == NULL ) || \
* Modifications:
*
* JRM -- 3/28/07
- * Added sanity checks based on the new is_read_only and
+ * Added sanity checks based on the new is_read_only and
* ro_ref_count fields of struct H5C2_cache_entry_t.
*
* JRM -- 3/29/08
* Added code to deal with the journal write in progress
* list -- in essence, after checking to see if the entry is
- * pinned, check to see if it is on the jwip list. If it
+ * pinned, check to see if it is on the jwip list. If it
* is, update the size of that list. If not, proceed as
* before.
*
@@ -4048,10 +4237,10 @@ if ( ( (cache_ptr) == NULL ) || \
#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-#define H5C2__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) \
+#define H5C2__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -4061,7 +4250,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
if ( (entry_ptr)->is_pinned ) { \
\
- H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len, \
+ H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len, \
(cache_ptr)->pel_size, \
(entry_ptr)->size, \
(new_size)); \
@@ -4070,7 +4259,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (entry_ptr)->is_dirty ); \
- H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->jwipl_len, \
+ H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->jwipl_len, \
(cache_ptr)->jwipl_size, \
(entry_ptr)->size, \
(new_size)); \
@@ -4081,7 +4270,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* Update the size of the LRU list */ \
\
- H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len, \
+ H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, \
(entry_ptr)->size, \
(new_size)); \
@@ -4093,14 +4282,14 @@ if ( ( (cache_ptr) == NULL ) || \
\
if ( (entry_ptr)->is_dirty ) { \
\
- H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->dLRU_list_len, \
+ H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->dLRU_list_len, \
(cache_ptr)->dLRU_list_size, \
(entry_ptr)->size, \
(new_size)); \
\
} else { \
\
- H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->cLRU_list_len, \
+ H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->cLRU_list_len, \
(cache_ptr)->cLRU_list_size, \
(entry_ptr)->size, \
(new_size)); \
@@ -4113,10 +4302,10 @@ if ( ( (cache_ptr) == NULL ) || \
#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-#define H5C2__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) \
+#define H5C2__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -4126,7 +4315,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
if ( (entry_ptr)->is_pinned ) { \
\
- H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len, \
+ H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len, \
(cache_ptr)->pel_size, \
(entry_ptr)->size, \
(new_size)); \
@@ -4135,7 +4324,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (entry_ptr)->is_dirty ); \
- H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->jwipl_len, \
+ H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->jwipl_len, \
(cache_ptr)->jwipl_size, \
(entry_ptr)->size, \
(new_size)); \
@@ -4146,7 +4335,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* Update the size of the LRU list */ \
\
- H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len, \
+ H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, \
(entry_ptr)->size, \
(new_size)); \
@@ -4182,11 +4371,11 @@ if ( ( (cache_ptr) == NULL ) || \
* Modifications:
*
* JRM -- 3/28/07
- * Added sanity checks based on the new is_read_only and
+ * Added sanity checks based on the new is_read_only and
* ro_ref_count fields of struct H5C2_cache_entry_t.
*
* JRM -- 3/30/08
- * Added code to place the newly unpinned entry on the
+ * Added code to place the newly unpinned entry on the
* journal write pending list if appropriate.
*
*-------------------------------------------------------------------------
@@ -4194,10 +4383,10 @@ if ( ( (cache_ptr) == NULL ) || \
#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-#define H5C2__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -4208,7 +4397,7 @@ if ( ( (cache_ptr) == NULL ) || \
/* Regardless of the replacement policy, remove the entry from the \
* pinned entry list. \
*/ \
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
(cache_ptr)->pel_tail_ptr, (cache_ptr)->pel_len, \
(cache_ptr)->pel_size, (fail_val)) \
\
@@ -4217,7 +4406,7 @@ if ( ( (cache_ptr) == NULL ) || \
/* put the entry in the jwip list */ \
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (entry_ptr)->is_dirty ); \
- H5C2__DLL_PREPEND((entry_ptr), \
+ H5C2__DLL_PREPEND((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -4229,7 +4418,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* insert the entry at the head of the LRU list. */ \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -4240,7 +4429,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
if ( (entry_ptr)->is_dirty ) { \
\
- H5C2__AUX_DLL_PREPEND((entry_ptr), \
+ H5C2__AUX_DLL_PREPEND((entry_ptr), \
(cache_ptr)->dLRU_head_ptr, \
(cache_ptr)->dLRU_tail_ptr, \
(cache_ptr)->dLRU_list_len, \
@@ -4249,7 +4438,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
} else { \
\
- H5C2__AUX_DLL_PREPEND((entry_ptr), \
+ H5C2__AUX_DLL_PREPEND((entry_ptr), \
(cache_ptr)->cLRU_head_ptr, \
(cache_ptr)->cLRU_tail_ptr, \
(cache_ptr)->cLRU_list_len, \
@@ -4264,10 +4453,10 @@ if ( ( (cache_ptr) == NULL ) || \
#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-#define H5C2__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( !((entry_ptr)->is_protected) ); \
HDassert( !((entry_ptr)->is_read_only) ); \
@@ -4278,7 +4467,7 @@ if ( ( (cache_ptr) == NULL ) || \
/* Regardless of the replacement policy, remove the entry from the \
* pinned entry list. \
*/ \
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
(cache_ptr)->pel_tail_ptr, (cache_ptr)->pel_len, \
(cache_ptr)->pel_size, (fail_val)) \
\
@@ -4287,7 +4476,7 @@ if ( ( (cache_ptr) == NULL ) || \
/* put the entry in the jwip list */ \
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (entry_ptr)->is_dirty ); \
- H5C2__DLL_PREPEND((entry_ptr), \
+ H5C2__DLL_PREPEND((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -4299,7 +4488,7 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* insert the entry at the head of the LRU list. */ \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
(cache_ptr)->LRU_tail_ptr, \
(cache_ptr)->LRU_list_len, \
(cache_ptr)->LRU_list_size, (fail_val)) \
@@ -4354,7 +4543,7 @@ if ( ( (cache_ptr) == NULL ) || \
* maintained by the replacement policy.
*
* JRM - 3/30/08
- * Modified macro to put un-pinned entries with pending
+ * Modified macro to put un-pinned entries with pending
* journal writes on the journal write in progress list.
*
*-------------------------------------------------------------------------
@@ -4362,10 +4551,10 @@ if ( ( (cache_ptr) == NULL ) || \
#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-#define H5C2__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( (entry_ptr)->is_protected); \
HDassert( (entry_ptr)->size > 0 ); \
@@ -4373,23 +4562,23 @@ if ( ( (cache_ptr) == NULL ) || \
/* Regardless of the replacement policy, remove the entry from the \
* protected list. \
*/ \
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr, \
(cache_ptr)->pl_tail_ptr, (cache_ptr)->pl_len, \
(cache_ptr)->pl_size, (fail_val)) \
\
if ( (entry_ptr)->is_pinned ) { \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
- (cache_ptr)->pel_tail_ptr, \
- (cache_ptr)->pel_len, \
- (cache_ptr)->pel_size, (fail_val)) \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
+ (cache_ptr)->pel_tail_ptr, \
+ (cache_ptr)->pel_len, \
+ (cache_ptr)->pel_size, (fail_val)) \
\
} else if ( (entry_ptr)->last_trans != 0 ) { \
\
/* put the entry in the jwip list */ \
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (entry_ptr)->is_dirty ); \
- H5C2__DLL_PREPEND((entry_ptr), \
+ H5C2__DLL_PREPEND((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -4401,10 +4590,10 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* insert the entry at the head of the LRU list. */ \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
- (cache_ptr)->LRU_tail_ptr, \
- (cache_ptr)->LRU_list_len, \
- (cache_ptr)->LRU_list_size, (fail_val)) \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ (cache_ptr)->LRU_tail_ptr, \
+ (cache_ptr)->LRU_list_len, \
+ (cache_ptr)->LRU_list_size, (fail_val)) \
\
/* Similarly, insert the entry at the head of either the clean or \
* dirty LRU list as appropriate. \
@@ -4412,17 +4601,17 @@ if ( ( (cache_ptr) == NULL ) || \
\
if ( (entry_ptr)->is_dirty ) { \
\
- H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
- (cache_ptr)->dLRU_tail_ptr, \
- (cache_ptr)->dLRU_list_len, \
- (cache_ptr)->dLRU_list_size, (fail_val)) \
+ H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
+ (cache_ptr)->dLRU_tail_ptr, \
+ (cache_ptr)->dLRU_list_len, \
+ (cache_ptr)->dLRU_list_size, (fail_val)) \
\
} else { \
\
- H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
- (cache_ptr)->cLRU_tail_ptr, \
- (cache_ptr)->cLRU_list_len, \
- (cache_ptr)->cLRU_list_size, (fail_val)) \
+ H5C2__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
+ (cache_ptr)->cLRU_tail_ptr, \
+ (cache_ptr)->cLRU_list_len, \
+ (cache_ptr)->cLRU_list_size, (fail_val)) \
} \
\
/* End modified LRU specific code. */ \
@@ -4432,10 +4621,10 @@ if ( ( (cache_ptr) == NULL ) || \
#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-#define H5C2__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val) \
+#define H5C2__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val) \
{ \
HDassert( (cache_ptr) ); \
- HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
+ HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \
HDassert( (entry_ptr) ); \
HDassert( (entry_ptr)->is_protected); \
HDassert( (entry_ptr)->size > 0 ); \
@@ -4443,13 +4632,13 @@ if ( ( (cache_ptr) == NULL ) || \
/* Regardless of the replacement policy, remove the entry from the \
* protected list. \
*/ \
- H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr, \
+ H5C2__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr, \
(cache_ptr)->pl_tail_ptr, (cache_ptr)->pl_len, \
(cache_ptr)->pl_size, (fail_val)) \
\
if ( (entry_ptr)->is_pinned ) { \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
(cache_ptr)->pel_tail_ptr, \
(cache_ptr)->pel_len, \
(cache_ptr)->pel_size, (fail_val)) \
@@ -4459,7 +4648,7 @@ if ( ( (cache_ptr) == NULL ) || \
/* put the entry in the jwip list */ \
HDassert( (cache_ptr)->mdj_enabled ); \
HDassert( (entry_ptr)->is_dirty ); \
- H5C2__DLL_PREPEND((entry_ptr), \
+ H5C2__DLL_PREPEND((entry_ptr), \
((cache_ptr)->jwipl_head_ptr), \
((cache_ptr)->jwipl_tail_ptr), \
((cache_ptr)->jwipl_len), \
@@ -4471,10 +4660,10 @@ if ( ( (cache_ptr) == NULL ) || \
\
/* insert the entry at the head of the LRU list. */ \
\
- H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
- (cache_ptr)->LRU_tail_ptr, \
- (cache_ptr)->LRU_list_len, \
- (cache_ptr)->LRU_list_size, (fail_val)) \
+ H5C2__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
+ (cache_ptr)->LRU_tail_ptr, \
+ (cache_ptr)->LRU_list_len, \
+ (cache_ptr)->LRU_list_size, (fail_val)) \
\
/* End modified LRU specific code. */ \
} \
@@ -4538,7 +4727,7 @@ if ( cache_ptr->mdj_enabled ) \
* Purpose: Check to see if journaling is enabled.
*
* If it is, see if the target entry is in the transaction
- * list. If it is, remove it from the list, and set its
+ * list. If it is, remove it from the list, and set its
* last_trans field to zero.
*
* Return: N/A
@@ -4621,9 +4810,9 @@ if ( cache_ptr->mdj_enabled ) \
*
* Macro: H5C2__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE
*
- * Purpose: Update the transaction list for a change in the size of
+ * Purpose: Update the transaction list for a change in the size of
* one of its constituents. Note that it is the callers
- * responsibility to verify that the entry is in the
+ * responsibility to verify that the entry is in the
* transaction list if it should be.
*
* Return: N/A
@@ -4647,5 +4836,84 @@ if ( ( (cache_ptr)->mdj_enabled ) && \
(old_size), (new_size)); \
} /* H5C2__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE() */
-#endif /* _H5C2pkg_H */
+/*-------------------------------------------------------------------------
+ *
+ * Macro: H5C2__JBRB__UPDATE_STATS_FOR* macros
+ *
+ * Purpose: This set of macros exists to update the various journal
+ * buffer ring buffer stats fields when
+ * H5C2__JBRB__COLLECT_STATS is TRUE, and do nothing when
+ * it is false.
+ *
+ * Return: N/A
+ *
+ * Programmer: John Mainzer, 2/21/10
+ *
+ * Modifications:
+ *
+ * None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+#if H5C2__JBRB__COLLECT_STATS
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_TRANS_COMPLETED(struct_ptr) \
+ ((struct_ptr)->transactions_completed)++;
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_BUF_WRITE_QUEUED(struct_ptr, partial) \
+ ((struct_ptr)->buf_writes_queued)++; \
+ if ( partial ) { \
+ ((struct_ptr)->partial_buf_writes_queued)++; \
+ } else { \
+ ((struct_ptr)->full_buf_writes_queued)++; \
+ }
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_BUF_WRITE_COMPLETE(struct_ptr, await) \
+ ((struct_ptr)->buf_writes_completed)++; \
+ if ( await ) { \
+ ((struct_ptr)->buf_writes_completed_by_await)++; \
+ } else { \
+ ((struct_ptr)->buf_writes_completed_by_test)++; \
+ }
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_ASYNC_SYNCS_QUEUED(struct_ptr) \
+ ((struct_ptr)->async_syncs_queued)++; \
+ if (((struct_ptr)->max_sync_q_len) < ((struct_ptr)->aio_sync_q_len)) { \
+ (struct_ptr)->max_sync_q_len = (struct_ptr)->aio_sync_q_len; \
+ }
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_ASYNC_SYNC_COMPLETED(struct_ptr, await) \
+ ((struct_ptr)->async_syncs_completed)++; \
+ if ( await ) { \
+ ((struct_ptr)->async_syncs_completed_by_await)++; \
+ } else { \
+ ((struct_ptr)->async_syncs_completed_by_test)++; \
+ }
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_AIO_ERROR_CALL_AWAITING_SYNC(struct_ptr) \
+ ((struct_ptr)->calls_to_aio_error_awaiting_sync)++;
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_CALL_TO_FSYNC(struct_ptr) \
+ ((struct_ptr)->calls_to_fsync)++;
+
+#else /* H5C2__JBRB__COLLECT_STATS */
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_TRANS_COMPLETED(struct_ptr)
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_BUF_WRITE_QUEUED(struct_ptr, partial)
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_BUF_WRITE_COMPLETE(struct_ptr, await)
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_ASYNC_SYNCS_QUEUED(struct_ptr)
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_ASYNC_SYNC_COMPLETED(struct_ptr, await)
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_AIO_ERROR_CALL_AWAITING_SYNC(struct_ptr)
+
+#define H5C2__JBRB__UPDATE_STATS_FOR_CALL_TO_FSYNC(struct_ptr)
+
+#endif /* H5C2__JBRB__COLLECT_STATS */
+#endif /* _H5C2pkg_H */
diff --git a/src/H5C2private.h b/src/H5C2private.h
index 0d053b0..5ac3748 100644
--- a/src/H5C2private.h
+++ b/src/H5C2private.h
@@ -107,13 +107,13 @@ typedef struct H5C2_t H5C2_t;
* name: Pointer to a string containing the name of the class of metadata
* cache entries.
*
- * mem_type: Instance of H5FD_mem_t, that is used to supply the
+ * mem_type: Instance of H5FD_mem_t, that is used to supply the
* mem type passed into H5F_block_read().
*
* deserialize: Pointer to the deserialize function.
*
* This function must be able to read an on disk image of a metadata
- * cache entry, allocate and load the equivalent in core representation,
+ * cache entry, allocate and load the equivalent in core representation,
* and return a pointer to that representation.
*
* The typedef for the deserialize callback is as follows:
@@ -140,8 +140,8 @@ typedef struct H5C2_t H5C2_t;
* mode, but the parameter may be unused when compiled in
* production mode.
*
- * image_ptr: Pointer to a buffer of length len containing the
- * contents of the file starting at addr and continuing
+ * image_ptr: Pointer to a buffer of length len containing the
+ * contents of the file starting at addr and continuing
* for len bytes.
*
* udata_ptr: Pointer to user data provided in the protect call, which
@@ -155,22 +155,22 @@ typedef struct H5C2_t H5C2_t;
* Processing in the deserialize function should proceed as follows:
*
* If the image contains valid data, and is of the correct length,
- * the deserialize function must allocate space for an in core
- * representation of that data, load the contents of the image into
- * the space allocated for the in core representation, and return
- * a pointer to the in core representation. Observe that an
- * instance of H5C2_cache_entry_t must be the first item in this
- * representation. It will have to be initialized appropriately
+ * the deserialize function must allocate space for an in core
+ * representation of that data, load the contents of the image into
+ * the space allocated for the in core representation, and return
+ * a pointer to the in core representation. Observe that an
+ * instance of H5C2_cache_entry_t must be the first item in this
+ * representation. It will have to be initialized appropriately
* after the callback returns.
*
* Note that the structure of the in core representation is otherwise
- * up to the cache client. All that is required is that the pointer
- * returned be sufficient for the clients purposes when it is returned
+ * up to the cache client. All that is required is that the pointer
+ * returned be sufficient for the clients purposes when it is returned
* on a protect call.
*
* If the deserialize function has to clean up file corruption
* left over from an old bug in the HDF5 library, it must set
- * *dirty_ptr to TRUE. If it doesn't, no action is needed as
+ * *dirty_ptr to TRUE. If it doesn't, no action is needed as
* *dirty_ptr will be set to FALSE before the deserialize call.
*
* If the operation fails for any reason (i.e. bad data in buffer, bad
@@ -214,18 +214,18 @@ typedef struct H5C2_t H5C2_t;
* serialize: Pointer to the serialize callback.
*
* The serialize callback is invoked by the metadata cache whenever
- * it needs a current on disk image of the metadata entry for purposes
+ * it needs a current on disk image of the metadata entry for purposes
* either constructing a journal or flushing the entry to disk.
*
- * At this point, one would think that the base address and length of
- * the length of the entry's image on disk would be well known.
- * However, that need not be the case as fractal heap blocks can
- * change size (and therefor possible location as well) on
- * serialization if compression is enabled. In the old H5C code,
- * this happened on a flush, and occasioned a rename in the midst
- * of the flush. To avoid this in H5C2, the serialize callback
- * will return the new base address, length, and image pointer to
- * the caller when necessary. The caller must then update the
+ * At this point, one would think that the base address and length of
+ * the length of the entry's image on disk would be well known.
+ * However, that need not be the case as fractal heap blocks can
+ * change size (and therefor possible location as well) on
+ * serialization if compression is enabled. In the old H5C code,
+ * this happened on a flush, and occasioned a rename in the midst
+ * of the flush. To avoid this in H5C2, the serialize callback
+ * will return the new base address, length, and image pointer to
+ * the caller when necessary. The caller must then update the
* metadata cache's internal structures accordingly.
*
* The typedef for the serialize callback is as follows:
@@ -237,19 +237,19 @@ typedef struct H5C2_t H5C2_t;
* void * image_ptr,
* void * thing,
* unsigned * flags_ptr,
- * haddr_t * new_addr_ptr,
- * size_t * new_len_ptr,
+ * haddr_t * new_addr_ptr,
+ * size_t * new_len_ptr,
* void ** new_image_ptr_ptr);
*
* The parameters of the serialize callback are as follows:
*
* f: File pointer -- needed if other metadata cache entries
- * must be modified in the process of serializing the
+ * must be modified in the process of serializing the
* target entry.
*
- * dxpl_id: dxpl_id passed with the file pointer to the cache, and
- * passed on to the callback. Necessary as some callbacks
- * revise the size and location of the target entry, or
+ * dxpl_id: dxpl_id passed with the file pointer to the cache, and
+ * passed on to the callback. Necessary as some callbacks
+ * revise the size and location of the target entry, or
* possibly other entries on serialize.
*
* addr: Base address in file of the entry to be serialized.
@@ -267,157 +267,157 @@ typedef struct H5C2_t H5C2_t;
* mode, but the parameter may be unused when compiled in
* production mode.
*
- * image_ptr: Pointer to a buffer of length len bytes into which a
- * serialized image of the target metadata cache entry is
+ * image_ptr: Pointer to a buffer of length len bytes into which a
+ * serialized image of the target metadata cache entry is
* to be written.
*
- * Note that this buffer will not in general be initialized
- * to any particular value. Thus the serialize function may
- * not assume any initial value and must set each byte in
+ * Note that this buffer will not in general be initialized
+ * to any particular value. Thus the serialize function may
+ * not assume any initial value and must set each byte in
* the buffer.
*
- * thing: Pointer to void containing the address of the in core
- * representation of the target metadata cache entry.
- * This is the same pointer returned by a protect of the
+ * thing: Pointer to void containing the address of the in core
+ * representation of the target metadata cache entry.
+ * This is the same pointer returned by a protect of the
* addr and len given above.
*
- * flags_ptr: Pointer to an unsigned integer used to return flags
- * indicating whether the resize function resized or renamed
- * the entry. If the entry was neither resized or renamed,
- * the serialize function must set *flags_ptr to zero.
- * H5C2__SERIALIZE_RESIZED_FLAG and H5C2__SERIALIZE_RENAMED_FLAG
+ * flags_ptr: Pointer to an unsigned integer used to return flags
+ * indicating whether the resize function resized or renamed
+ * the entry. If the entry was neither resized or renamed,
+ * the serialize function must set *flags_ptr to zero.
+ * H5C2__SERIALIZE_RESIZED_FLAG and H5C2__SERIALIZE_RENAMED_FLAG
* must be set to indicate a resize and a rename respectively.
*
- * If the H5C2__SERIALIZE_RESIZED_FLAG is set, the new length
- * and image pointer must be stored in *new_len_ptr and
- * *new_image_ptr_ptr respectively.
- *
- * If the H5C2__SERIALIZE_RENAMED_FLAG flag is also set, the
- * new image base address must be stored in *new_addr_ptr.
- * Observe that the H5C2__SERIALIZE_RENAMED_FLAG must not
- * appear without the H5C2__SERIALIZE_RESIZED_FLAG.
- *
- * Except as noted above, the locations pointed to by the
- * remaining parameters are undefined, and should be ignored
- * by the caller.
- *
- * new_addr_ptr: Pointer to haddr_t. If the entry is renamed by
- * the serialize function, the new on disk base address must
- * be stored in *new_addr_ptr. If the entry is not renamed
- * by the serialize function, *new_addr_ptr is undefined.
- *
- * new_len_ptr: Pointer to size_t. If the entry is resized by the
- * serialize function, the new length of the on disk image
- * must be stored in *new_len_ptr. If the entry is not
- * resized by the serialize function, *new_len_ptr is
- * undefined.
- *
- * new_image_ptr_ptr: Pointer to pointer to void. If the entry is
- * resized by the serialize function, the pointer to the
- * new buffer containing the on disk image must be stored
- * in *new_image_ptr_ptr. If the entry is not resized by
+ * If the H5C2__SERIALIZE_RESIZED_FLAG is set, the new length
+ * and image pointer must be stored in *new_len_ptr and
+ * *new_image_ptr_ptr respectively.
+ *
+ * If the H5C2__SERIALIZE_RENAMED_FLAG flag is also set, the
+ * new image base address must be stored in *new_addr_ptr.
+ * Observe that the H5C2__SERIALIZE_RENAMED_FLAG must not
+ * appear without the H5C2__SERIALIZE_RESIZED_FLAG.
+ *
+ * Except as noted above, the locations pointed to by the
+ * remaining parameters are undefined, and should be ignored
+ * by the caller.
+ *
+ * new_addr_ptr: Pointer to haddr_t. If the entry is renamed by
+ * the serialize function, the new on disk base address must
+ * be stored in *new_addr_ptr. If the entry is not renamed
+ * by the serialize function, *new_addr_ptr is undefined.
+ *
+ * new_len_ptr: Pointer to size_t. If the entry is resized by the
+ * serialize function, the new length of the on disk image
+ * must be stored in *new_len_ptr. If the entry is not
+ * resized by the serialize function, *new_len_ptr is
+ * undefined.
+ *
+ * new_image_ptr_ptr: Pointer to pointer to void. If the entry is
+ * resized by the serialize function, the pointer to the
+ * new buffer containing the on disk image must be stored
+ * in *new_image_ptr_ptr. If the entry is not resized by
* the serialize function, *new_image_ptr_ptr is undefined.
*
- * Processing in the serialize function should proceed as follows:
+ * Processing in the serialize function should proceed as follows:
*
- * The serialize function must examine the in core representation
- * indicated by the thing parameter, and write a serialized image
- * of its contents into the provided buffer.
+ * The serialize function must examine the in core representation
+ * indicated by the thing parameter, and write a serialized image
+ * of its contents into the provided buffer.
*
- * If the serialize function does not change the size or location
- * of the on disk image, it must set *flags_ptr to zero.
+ * If the serialize function does not change the size or location
+ * of the on disk image, it must set *flags_ptr to zero.
*
- * If the size of the on disk image must be changed, the serialize
- * function must free the old image buffer (base address in image_ptr),
- * allocate a new one, load the image into the new buffer, load the
- * base address of the new buffer into *new_image_ptr_ptr, load the
- * length of the new image into *new_len_ptr, and set the
- * H5C2__SERIALIZE_RESIZED_FLAG in *flags_ptr.
+ * If the size of the on disk image must be changed, the serialize
+ * function must free the old image buffer (base address in image_ptr),
+ * allocate a new one, load the image into the new buffer, load the
+ * base address of the new buffer into *new_image_ptr_ptr, load the
+ * length of the new image into *new_len_ptr, and set the
+ * H5C2__SERIALIZE_RESIZED_FLAG in *flags_ptr.
*
- * If in addition, the base address of the on disk image must
- * be changed, the serialize function must also set *new_addr_ptr
- * to the new base address, and set the H5C2__SERIALIZE_RENAMED_FLAG
+ * If in addition, the base address of the on disk image must
+ * be changed, the serialize function must also set *new_addr_ptr
+ * to the new base address, and set the H5C2__SERIALIZE_RENAMED_FLAG
* in *flags_ptr.
*
- * If it is successful, the function must return SUCCEED.
+ * If it is successful, the function must return SUCCEED.
*
* If it fails for any reason, the function must return FAIL and
- * push error information on the error stack with the error API
+ * push error information on the error stack with the error API
* routines.
*
*
* free_icr: Pointer to the free ICR Callback.
*
- * The free ICR callback is invoked by the metadata cache when it
- * wishes to evict an entry, and needs the client to free the memory
- * allocated for the in core representation.
+ * The free ICR callback is invoked by the metadata cache when it
+ * wishes to evict an entry, and needs the client to free the memory
+ * allocated for the in core representation.
*
- * The typedef for the free ICR callback is as follows:
+ * The typedef for the free ICR callback is as follows:
*
- * typedef herr_t (*N5C_free_icr_func_t)(haddr_t addr,
+ * typedef herr_t (*N5C_free_icr_func_t)(haddr_t addr,
* size_t len,
* void * thing);
+ *
+ * The parameters of the free ICR callback are as follows:
*
- * The parameters of the free ICR callback are as follows:
+ * addr: Base address in file of the entry being evicted.
*
- * addr: Base address in file of the entry being evicted.
+ * This parameter is supplied mainly for sanity checking.
+ * Sanity checks should be performed when compiled in debug
+ * mode, but the parameter may be unused when compiled in
+ * production mode.
*
- * This parameter is supplied mainly for sanity checking.
- * Sanity checks should be performed when compiled in debug
- * mode, but the parameter may be unused when compiled in
- * production mode.
+ * len: Length of the in file image of the entry being evicted
+ * in bytes.
*
- * len: Length of the in file image of the entry being evicted
- * in bytes.
+ * This parameter is supplied mainly for sanity checking.
+ * Sanity checks should be performed when compiled in debug
+ * mode, but the parameter may be unused when compiled in
+ * production mode.
*
- * This parameter is supplied mainly for sanity checking.
- * Sanity checks should be performed when compiled in debug
- * mode, but the parameter may be unused when compiled in
- * production mode.
+ * thing: Pointer to void containing the address of the in core
+ * representation of the target metadata cache entry. This
+ * is the same pointer that would be returned by a protect
+ * of the addr and len above.
*
- * thing: Pointer to void containing the address of the in core
- * representation of the target metadata cache entry. This
- * is the same pointer that would be returned by a protect
- * of the addr and len above.
+ * Processing in the free ICR function should proceed as follows:
*
- * Processing in the free ICR function should proceed as follows:
+ * The free ICR function must free all memory allocated to the
+ * in core representation.
*
- * The free ICR function must free all memory allocated to the
- * in core representation.
+ * If the function is successful, it must return SUCCEED.
*
- * If the function is successful, it must return SUCCEED.
+ * If it fails for any reason, the function must return FAIL and
+ * push error information on the error stack with the error API
+ * routines.
*
- * If it fails for any reason, the function must return FAIL and
- * push error information on the error stack with the error API
- * routines.
- *
- * At least when compiled with debug, it would be useful if the
- * free ICR call would fail if the in core representation has been
+ * At least when compiled with debug, it would be useful if the
+ * free ICR call would fail if the in core representation has been
* modified since the last serialize of clear callback.
*
*
* clear_dirty_bits: Pointer to the clear dirty bits callback.
*
- * For sanity checking purposes, it will be useful if cache clients
- * track whether an in core representation has been modified since
- * the last time it was serialized. This data is used to flag an
- * error if the cache attempts to free an in core representation
- * that has not been serialized since the last time it was modified.
+ * For sanity checking purposes, it will be useful if cache clients
+ * track whether an in core representation has been modified since
+ * the last time it was serialized. This data is used to flag an
+ * error if the cache attempts to free an in core representation
+ * that has not been serialized since the last time it was modified.
*
- * If this happens, either the client forgot to tell the cache that
- * an entry is dirty, or the cache forgot to flush a dirty entry
- * before evicting it. In either case we want to know before we
- * get file corruption complaints.
+ * If this happens, either the client forgot to tell the cache that
+ * an entry is dirty, or the cache forgot to flush a dirty entry
+ * before evicting it. In either case we want to know before we
+ * get file corruption complaints.
*
- * However, in some cases, we want to mark an entry as clean even
- * though it has not been flushed to disk -- most particularly in
- * the parallel case. Thus we need some way to tell the client
- * that a free of the associated ICR is OK even though it has
- * been modified since the last serialization. Hence the clear
- * dirty bits callback.
+ * However, in some cases, we want to mark an entry as clean even
+ * though it has not been flushed to disk -- most particularly in
+ * the parallel case. Thus we need some way to tell the client
+ * that a free of the associated ICR is OK even though it has
+ * been modified since the last serialization. Hence the clear
+ * dirty bits callback.
*
- * Since the clear dirty bits callback is purely for sanity checking,
- * it is called only when we compile with debug.
+ * Since the clear dirty bits callback is purely for sanity checking,
+ * it is called only when we compile with debug.
*
* The typedef for the clear callback is as follows:
*
@@ -425,27 +425,27 @@ typedef struct H5C2_t H5C2_t;
* size_t len,
* void * thing);
*
- * The parameters of the clear callback are as follows:
+ * The parameters of the clear callback are as follows:
*
- * addr: Base address in file of the entry whose dirty bits
- * are being cleared
+ * addr: Base address in file of the entry whose dirty bits
+ * are being cleared
*
- * len: Length in bytes of the in file image of the entry
- * whose dirty bits are being cleared.
+ * len: Length in bytes of the in file image of the entry
+ * whose dirty bits are being cleared.
*
- * thing: Pointer to void containing the address of the in
- * core representation of the target metadata cache entry.
- * This is the same pointer that would be returned by a
- * protect of the addr and len above.
+ * thing: Pointer to void containing the address of the in
+ * core representation of the target metadata cache entry.
+ * This is the same pointer that would be returned by a
+ * protect of the addr and len above.
*
- * Processing in the clear callback function should proceed as follows:
+ * Processing in the clear callback function should proceed as follows:
*
- * The function must clear any dirty bits associated with the ICR.
+ * The function must clear any dirty bits associated with the ICR.
*
- * If successful, the function must return SUCCEED.
+ * If successful, the function must return SUCCEED.
*
- * If it fails for any reason, the function must return FAIL and
- * push error information on the error stack with the error API
+ * If it fails for any reason, the function must return FAIL and
+ * push error information on the error stack with the error API
* routines.
*
***************************************************************************/
@@ -454,7 +454,7 @@ typedef void *(*H5C2_deserialize_func_t)(haddr_t addr,
const void * image_ptr,
void * udata_ptr,
hbool_t * dirty_ptr);
-
+
typedef herr_t (*H5C2_image_len_func_t)(const void *thing,
size_t *image_len_ptr);
@@ -467,12 +467,12 @@ typedef herr_t (*H5C2_serialize_func_t)(const H5F_t *f,
size_t len,
void * image_ptr,
void * thing,
- unsigned * flags_ptr,
- haddr_t * new_addr_ptr,
- size_t * new_len_ptr,
+ unsigned * flags_ptr,
+ haddr_t * new_addr_ptr,
+ size_t * new_len_ptr,
void ** new_image_ptr_ptr);
-typedef herr_t (*H5C2_free_icr_func_t)(haddr_t addr,
+typedef herr_t (*H5C2_free_icr_func_t)(haddr_t addr,
size_t len,
void * thing);
@@ -543,23 +543,23 @@ typedef herr_t (*H5C2_log_flush_func_t)(H5C2_t * cache_ptr,
*
* JRM - 4/26/04
*
- * magic: Unsigned 32 bit integer that must always be set to
+ * magic: Unsigned 32 bit integer that must always be set to
* H5C2__H5C2_CACHE_ENTRY_T_MAGIC when the entry is valid.
* The field must be set to H5C2__H5C2_CACHE_ENTRY_T_BAD_MAGIC
* just before the entry is freed.
*
- * This is necessary, as the LRU list can be changed out
+ * This is necessary, as the LRU list can be changed out
* from under H5C2_make_space_in_cache() by the serialize
* callback which may change the size of an existing entry,
* and/or load a new entry while serializing the target entry.
*
- * This in turn can cause a recursive call to
+ * This in turn can cause a recursive call to
* H5C2_make_space_in_cache() which may either flush or evict
* the next entry that the first invocation of that function
* was about to examine.
*
* The magic field allows H5C2_make_space_in_cache() to
- * detect this case, and re-start its scan from the bottom
+ * detect this case, and re-start its scan from the bottom
* of the LRU when this situation occurs.
*
* cache_ptr: Pointer to the cache that this entry is contained within.
@@ -580,8 +580,8 @@ typedef herr_t (*H5C2_log_flush_func_t)(H5C2_t * cache_ptr,
* block of memory on disk. The image of this block (i.e.
* the on disk image) is stored in *image_ptr (discussed below).
*
- * image_ptr: Pointer to void. When not NULL, this field points to a
- * dynamically allocated block of size bytes in which the
+ * image_ptr: Pointer to void. When not NULL, this field points to a
+ * dynamically allocated block of size bytes in which the
* on disk image of the metadata cache entry is stored.
*
* If the entry is dirty, the serialize callback must be used
@@ -645,20 +645,20 @@ typedef herr_t (*H5C2_log_flush_func_t)(H5C2_t * cache_ptr,
* Note that protected entries are removed from the LRU lists
* and inserted on the protected list.
*
- * is_read_only: Boolean flag that is only meaningful if is_protected is
- * TRUE. In this circumstance, it indicates whether the
+ * is_read_only: Boolean flag that is only meaningful if is_protected is
+ * TRUE. In this circumstance, it indicates whether the
* entry has been protected read only, or read/write.
*
* If the entry has been protected read only (i.e. is_protected
- * and is_read_only are both TRUE), we allow the entry to be
+ * and is_read_only are both TRUE), we allow the entry to be
* protected more than once.
*
- * In this case, the number of readers is maintained in the
+ * In this case, the number of readers is maintained in the
* ro_ref_count field (see below), and unprotect calls simply
* decrement that field until it drops to zero, at which point
* the entry is actually unprotected.
*
- * ro_ref_count: Integer field used to maintain a count of the number of
+ * ro_ref_count: Integer field used to maintain a count of the number of
* outstanding read only protects on this entry. This field
* must be zero whenever either is_protected or is_read_only
* are TRUE.
@@ -720,7 +720,7 @@ typedef herr_t (*H5C2_log_flush_func_t)(H5C2_t * cache_ptr,
* is in the process of being flushed. This allows the cache
* to detect when a call is the result of a flush callback.
*
- * destroy_in_progress: Boolean flag that is set to true iff the entry
+ * destroy_in_progress: Boolean flag that is set to true iff the entry
* is in the process of being flushed and destroyed.
*
*
@@ -811,24 +811,24 @@ typedef herr_t (*H5C2_log_flush_func_t)(H5C2_t * cache_ptr,
* the specified transaction has made it to disk, we will
* reset this field to zero as well.
*
- * We must maintain this field, as to avoid messages from
- * the future, we must not flush a dirty entry to disk
- * until the last transaction in which it was dirtied
+ * We must maintain this field, as to avoid messages from
+ * the future, we must not flush a dirty entry to disk
+ * until the last transaction in which it was dirtied
* has made it to disk in the journal file.
*
- * trans_next: Next pointer in the entries modified in the current
+ * trans_next: Next pointer in the entries modified in the current
* transaction list. This field should always be null
- * unless journaling is enabled, the entry is dirty,
+ * unless journaling is enabled, the entry is dirty,
* and last_trans field contains the current transaction
- * number. Even if all these conditions are fulfilled,
- * the field will still be NULL if this is the last
+ * number. Even if all these conditions are fulfilled,
+ * the field will still be NULL if this is the last
* entry on the list.
*
- * trans_prev: Previous pointer in the entries modified in the current
+ * trans_prev: Previous pointer in the entries modified in the current
* transaction list. This field should always be null
- * unless journaling is enabled, the entry is dirty,
+ * unless journaling is enabled, the entry is dirty,
* and last_trans field contains the current transaction
- * number. Even if all these conditions are fulfilled,
+ * number. Even if all these conditions are fulfilled,
* the field will still be NULL if this is the first
* entry on the list.
*
@@ -1045,7 +1045,7 @@ typedef struct H5C2_cache_entry_t
*
*
* With a little thought, it should be obvious that the above flash
- * cache size increase algorithm is not sufficient for all
+ * cache size increase algorithm is not sufficient for all
* circumstances -- for example, suppose the user round robins through
* (1/flash_threshold) +1 groups, adding one data set to each on each
* pass. Then all will increase in size at about the same time, requiring
@@ -1062,11 +1062,11 @@ typedef struct H5C2_cache_entry_t
* flash_incr_mode section. This field is ignored unless flash_incr_mode
* is H5C_flash_incr__add_space.
*
- * flash_threshold: Double containing the factor by which current max cache
- * size is multiplied to obtain the size threshold for the add_space
- * flash increment algorithm. The field is ignored unless
+ * flash_threshold: Double containing the factor by which current max cache
+ * size is multiplied to obtain the size threshold for the add_space
+ * flash increment algorithm. The field is ignored unless
* flash_incr_mode is H5C2_flash_incr__add_space.
- *
+ *
*
* Cache size decrease control fields:
*
@@ -1195,7 +1195,7 @@ typedef struct H5C2_cache_entry_t
#define H5C2__MAX_JBRB_BUF_SIZE ((size_t)(2 * 1024 * 1024))
#define H5C2__MIN_JBRB_NUM_BUFS 1
-#define H5C2__MAX_JBRB_NUM_BUFS 100
+#define H5C2__MAX_JBRB_NUM_BUFS 256
enum H5C2_resize_status
{
@@ -1273,14 +1273,14 @@ typedef struct H5C2_auto_size_ctl_t
*
* structure H5C2_mdj_config_t
*
- * H5C2_mdj_config_t is a structure intended for use in comminicating
- * metadata journaling configuration data to and from the metadata
- * cache.
+ * H5C2_mdj_config_t is a structure intended for use in comminicating
+ * metadata journaling configuration data to and from the metadata
+ * cache.
*
* In its initial incarnation, it is identical to the H5AC2_jnl_config_t
- * structure less ther version, and journal_recovered fields. However,
- * in the future we may support other types of journaling -- which will
- * likely require modification or replacement of the H5AC2_jnl_config_t
+ * structure less ther version, and journal_recovered fields. However,
+ * in the future we may support other types of journaling -- which will
+ * likely require modification or replacement of the H5AC2_jnl_config_t
* structure.
*
* The fields of the structure are discussed individually below. Note
@@ -1300,7 +1300,7 @@ typedef struct H5C2_auto_size_ctl_t
*
* At present, the length of the journal file path is restricted to
* no more than H5C2__MAX_JOURNAL_FILE_NAME_LEN (which must equal
- * H5AC2__MAX_JOURNAL_FILE_NAME_LEN).
+ * H5AC2__MAX_JOURNAL_FILE_NAME_LEN).
*
* jbrb_buf_size: size_t containing the size of each individual buffer
* in the journal buffer ring buffer. This size should be chosen
@@ -1589,6 +1589,18 @@ H5_DLL herr_t H5C2_update_for_new_last_trans_on_disk(H5C2_t * cache_ptr,
typedef struct H5C2_jbrb_t H5C2_jbrb_t;
+/* Note that H5C2_jb_aio_await_completion_of_all_async_fsyncs() and
+ * H5C2_jb_aio__await_completion_of_all_pending_writes() are declared
+ * in this header file purely for testing purposes -- they should not be
+ * called outside test/cache2_journal.c
+ */
+H5_DLL herr_t H5C2_jb_aio__await_completion_of_all_async_fsyncs(
+ H5C2_jbrb_t * struct_ptr);
+
+H5_DLL herr_t H5C2_jb_aio__await_completion_of_all_pending_writes(
+ H5C2_jbrb_t * struct_ptr);
+
+
H5_DLL herr_t H5C2_jb__bin2hex(const uint8_t * buf,
char * hexdata,
size_t * hexlength,
@@ -1606,10 +1618,9 @@ H5_DLL herr_t H5C2_jb__eoa(H5C2_jbrb_t * struct_ptr,
H5_DLL herr_t H5C2_jb__get_last_transaction_on_disk(H5C2_jbrb_t * struct_ptr,
uint64_t * trans_num_ptr);
-H5_DLL herr_t H5C2_jb__flush_full_buffers(H5C2_jbrb_t * struct_ptr);
-
H5_DLL herr_t H5C2_jb__flush(H5C2_jbrb_t * struct_ptr);
+
H5_DLL herr_t H5C2_jb__journal_entry(H5C2_jbrb_t * struct_ptr,
uint64_t trans_num,
haddr_t base_addr,
@@ -1636,13 +1647,12 @@ H5_DLL herr_t H5C2_jb__trunc(H5C2_jbrb_t * struct_ptr);
H5_DLL herr_t H5C2_jb__write_header_entry(H5C2_jbrb_t * struct_ptr);
-H5_DLL herr_t H5C2_jb__write_to_buffer(H5C2_jbrb_t * struct_ptr,
+H5_DLL herr_t H5C2_jb__write_to_buffer(H5C2_jbrb_t * struct_ptr,
size_t size,
const char * data,
hbool_t is_end_trans,
uint64_t trans_num);
-
/*****************************************************************************/
/***** superblock journaling message management function definitions: ********/
/*****************************************************************************/
diff --git a/src/H5MF.c b/src/H5MF.c
index 27b00cc..9882306 100644
--- a/src/H5MF.c
+++ b/src/H5MF.c
@@ -24,6 +24,8 @@
*-------------------------------------------------------------------------
*/
+#include <aio.h>
+
/****************/
/* Module Setup */
/****************/
diff --git a/src/H5private.h b/src/H5private.h
index ae71826..001e487 100644
--- a/src/H5private.h
+++ b/src/H5private.h
@@ -756,7 +756,11 @@ H5_DLL int HDfprintf (FILE *stream, const char *fmt, ...);
#define HDstat(S,B) stat64(S,B)
#endif /* HDstat */
typedef struct stat64 h5_stat_t;
+#if 1 /* Solaris */ /* JRM */
+ typedef off_t h5_stat_size_t;
+#else /* not Solaris */ /* JRM */
typedef off64_t h5_stat_size_t;
+#endif /* JRM */
#else /* H5_SIZEOF_OFF_T!=8 && ... */
#ifndef HDfstat
#define HDfstat(F,B) fstat(F,B)
diff --git a/test/cache2.c b/test/cache2.c
index f9fde85..41c3bf7 100644
--- a/test/cache2.c
+++ b/test/cache2.c
@@ -19,6 +19,9 @@
* This file contains tests for the cache implemented in
* H5C.c
*/
+
+#include <aio.h>
+
#include "h5test.h"
#include "H5Iprivate.h"
#include "H5ACprivate.h"
diff --git a/test/cache2_api.c b/test/cache2_api.c
index 49e5ef7..7c5965e 100644
--- a/test/cache2_api.c
+++ b/test/cache2_api.c
@@ -20,6 +20,7 @@
* with the cache implemented in H5C2.c
*/
+#include <aio.h>
#include "h5test.h"
#include "H5Iprivate.h"
#include "H5AC2private.h"
diff --git a/test/cache2_common.c b/test/cache2_common.c
index fa1e9d7..6e7c431 100644
--- a/test/cache2_common.c
+++ b/test/cache2_common.c
@@ -20,6 +20,8 @@
* implemented in H5C2.c
*/
+#include <aio.h>
+
#include "H5private.h"
#include "h5test.h"
diff --git a/test/cache2_jnl_file_marking.c b/test/cache2_jnl_file_marking.c
index d93695a..ef133d5 100644
--- a/test/cache2_jnl_file_marking.c
+++ b/test/cache2_jnl_file_marking.c
@@ -20,6 +20,8 @@
* features implemented in H5C2.c and friends.
*/
+#include <aio.h>
+
#define H5F_PACKAGE /*suppress error about including H5Fpkg */
#include "h5test.h"
diff --git a/test/cache2_journal.c b/test/cache2_journal.c
index 915e4dd..3961603 100644
--- a/test/cache2_journal.c
+++ b/test/cache2_journal.c
@@ -20,6 +20,8 @@
* features implemented in H5C2.c and friends.
*/
+#include <aio.h>
+
#define H5F_PACKAGE /*suppress error about including H5Fpkg */
#include "h5test.h"
@@ -28,6 +30,7 @@
#include "H5MMprivate.h" /* Memory management */
#include "H5MFprivate.h"
#include "H5AC2private.h"
+#include "H5C2private.h"
#include "cache2_common.h"
#include "H5Fpkg.h"
@@ -68,7 +71,7 @@ static void flush_journal(H5C2_t * cache_ptr);
static void jrnl_col_major_scan_backward2(H5F_t * file_ptr,
int32_t max_index,
- int32_t lag,
+ int32_t lag,
hbool_t verbose,
hbool_t reset_stats,
hbool_t display_stats,
@@ -129,7 +132,8 @@ static void open_existing_file_for_journaling(const char * hdf_file_name,
hid_t * file_id_ptr,
H5F_t ** file_ptr_ptr,
H5C2_t ** cache_ptr_ptr,
- hbool_t human_readable);
+ hbool_t human_readable,
+ hbool_t use_aio);
static void open_existing_file_without_journaling(const char * hdf_file_name,
hid_t * file_id_ptr,
@@ -142,6 +146,7 @@ static void setup_cache_for_journaling(const char * hdf_file_name,
H5F_t ** file_ptr_ptr,
H5C2_t ** cache_ptr_ptr,
hbool_t human_readable,
+ hbool_t use_aio,
hbool_t use_core_driver_if_avail);
static void takedown_cache_after_journaling(hid_t file_id,
@@ -159,17 +164,17 @@ static void verify_journal_empty(const char * journal_file_path_ptr);
/* test functions */
-static void check_buffer_writes(void);
+static void check_buffer_writes(hbool_t use_aio);
-static void write_flush_verify(H5C2_jbrb_t * struct_ptr,
- int size,
- char * data,
+static void write_flush_verify(H5C2_jbrb_t * struct_ptr,
+ int size,
+ char * data,
FILE * readback);
-static void write_noflush_verify(H5C2_jbrb_t * struct_ptr,
- int size,
- char * data,
- FILE * readback,
+static void write_noflush_verify(H5C2_jbrb_t * struct_ptr,
+ int size,
+ char * data,
+ FILE * readback,
int repeats);
static void check_superblock_extensions(void);
@@ -225,18 +230,25 @@ static void check_message_format(void);
static void check_legal_calls(void);
-static void check_transaction_tracking(void);
+static void check_transaction_tracking(hbool_t use_aio);
-static void mdj_api_example_test(hbool_t human_readable);
+static void mdj_api_example_test(hbool_t human_readable,
+ hbool_t use_aio,
+ int num_bufs,
+ size_t buf_size);
-static void mdj_smoke_check_00(hbool_t human_readable);
+static void mdj_smoke_check_00(hbool_t human_readable,
+ hbool_t use_aio);
-static void mdj_smoke_check_01(hbool_t human_readable);
+static void mdj_smoke_check_01(hbool_t human_readable,
+ hbool_t use_aio);
-static void mdj_smoke_check_02(hbool_t human_readable);
+static void mdj_smoke_check_02(hbool_t human_readable,
+ hbool_t use_aio);
-static void write_verify_trans_num(H5C2_jbrb_t * struct_ptr,
- uint64_t trans_num,
+static void write_verify_trans_num(H5C2_jbrb_t * struct_ptr,
+ uint64_t trans_num,
+ uint64_t min_verify_val,
uint64_t verify_val);
@@ -253,7 +265,7 @@ static void write_verify_trans_num(H5C2_jbrb_t * struct_ptr,
*
* Purpose: If pass2 is true on entry, attempt to begin a transaction.
* If the operation fails, or if it returns an unexpected
- * transaction number, set passw2 to FALSE, and set failure_mssg2
+ * transaction number, set passw2 to FALSE, and set failure_mssg2
* to point to an appropriate failure message.
*
* Do nothing if pass2 is FALSE on entry.
@@ -276,7 +288,7 @@ begin_trans(H5C2_t * cache_ptr,
{
const char * fcn_name = "begin_trans()";
herr_t result;
- uint64_t trans_num = 0;
+ uint64_t trans_num = 0;
if ( pass2 ) {
@@ -314,7 +326,7 @@ begin_trans(H5C2_t * cache_ptr,
* Function: copy_file()
*
* Purpose: If pass2 is true, copy the input file to the output file.
- * Set pass2 to FALSE and set failure_mssg2 to point to an
+ * Set pass2 to FALSE and set failure_mssg2 to point to an
* appropriate error message on failure.
*
* Do nothing if pass2 is false on entry.
@@ -381,17 +393,17 @@ copy_file(const char * input_file,
pass2 = FALSE;
} else {
-
+
input_len = (size_t)(buf.st_size);
input_remainder = input_len;
if ( verbose ) {
- HDfprintf(stdout, "%s: input_len = %d.\n",
+ HDfprintf(stdout, "%s: input_len = %d.\n",
fcn_name, (int)input_len);
}
}
- }
+ }
}
/* open the input file */
@@ -426,7 +438,7 @@ copy_file(const char * input_file,
}
while ( ( pass2 ) &&
- ( input_remainder > 0 ) )
+ ( input_remainder > 0 ) )
{
if ( input_remainder > max_buf_len ) {
@@ -445,7 +457,7 @@ copy_file(const char * input_file,
if ( verbose ) {
- HDfprintf(stdout,
+ HDfprintf(stdout,
"%s: HDread() failed. result = %d, errno = %d.\n",
fcn_name, (int)result, errno);
}
@@ -463,7 +475,7 @@ copy_file(const char * input_file,
if ( verbose ) {
- HDfprintf(stdout,
+ HDfprintf(stdout,
"%s: HDwrite() failed. result = %d, errno = %d.\n",
fcn_name, (int)result, errno);
}
@@ -517,9 +529,9 @@ copy_file(const char * input_file,
/*-------------------------------------------------------------------------
* Function: end_trans()
*
- * Purpose: If pass2 is true on entry, attempt to end the current
- * transaction. If the operation fails, set pass2 to FALSE,
- * and set failure_mssg2 to point to an appropriate failure
+ * Purpose: If pass2 is true on entry, attempt to end the current
+ * transaction. If the operation fails, set pass2 to FALSE,
+ * and set failure_mssg2 to point to an appropriate failure
* message.
*
* Do nothing if pass2 is FALSE on entry.
@@ -546,13 +558,13 @@ end_trans(H5F_t * file_ptr,
if ( pass2 ) {
- result = H5C2_end_transaction(file_ptr, H5AC2_dxpl_id, cache_ptr,
+ result = H5C2_end_transaction(file_ptr, H5AC2_dxpl_id, cache_ptr,
trans_num, trans_name);
if ( result < 0 ) {
if ( verbose ) {
- HDfprintf(stdout,
+ HDfprintf(stdout,
"%s: H5C2_end_transaction(%lld, \"%s\") failed.\n",
fcn_name, (long long)trans_num, trans_name);
}
@@ -569,11 +581,11 @@ end_trans(H5F_t * file_ptr,
/*-------------------------------------------------------------------------
* Function: file_exists()
*
- * Purpose: If pass2 is true on entry, stat the target file, and
+ * Purpose: If pass2 is true on entry, stat the target file, and
* return TRUE if it exists, and FALSE if it does not.
*
- * If any errors are detected in this process, set pass2
- * to FALSE and set failure_mssg2 to point to an appropriate
+ * If any errors are detected in this process, set pass2
+ * to FALSE and set failure_mssg2 to point to an appropriate
* error message.
*
* Do nothing and return FALSE if pass2 is FALSE on entry.
@@ -621,15 +633,15 @@ file_exists(const char * file_path_ptr)
if ( verbose ) {
- HDfprintf(stdout, "%s: HDstat(%s) failed with ENOENT\n",
+ HDfprintf(stdout, "%s: HDstat(%s) failed with ENOENT\n",
fcn_name, file_path_ptr);
}
-
+
} else {
if ( verbose ) {
- HDfprintf(stdout,
+ HDfprintf(stdout,
"%s: HDstat() failed with unexpected errno = %d.\n",
fcn_name, errno);
}
@@ -637,7 +649,7 @@ file_exists(const char * file_path_ptr)
failure_mssg2 = "HDstat() returned unexpected value.";
pass2 = FALSE;
- }
+ }
}
return(ret_val);
@@ -649,7 +661,7 @@ file_exists(const char * file_path_ptr)
* Function: flush_journal()
*
* Purpose: If pass2 is true on entry, attempt to flush the journal.
- * If the operation fails, set pass2 to FALSE, and set
+ * If the operation fails, set pass2 to FALSE, and set
* failure_mssg2 to point to an appropriate failure message.
*
* Do nothing if pass2 is FALSE on entry.
@@ -670,7 +682,7 @@ flush_journal(H5C2_t * cache_ptr)
if ( pass2 ) {
if ( H5C2_jb__flush(&(cache_ptr->mdj_jbrb)) < 0 ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__flush() reports failure.";
}
@@ -685,12 +697,12 @@ flush_journal(H5C2_t * cache_ptr)
* Function: jrnl_col_major_scan_backward2()
*
* Purpose: Do a sequence of inserts, protects, and unprotects
- * broken into a sequence of transactions while scanning
- * backwards through the set of entries.
+ * broken into a sequence of transactions while scanning
+ * backwards through the set of entries.
*
* If pass2 is false on entry, do nothing.
*
- * Note tht this function is an adaption of
+ * Note tht this function is an adaption of
* col_major_scan_backward2()
*
* Return: void
@@ -760,9 +772,9 @@ jrnl_col_major_scan_backward2(H5F_t * file_ptr,
trans_num++;
- begin_trans(cache_ptr, verbose, trans_num,
+ begin_trans(cache_ptr, verbose, trans_num,
"jrnl_col_major_scan_backward outer loop");
-
+
if ( verbose ) {
HDfprintf(stdout, "begin trans %lld, idx = %d.\n", trans_num, idx);
@@ -774,7 +786,7 @@ jrnl_col_major_scan_backward2(H5F_t * file_ptr,
HDfprintf(stdout, "%d:%d: ", type, idx);
}
-
+
if ( ( pass2 ) && ( do_inserts) && ( (idx - lag) >= 0 ) &&
( (idx - lag) <= local_max_index[type] ) &&
( ((idx - lag) % 3) == 0 ) &&
@@ -788,7 +800,7 @@ jrnl_col_major_scan_backward2(H5F_t * file_ptr,
}
if ( ( pass2 ) &&
- ( idx >= 0 ) &&
+ ( idx >= 0 ) &&
( idx <= local_max_index[type] ) ) {
if ( verbose )
@@ -813,7 +825,7 @@ jrnl_col_major_scan_backward2(H5F_t * file_ptr,
type--;
}
- end_trans(file_ptr, cache_ptr, verbose, trans_num,
+ end_trans(file_ptr, cache_ptr, verbose, trans_num,
"jrnl_col_major_scan_backward outer loop");
if ( verbose ) {
@@ -850,10 +862,10 @@ jrnl_col_major_scan_backward2(H5F_t * file_ptr,
* Function: jrnl_col_major_scan_forward2()
*
* Purpose: Do a sequence of inserts, protects, and unprotects
- * broken into a sequence of transactions while scanning
- * through the set of entries.
+ * broken into a sequence of transactions while scanning
+ * through the set of entries.
*
- * Note that this function is an adaption of
+ * Note that this function is an adaption of
* col_major_scan_forward2().
*
* If pass2 is false on entry, do nothing.
@@ -922,9 +934,9 @@ jrnl_col_major_scan_forward2(H5F_t * file_ptr,
trans_num++;
- begin_trans(cache_ptr, verbose, trans_num,
+ begin_trans(cache_ptr, verbose, trans_num,
"jrnl_col_major_scan_forward outer loop");
-
+
if ( verbose ) {
HDfprintf(stdout, "begin trans %lld, idx = %d.\n", trans_num, idx);
@@ -936,7 +948,7 @@ jrnl_col_major_scan_forward2(H5F_t * file_ptr,
HDfprintf(stdout, "%d:%d: ", type, idx);
}
-
+
if ( ( pass2 ) && ( do_inserts ) && ( (idx + lag) >= 0 ) &&
( (idx + lag) <= local_max_index[type] ) &&
( ((idx + lag) % 3) == 0 ) &&
@@ -949,8 +961,8 @@ jrnl_col_major_scan_forward2(H5F_t * file_ptr,
H5C2__NO_FLAGS_SET);
}
- if ( ( pass2 ) &&
- ( idx >= 0 ) &&
+ if ( ( pass2 ) &&
+ ( idx >= 0 ) &&
( idx <= local_max_index[type] ) ) {
if ( verbose )
@@ -975,7 +987,7 @@ jrnl_col_major_scan_forward2(H5F_t * file_ptr,
type++;
}
- end_trans(file_ptr, cache_ptr, verbose, trans_num,
+ end_trans(file_ptr, cache_ptr, verbose, trans_num,
"jrnl_col_major_scan_forward outer loop");
if ( verbose ) {
@@ -1006,12 +1018,12 @@ jrnl_col_major_scan_forward2(H5F_t * file_ptr,
* Function: jrnl_row_major_scan_backward2()
*
* Purpose: Do a sequence of inserts, protects, unprotects, renames,
- * destroys broken into transactions while scanning backwards
- * through the set of entries.
+ * destroys broken into transactions while scanning backwards
+ * through the set of entries.
*
* If pass2 is false on entry, do nothing.
*
- * Note that this function is an adaption of
+ * Note that this function is an adaption of
* row_major_scan_backward2()
*
* Return: void
@@ -1085,25 +1097,25 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
trans_num++;
- begin_trans(cache_ptr, verbose, trans_num,
+ begin_trans(cache_ptr, verbose, trans_num,
"jrnl_row_major_scan_backward inner loop");
if ( verbose )
- HDfprintf(stdout, "begin trans %lld.\n",
+ HDfprintf(stdout, "begin trans %lld.\n",
(long long)trans_num);
if ( verbose )
HDfprintf(stdout, "(%d, %d)\n", lower_bound, upper_bound);
}
- while ( ( pass2 ) && ( idx >= lower_bound - lag ) )
+ while ( ( pass2 ) && ( idx >= lower_bound - lag ) )
{
if ( verbose ) {
HDfprintf(stdout, "%lld:%d:%d: ", trans_num, type, idx);
}
-
- if ( ( pass2 ) && ( do_inserts ) &&
+
+ if ( ( pass2 ) && ( do_inserts ) &&
( (idx - lag) >= 0 ) &&
( (idx - lag) >= lower_bound ) &&
( (idx - lag) <= local_max_index ) &&
@@ -1119,7 +1131,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag + 1) >= 0 ) &&
( (idx - lag + 1) >= lower_bound ) &&
( (idx - lag + 1) <= local_max_index ) &&
@@ -1127,13 +1139,13 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
( ( (idx - lag + 1) % 3 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "(p, %d, %d) ",
+ HDfprintf(stdout, "(p, %d, %d) ",
type, (idx - lag + 1));
protect_entry2(file_ptr, type, (idx - lag + 1));
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag + 2) >= 0 ) &&
( (idx - lag + 2) >= lower_bound ) &&
( (idx - lag + 2) <= local_max_index ) &&
@@ -1141,7 +1153,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
( ( (idx - lag + 2) % 3 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "(u, %d, %d) ",
+ HDfprintf(stdout, "(u, %d, %d) ",
type, (idx - lag + 2));
unprotect_entry2(file_ptr, type, idx-lag+2, NO_CHANGE,
@@ -1149,7 +1161,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
}
- if ( ( pass2 ) && ( do_renames ) &&
+ if ( ( pass2 ) && ( do_renames ) &&
( (idx - lag + 2) >= 0 ) &&
( (idx - lag + 2) >= lower_bound ) &&
( (idx - lag + 2) <= local_max_index ) &&
@@ -1157,8 +1169,8 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
( ( (idx - lag + 2) % 3 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "(r, %d, %d, %d) ",
- type, (idx - lag + 2),
+ HDfprintf(stdout, "(r, %d, %d, %d) ",
+ type, (idx - lag + 2),
(int)rename_to_main_addr);
rename_entry2(cache_ptr, type, (idx - lag + 2),
@@ -1166,7 +1178,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag + 3) >= 0 ) &&
( (idx - lag + 3) >= lower_bound ) &&
( (idx - lag + 3) <= local_max_index ) &&
@@ -1174,13 +1186,13 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
( ( (idx - lag + 3) % 5 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "(p, %d, %d) ",
+ HDfprintf(stdout, "(p, %d, %d) ",
type, (idx - lag + 3));
protect_entry2(file_ptr, type, (idx - lag + 3));
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag + 5) >= 0 ) &&
( (idx - lag + 5) >= lower_bound ) &&
( (idx - lag + 5) <= local_max_index ) &&
@@ -1188,7 +1200,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
( ( (idx - lag + 5) % 5 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "(u, %d, %d) ",
+ HDfprintf(stdout, "(u, %d, %d) ",
type, (idx - lag + 5));
unprotect_entry2(file_ptr, type, idx-lag+5, NO_CHANGE,
@@ -1197,7 +1209,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
if ( do_mult_ro_protects )
{
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag + 5) >= 0 ) &&
( (idx - lag + 5) >= lower_bound ) &&
( (idx - lag + 5) < local_max_index ) &&
@@ -1205,13 +1217,13 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
( (idx - lag + 5) % 9 == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "(p-ro, %d, %d) ", type,
+ HDfprintf(stdout, "(p-ro, %d, %d) ", type,
(idx - lag + 5));
protect_entry_ro2(file_ptr, type, (idx - lag + 5));
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag + 6) >= 0 ) &&
( (idx - lag + 6) >= lower_bound ) &&
( (idx - lag + 6) < local_max_index ) &&
@@ -1219,13 +1231,13 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
( (idx - lag + 6) % 11 == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "(p-ro, %d, %d) ", type,
+ HDfprintf(stdout, "(p-ro, %d, %d) ", type,
(idx - lag + 6));
protect_entry_ro2(file_ptr, type, (idx - lag + 6));
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag + 7) >= 0 ) &&
( (idx - lag + 7) >= lower_bound ) &&
( (idx - lag + 7) < local_max_index ) &&
@@ -1233,13 +1245,13 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
( (idx - lag + 7) % 13 == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "(p-ro, %d, %d) ", type,
+ HDfprintf(stdout, "(p-ro, %d, %d) ", type,
(idx - lag + 7));
protect_entry_ro2(file_ptr, type, (idx - lag + 7));
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag + 7) >= 0 ) &&
( (idx - lag + 7) >= lower_bound ) &&
( (idx - lag + 7) < local_max_index ) &&
@@ -1247,14 +1259,14 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
( (idx - lag + 7) % 9 == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "(u-ro, %d, %d) ", type,
+ HDfprintf(stdout, "(u-ro, %d, %d) ", type,
(idx - lag + 7));
unprotect_entry2(file_ptr, type, (idx - lag + 7),
FALSE, H5C2__NO_FLAGS_SET);
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag + 8) >= 0 ) &&
( (idx - lag + 8) >= lower_bound ) &&
( (idx - lag + 8) < local_max_index ) &&
@@ -1262,14 +1274,14 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
( (idx - lag + 8) % 11 == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "(u-ro, %d, %d) ", type,
+ HDfprintf(stdout, "(u-ro, %d, %d) ", type,
(idx - lag + 8));
unprotect_entry2(file_ptr, type, (idx - lag + 8),
FALSE, H5C2__NO_FLAGS_SET);
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag + 9) >= 0 ) &&
( (idx - lag + 9) >= lower_bound ) &&
( (idx - lag + 9) < local_max_index ) &&
@@ -1277,7 +1289,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
( (idx - lag + 9) % 13 == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "(u-ro, %d, %d) ", type,
+ HDfprintf(stdout, "(u-ro, %d, %d) ", type,
(idx - lag + 9));
unprotect_entry2(file_ptr, type, (idx - lag + 9),
@@ -1285,9 +1297,9 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
}
} /* if ( do_mult_ro_protects ) */
- if ( ( pass2 ) &&
- ( idx >= 0 ) &&
- ( idx >= lower_bound ) &&
+ if ( ( pass2 ) &&
+ ( idx >= 0 ) &&
+ ( idx >= lower_bound ) &&
( idx <= local_max_index ) &&
( idx <= upper_bound ) ) {
@@ -1298,7 +1310,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag - 2) >= 0 ) &&
( (idx + lag - 2) >= lower_bound ) &&
( (idx + lag - 2) <= local_max_index ) &&
@@ -1306,14 +1318,14 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
( ( (idx + lag - 2) % 7 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "(u, %d, %d) ",
+ HDfprintf(stdout, "(u, %d, %d) ",
type, (idx + lag - 2));
unprotect_entry2(file_ptr, type, idx+lag-2, NO_CHANGE,
H5C2__NO_FLAGS_SET);
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag - 1) >= 0 ) &&
( (idx + lag - 1) >= lower_bound ) &&
( (idx + lag - 1) <= local_max_index ) &&
@@ -1321,7 +1333,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
( ( (idx + lag - 1) % 7 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "(p, %d, %d) ",
+ HDfprintf(stdout, "(p, %d, %d) ",
type, (idx + lag - 1));
protect_entry2(file_ptr, type, (idx + lag - 1));
@@ -1330,7 +1342,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
if ( do_destroys ) {
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag) >= 0 ) &&
( (idx + lag) >= lower_bound ) &&
( ( idx + lag) <= local_max_index ) &&
@@ -1342,7 +1354,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
if ( (entries2[type])[idx+lag].is_dirty ) {
unprotect_entry2(file_ptr, type, idx + lag,
- NO_CHANGE,
+ NO_CHANGE,
H5C2__NO_FLAGS_SET);
} else {
@@ -1354,7 +1366,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
case 1: /* we just did an insert */
unprotect_entry2(file_ptr, type, idx + lag,
- NO_CHANGE,
+ NO_CHANGE,
H5C2__NO_FLAGS_SET);
break;
@@ -1362,7 +1374,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
if ( (entries2[type])[idx + lag].is_dirty ) {
unprotect_entry2(file_ptr, type, idx + lag,
- NO_CHANGE,
+ NO_CHANGE,
H5C2__DELETED_FLAG);
} else {
@@ -1374,7 +1386,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
case 3: /* we just did an insrt */
unprotect_entry2(file_ptr, type, idx + lag,
- NO_CHANGE,
+ NO_CHANGE,
H5C2__DELETED_FLAG);
break;
@@ -1385,18 +1397,18 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
}
} else {
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag) >= 0 ) &&
( (idx + lag) >= lower_bound ) &&
( ( idx + lag) <= local_max_index ) &&
( ( idx + lag) <= upper_bound ) ) {
if ( verbose )
- HDfprintf(stdout,
+ HDfprintf(stdout,
"(u, %d, %d) ", type, (idx + lag));
unprotect_entry2(file_ptr, type, idx + lag,
- dirty_unprotects,
+ dirty_unprotects,
H5C2__NO_FLAGS_SET);
}
}
@@ -1408,7 +1420,7 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
} /* while ( ( pass2 ) && ( idx >= lower_bound - lag ) ) */
- end_trans(file_ptr, cache_ptr, verbose, trans_num,
+ end_trans(file_ptr, cache_ptr, verbose, trans_num,
"jrnl_row_major_scan_backward inner loop");
if ( verbose )
@@ -1439,12 +1451,12 @@ jrnl_row_major_scan_backward2(H5F_t * file_ptr,
* Function: jrnl_row_major_scan_forward2()
*
* Purpose: Do a sequence of inserts, protects, unprotects, renames,
- * and destroys broken into transactions while scanning
- * through the set of entries.
+ * and destroys broken into transactions while scanning
+ * through the set of entries.
*
* If pass2 is false on entry, do nothing.
*
- * Note that this function is an adaption of
+ * Note that this function is an adaption of
* row_major_scan_forward2().
*
* Return: void
@@ -1518,26 +1530,26 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
trans_num++;
- begin_trans(cache_ptr, verbose, trans_num,
+ begin_trans(cache_ptr, verbose, trans_num,
"jrnl_row_major_scan_forward inner loop");
if ( verbose )
- HDfprintf(stdout, "begin trans %lld.\n",
+ HDfprintf(stdout, "begin trans %lld.\n",
(long long)trans_num);
if ( verbose )
HDfprintf(stdout, "(%d, %d)\n", lower_bound, upper_bound);
}
- while ( ( pass2 ) && ( idx <= upper_bound + lag ) )
+ while ( ( pass2 ) && ( idx <= upper_bound + lag ) )
{
-
+
if ( verbose ) {
HDfprintf(stdout, "%lld:%d:%d: ", trans_num, type, idx);
}
- if ( ( pass2 ) && ( do_inserts ) &&
+ if ( ( pass2 ) && ( do_inserts ) &&
( (idx + lag) >= 0 ) &&
( (idx + lag) >= lower_bound ) &&
( (idx + lag) <= local_max_index ) &&
@@ -1554,7 +1566,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag - 1) >= 0 ) &&
( (idx + lag - 1) >= lower_bound ) &&
( (idx + lag - 1) <= local_max_index ) &&
@@ -1562,14 +1574,14 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
( ( (idx + lag - 1) % 3 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout,
+ HDfprintf(stdout,
"2(p, %d, %d) ", type, (idx + lag - 1));
/*** protect entry idx + lag - 1 ***/
protect_entry2(file_ptr, type, (idx + lag - 1));
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag - 2) >= 0 ) &&
( (idx + lag - 2) >= lower_bound ) &&
( (idx + lag - 2) <= local_max_index ) &&
@@ -1577,7 +1589,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
( ( (idx + lag - 2) % 3 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "3(u, %d, %d) ",
+ HDfprintf(stdout, "3(u, %d, %d) ",
type, (idx + lag - 2));
/*** unprotect entry idx + lag - 2 ***/
@@ -1586,7 +1598,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
}
- if ( ( pass2 ) && ( do_renames ) &&
+ if ( ( pass2 ) && ( do_renames ) &&
( (idx + lag - 2) >= 0 ) &&
( (idx + lag - 2) >= lower_bound ) &&
( (idx + lag - 2) <= local_max_index ) &&
@@ -1594,8 +1606,8 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
( ( (idx + lag - 2) % 3 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "4(r, %d, %d, %d) ",
- type, (idx + lag - 2),
+ HDfprintf(stdout, "4(r, %d, %d, %d) ",
+ type, (idx + lag - 2),
(int)rename_to_main_addr);
/*** rename entry idx + lag -2 ***/
@@ -1604,7 +1616,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag - 3) >= 0 ) &&
( (idx + lag - 3) >= lower_bound ) &&
( (idx + lag - 3) <= local_max_index ) &&
@@ -1612,14 +1624,14 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
( ( (idx + lag - 3) % 5 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "5(p, %d, %d) ",
+ HDfprintf(stdout, "5(p, %d, %d) ",
type, (idx + lag - 3));
/*** protect entry idx + lag - 3 ***/
protect_entry2(file_ptr, type, (idx + lag - 3));
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag - 5) >= 0 ) &&
( (idx + lag - 5) >= lower_bound ) &&
( (idx + lag - 5) <= local_max_index ) &&
@@ -1627,7 +1639,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
( ( (idx + lag - 5) % 5 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "6(u, %d, %d) ",
+ HDfprintf(stdout, "6(u, %d, %d) ",
type, (idx + lag - 5));
@@ -1638,7 +1650,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
if ( do_mult_ro_protects )
{
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag - 5) >= 0 ) &&
( (idx + lag - 5) >= lower_bound ) &&
( (idx + lag - 5) < local_max_index ) &&
@@ -1646,14 +1658,14 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
( (idx + lag - 5) % 9 == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "7(p-ro, %d, %d) ", type,
+ HDfprintf(stdout, "7(p-ro, %d, %d) ", type,
(idx + lag - 5));
/*** protect ro entry idx + lag - 5 ***/
protect_entry_ro2(file_ptr, type, (idx + lag - 5));
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag - 6) >= 0 ) &&
( (idx + lag - 6) >= lower_bound ) &&
( (idx + lag - 6) < local_max_index ) &&
@@ -1661,14 +1673,14 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
( (idx + lag - 6) % 11 == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "8(p-ro, %d, %d) ", type,
+ HDfprintf(stdout, "8(p-ro, %d, %d) ", type,
(idx + lag - 6));
/*** protect ro entry idx + lag - 6 ***/
protect_entry_ro2(file_ptr, type, (idx + lag - 6));
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag - 7) >= 0 ) &&
( (idx + lag - 7) >= lower_bound ) &&
( (idx + lag - 7) < local_max_index ) &&
@@ -1676,14 +1688,14 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
( (idx + lag - 7) % 13 == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "9(p-ro, %d, %d) ", type,
+ HDfprintf(stdout, "9(p-ro, %d, %d) ", type,
(idx + lag - 7));
/*** protect ro entry idx + lag - 7 ***/
protect_entry_ro2(file_ptr, type, (idx + lag - 7));
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag - 7) >= 0 ) &&
( (idx + lag - 7) >= lower_bound ) &&
( (idx + lag - 7) < local_max_index ) &&
@@ -1691,7 +1703,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
( (idx + lag - 7) % 9 == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "10(u-ro, %d, %d) ", type,
+ HDfprintf(stdout, "10(u-ro, %d, %d) ", type,
(idx + lag - 7));
/*** unprotect ro entry idx + lag - 7 ***/
@@ -1699,7 +1711,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
FALSE, H5C2__NO_FLAGS_SET);
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag - 8) >= 0 ) &&
( (idx + lag - 8) >= lower_bound ) &&
( (idx + lag - 8) < local_max_index ) &&
@@ -1707,7 +1719,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
( (idx + lag - 8) % 11 == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "11(u-ro, %d, %d) ", type,
+ HDfprintf(stdout, "11(u-ro, %d, %d) ", type,
(idx + lag - 8));
/*** unprotect ro entry idx + lag - 8 ***/
@@ -1715,7 +1727,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
FALSE, H5C2__NO_FLAGS_SET);
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx + lag - 9) >= 0 ) &&
( (idx + lag - 9) >= lower_bound ) &&
( (idx + lag - 9) < local_max_index ) &&
@@ -1723,7 +1735,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
( (idx + lag - 9) % 13 == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "12(u-ro, %d, %d) ", type,
+ HDfprintf(stdout, "12(u-ro, %d, %d) ", type,
(idx + lag - 9));
/*** unprotect ro entry idx + lag - 9 ***/
@@ -1732,9 +1744,9 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
}
} /* if ( do_mult_ro_protects ) */
- if ( ( pass2 ) &&
- ( idx >= 0 ) &&
- ( idx >= lower_bound ) &&
+ if ( ( pass2 ) &&
+ ( idx >= 0 ) &&
+ ( idx >= lower_bound ) &&
( idx <= local_max_index ) &&
( idx <= upper_bound ) ) {
@@ -1745,7 +1757,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
protect_entry2(file_ptr, type, idx);
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag + 2) >= 0 ) &&
( (idx - lag + 2) >= lower_bound ) &&
( (idx - lag + 2) <= local_max_index ) &&
@@ -1753,7 +1765,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
( ( (idx - lag + 2) % 7 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "14(u, %d, %d) ",
+ HDfprintf(stdout, "14(u, %d, %d) ",
type, (idx - lag + 2));
/*** unprotect entry idx - lag + 2 ***/
@@ -1761,7 +1773,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
H5C2__NO_FLAGS_SET);
}
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag + 1) >= 0 ) &&
( (idx - lag + 1) >= lower_bound ) &&
( (idx - lag + 1) <= local_max_index ) &&
@@ -1769,7 +1781,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
( ( (idx - lag + 1) % 7 ) == 0 ) ) {
if ( verbose )
- HDfprintf(stdout, "15(p, %d, %d) ",
+ HDfprintf(stdout, "15(p, %d, %d) ",
type, (idx - lag + 1));
/*** protect entry idx - lag + 1 ***/
@@ -1779,7 +1791,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
if ( do_destroys ) {
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag) >= 0 ) &&
( (idx - lag) >= lower_bound ) &&
( ( idx - lag) <= local_max_index ) &&
@@ -1790,7 +1802,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
case 0: /* we just did an insert */
if ( verbose )
- HDfprintf(stdout, "16(u, %d, %d) ",
+ HDfprintf(stdout, "16(u, %d, %d) ",
type, (idx - lag));
/*** unprotect entry NC idx - lag ***/
@@ -1802,17 +1814,17 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
if ( (entries2[type])[idx-lag].is_dirty ) {
if ( verbose )
- HDfprintf(stdout, "17(u, %d, %d) ",
+ HDfprintf(stdout, "17(u, %d, %d) ",
type, (idx - lag));
/*** unprotect entry NC idx - lag ***/
unprotect_entry2(file_ptr, type, idx - lag,
- NO_CHANGE,
+ NO_CHANGE,
H5C2__NO_FLAGS_SET);
} else {
if ( verbose )
- HDfprintf(stdout, "18(u, %d, %d) ",
+ HDfprintf(stdout, "18(u, %d, %d) ",
type, (idx - lag));
/*** unprotect entry idx - lag ***/
@@ -1825,7 +1837,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
case 2: /* we just did an insrt */
if ( verbose )
- HDfprintf(stdout, "19(u-del, %d, %d) ",
+ HDfprintf(stdout, "19(u-del, %d, %d) ",
type, (idx - lag));
/*** unprotect delete idx - lag ***/
@@ -1837,17 +1849,17 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
if ( (entries2[type])[idx-lag].is_dirty ) {
if ( verbose )
- HDfprintf(stdout, "20(u-del, %d, %d) ",
+ HDfprintf(stdout, "20(u-del, %d, %d) ",
type, (idx - lag));
/*** unprotect delete idx - lag ***/
unprotect_entry2(file_ptr, type, idx - lag,
- NO_CHANGE,
+ NO_CHANGE,
H5C2__DELETED_FLAG);
} else {
if ( verbose )
- HDfprintf(stdout, "21(u-del, %d, %d) ",
+ HDfprintf(stdout, "21(u-del, %d, %d) ",
type, (idx - lag));
/*** unprotect delete idx - lag ***/
@@ -1865,14 +1877,14 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
} else {
- if ( ( pass2 ) &&
+ if ( ( pass2 ) &&
( (idx - lag) >= 0 ) &&
( (idx - lag) >= lower_bound ) &&
( ( idx - lag) <= local_max_index ) &&
( ( idx - lag) <= upper_bound ) ) {
if ( verbose )
- HDfprintf(stdout, "22(u, %d, %d) ",
+ HDfprintf(stdout, "22(u, %d, %d) ",
type, (idx - lag));
/*** unprotect idx - lag ***/
@@ -1888,7 +1900,7 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
} /* while ( ( pass2 ) && ( idx <= upper_bound ) ) */
- end_trans(file_ptr, cache_ptr, verbose, trans_num,
+ end_trans(file_ptr, cache_ptr, verbose, trans_num,
"jrnl_row_major_scan_forward inner loop");
if ( verbose )
@@ -1918,12 +1930,12 @@ jrnl_row_major_scan_forward2(H5F_t * file_ptr,
/*-------------------------------------------------------------------------
* Function: open_existing_file_for_journaling()
*
- * Purpose: If pass2 is true on entry, open the specified a HDF5 file
- * with journaling enabled and journal file with the specified
- * name. Return pointers to the cache data structure and file
+ * Purpose: If pass2 is true on entry, open the specified a HDF5 file
+ * with journaling enabled and journal file with the specified
+ * name. Return pointers to the cache data structure and file
* data structures, and verify that it contains the expected data.
*
- * On failure, set pass2 to FALSE, and set failure_mssg2
+ * On failure, set pass2 to FALSE, and set failure_mssg2
* to point to an appropriate failure message.
*
* Do nothing if pass2 is FALSE on entry.
@@ -1947,7 +1959,8 @@ open_existing_file_for_journaling(const char * hdf_file_name,
hid_t * file_id_ptr,
H5F_t ** file_ptr_ptr,
H5C2_t ** cache_ptr_ptr,
- hbool_t human_readable)
+ hbool_t human_readable,
+ hbool_t use_aio)
{
const char * fcn_name = "open_existing_file_for_journaling()";
hbool_t show_progress = FALSE;
@@ -1968,7 +1981,7 @@ open_existing_file_for_journaling(const char * hdf_file_name,
( file_ptr_ptr == NULL ) ||
( cache_ptr_ptr == NULL ) ) {
- failure_mssg2 =
+ failure_mssg2 =
"Bad param(s) on entry to open_existing_file_for_journaling().\n";
pass2 = FALSE;
}
@@ -1979,9 +1992,9 @@ open_existing_file_for_journaling(const char * hdf_file_name,
} else if ( verbose ) {
- HDfprintf(stdout, "%s: HDF file name = \"%s\".\n",
+ HDfprintf(stdout, "%s: HDF file name = \"%s\".\n",
fcn_name, hdf_file_name);
- HDfprintf(stdout, "%s: journal file name = \"%s\".\n",
+ HDfprintf(stdout, "%s: journal file name = \"%s\".\n",
fcn_name, journal_file_name);
}
}
@@ -2005,7 +2018,7 @@ open_existing_file_for_journaling(const char * hdf_file_name,
/* call H5Pset_libver_bounds() on the fapl_id */
if ( pass2 ) {
- if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST)
+ if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST)
< 0 ) {
pass2 = FALSE;
@@ -2035,7 +2048,7 @@ open_existing_file_for_journaling(const char * hdf_file_name,
jnl_config.journal_recovered = FALSE;
jnl_config.jbrb_buf_size = (8 * 1024);
jnl_config.jbrb_num_bufs = 2;
- jnl_config.jbrb_use_aio = FALSE;
+ jnl_config.jbrb_use_aio = use_aio;
jnl_config.jbrb_human_readable = human_readable;
}
@@ -2053,7 +2066,7 @@ open_existing_file_for_journaling(const char * hdf_file_name,
}
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
-
+
/**************************************/
/* open the file with the fapl above. */
/**************************************/
@@ -2086,20 +2099,20 @@ open_existing_file_for_journaling(const char * hdf_file_name,
/* At least within the context of the cache2 test code, there should be
* no need to allocate space for test entries since we are re-opening
- * the file, and any needed space allocation should have been done at
+ * the file, and any needed space allocation should have been done at
* file creation.
*/
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
- /* get a pointer to the files internal data structure and then
+ /* get a pointer to the files internal data structure and then
* to the cache structure
*/
if ( pass2 ) {
if ( file_ptr->shared->cache2 == NULL ) {
-
+
pass2 = FALSE;
failure_mssg2 = "can't get cache2 pointer(1).\n";
@@ -2119,7 +2132,7 @@ open_existing_file_for_journaling(const char * hdf_file_name,
*cache_ptr_ptr = cache_ptr;
}
- if ( show_progress )
+ if ( show_progress )
HDfprintf(stdout, "%s: cp = %d -- exiting.\n", fcn_name, cp++);
return;
@@ -2130,12 +2143,12 @@ open_existing_file_for_journaling(const char * hdf_file_name,
/*-------------------------------------------------------------------------
* Function: open_existing_file_without_journaling()
*
- * Purpose: If pass2 is true on entry, open the specified a HDF5 file
- * with journaling disabled. Return pointers to the cache
- * data structure and file data structures, and verify that
+ * Purpose: If pass2 is true on entry, open the specified a HDF5 file
+ * with journaling disabled. Return pointers to the cache
+ * data structure and file data structures, and verify that
* it contains the expected data.
*
- * On failure, set pass2 to FALSE, and set failure_mssg2
+ * On failure, set pass2 to FALSE, and set failure_mssg2
* to point to an appropriate failure message.
*
* Do nothing if pass2 is FALSE on entry.
@@ -2172,7 +2185,7 @@ open_existing_file_without_journaling(const char * hdf_file_name,
( file_ptr_ptr == NULL ) ||
( cache_ptr_ptr == NULL ) ) {
- failure_mssg2 =
+ failure_mssg2 =
"Bad param(s) on entry to open_existing_file_without_journaling().\n";
pass2 = FALSE;
@@ -2180,7 +2193,7 @@ open_existing_file_without_journaling(const char * hdf_file_name,
if ( verbose ) {
- HDfprintf(stdout, "%s: HDF file name = \"%s\".\n",
+ HDfprintf(stdout, "%s: HDF file name = \"%s\".\n",
fcn_name, hdf_file_name);
}
}
@@ -2205,7 +2218,7 @@ open_existing_file_without_journaling(const char * hdf_file_name,
/* call H5Pset_libver_bounds() on the fapl_id */
if ( pass2 ) {
- if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST,
+ if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST,
H5F_LIBVER_LATEST) < 0 ) {
pass2 = FALSE;
@@ -2248,20 +2261,20 @@ open_existing_file_without_journaling(const char * hdf_file_name,
/* At least within the context of the cache2 test code, there should be
* no need to allocate space for test entries since we are re-opening
- * the file, and any needed space allocation should have been done at
+ * the file, and any needed space allocation should have been done at
* file creation.
*/
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
- /* get a pointer to the files internal data structure and then
+ /* get a pointer to the files internal data structure and then
* to the cache structure
*/
if ( pass2 ) {
if ( file_ptr->shared->cache2 == NULL ) {
-
+
pass2 = FALSE;
failure_mssg2 = "can't get cache2 pointer(1).\n";
@@ -2281,7 +2294,7 @@ open_existing_file_without_journaling(const char * hdf_file_name,
*cache_ptr_ptr = cache_ptr;
}
- if ( show_progress )
+ if ( show_progress )
HDfprintf(stdout, "%s: cp = %d -- exiting.\n", fcn_name, cp++);
return;
@@ -2292,12 +2305,12 @@ open_existing_file_without_journaling(const char * hdf_file_name,
/*-------------------------------------------------------------------------
* Function: setup_cache_for_journaling()
*
- * Purpose: If pass2 is true on entry, create a HDF5 file with
- * journaling enabled and journal file with the specified name.
- * Return pointers to the cache data structure and file data
+ * Purpose: If pass2 is true on entry, create a HDF5 file with
+ * journaling enabled and journal file with the specified name.
+ * Return pointers to the cache data structure and file data
* structures. and verify that it contains the expected data.
*
- * On failure, set pass2 to FALSE, and set failure_mssg2
+ * On failure, set pass2 to FALSE, and set failure_mssg2
* to point to an appropriate failure message.
*
* Do nothing if pass2 is FALSE on entry.
@@ -2309,11 +2322,16 @@ open_existing_file_without_journaling(const char * hdf_file_name,
*
* Modifications:
*
- * Added the human_readable parameter and associated
- * code to allow selection of either binary or human
+ * Added the human_readable parameter and associated
+ * code to allow selection of either binary or human
* readable journal file.
* JRM -- 5/8/09
*
+ * Added the use_aio parameter and associated code to allow
+ * selection of either AIO or SIO for journal writes.
+ *
+ * JRM -- 1/22/10
+ *
*-------------------------------------------------------------------------
*/
@@ -2324,6 +2342,7 @@ setup_cache_for_journaling(const char * hdf_file_name,
H5F_t ** file_ptr_ptr,
H5C2_t ** cache_ptr_ptr,
hbool_t human_readable,
+ hbool_t use_aio,
#if USE_CORE_DRIVER
hbool_t use_core_driver_if_avail)
#else /* USE_CORE_DRIVER */
@@ -2393,7 +2412,7 @@ setup_cache_for_journaling(const char * hdf_file_name,
( file_ptr_ptr == NULL ) ||
( cache_ptr_ptr == NULL ) ) {
- failure_mssg2 =
+ failure_mssg2 =
"Bad param(s) on entry to setup_cache_for_journaling().\n";
pass2 = FALSE;
}
@@ -2408,9 +2427,9 @@ setup_cache_for_journaling(const char * hdf_file_name,
if ( verbose ) {
- HDfprintf(stdout, "%s: HDF file name = \"%s\".\n",
+ HDfprintf(stdout, "%s: HDF file name = \"%s\".\n",
fcn_name, hdf_file_name);
- HDfprintf(stdout, "%s: journal file name = \"%s\".\n",
+ HDfprintf(stdout, "%s: journal file name = \"%s\".\n",
fcn_name, journal_file_name);
}
}
@@ -2435,7 +2454,7 @@ setup_cache_for_journaling(const char * hdf_file_name,
/* call H5Pset_libver_bounds() on the fapl_id */
if ( pass2 ) {
- if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST,
+ if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST,
H5F_LIBVER_LATEST) < 0 ) {
pass2 = FALSE;
@@ -2461,6 +2480,7 @@ setup_cache_for_journaling(const char * hdf_file_name,
if ( pass2 ) {
jnl_config.jbrb_human_readable = human_readable;
+ jnl_config.jbrb_use_aio = use_aio;
result = H5Pset_jnl_config(fapl_id, &jnl_config);
@@ -2486,7 +2506,7 @@ setup_cache_for_journaling(const char * hdf_file_name,
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
-
+
/**************************************/
/* Create a file with the fapl above. */
/**************************************/
@@ -2543,7 +2563,7 @@ setup_cache_for_journaling(const char * hdf_file_name,
failure_mssg2 = "actual_base_addr > BASE_ADDR";
if ( verbose ) {
- HDfprintf(stdout, "%s: actual_base_addr > BASE_ADDR.\n",
+ HDfprintf(stdout, "%s: actual_base_addr > BASE_ADDR.\n",
fcn_name);
}
}
@@ -2551,13 +2571,13 @@ setup_cache_for_journaling(const char * hdf_file_name,
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
- /* get a pointer to the files internal data structure and then
+ /* get a pointer to the files internal data structure and then
* to the cache structure
*/
if ( pass2 ) {
if ( file_ptr->shared->cache2 == NULL ) {
-
+
pass2 = FALSE;
failure_mssg2 = "can't get cache2 pointer(1).\n";
@@ -2592,7 +2612,7 @@ setup_cache_for_journaling(const char * hdf_file_name,
*cache_ptr_ptr = cache_ptr;
}
- if ( show_progress )
+ if ( show_progress )
HDfprintf(stdout, "%s: cp = %d -- exiting.\n", fcn_name, cp++);
return;
@@ -2620,12 +2640,12 @@ static void
takedown_cache_after_journaling(hid_t file_id,
const char * filename,
const char * journal_filename,
- hbool_t
+ hbool_t
use_core_driver_if_avail)
{
hbool_t verbose = FALSE;
int error;
-
+
if ( file_id >= 0 ) {
if ( H5Fclose(file_id) < 0 ) {
@@ -2639,8 +2659,8 @@ takedown_cache_after_journaling(hid_t file_id,
( ( error = HDremove(filename) ) != 0 ) ) {
if ( verbose ) {
- HDfprintf(stdout,
- "HDremove(\"%s\") failed, returned %d, errno = %d = %s.\n",
+ HDfprintf(stdout,
+ "HDremove(\"%s\") failed, returned %d, errno = %d = %s.\n",
filename, error, errno, strerror(errno));
}
@@ -2662,10 +2682,10 @@ takedown_cache_after_journaling(hid_t file_id,
/*-------------------------------------------------------------------------
* Function: verify_journal_contents()
*
- * Purpose: If pass2 is true on entry, verify that the contents of the
- * journal file matches that of the expected file. If
+ * Purpose: If pass2 is true on entry, verify that the contents of the
+ * journal file matches that of the expected file. If
* differences are detected, or if any other error is detected,
- * set pass2 to FALSE and set failure_mssg2 to point to an
+ * set pass2 to FALSE and set failure_mssg2 to point to an
* appropriate error message.
*
* Do nothing if pass2 is FALSE on entry.
@@ -2678,7 +2698,7 @@ takedown_cache_after_journaling(hid_t file_id,
* Modifications:
*
* JRM -- 6/10/09
- * Updated function to deal with binary as well as human
+ * Updated function to deal with binary as well as human
* readable journal files.
*
*-------------------------------------------------------------------------
@@ -2750,16 +2770,16 @@ verify_journal_contents(const char * journal_file_path_ptr,
pass2 = FALSE;
} else {
-
+
journal_len = (size_t)(buf.st_size);
if ( verbose ) {
- HDfprintf(stdout, "%s: journal_len = %d.\n",
+ HDfprintf(stdout, "%s: journal_len = %d.\n",
fcn_name, (int)journal_len);
}
}
- }
+ }
}
/* get the actual length of the expected file */
@@ -2783,22 +2803,22 @@ verify_journal_contents(const char * journal_file_path_ptr,
pass2 = FALSE;
} else {
-
+
expected_len = (size_t)(buf.st_size);
if ( verbose ) {
- HDfprintf(stdout, "%s: expected_len = %d.\n",
+ HDfprintf(stdout, "%s: expected_len = %d.\n",
fcn_name, (int)expected_len);
}
}
- }
+ }
}
/* open the journal file */
if ( pass2 ) {
- if ( (journal_file_fd = HDopen(journal_file_path_ptr, O_RDONLY, 0777))
+ if ( (journal_file_fd = HDopen(journal_file_path_ptr, O_RDONLY, 0777))
== -1 ) {
if ( verbose ) {
@@ -2814,7 +2834,7 @@ verify_journal_contents(const char * journal_file_path_ptr,
/* open the expected file */
if ( pass2 ) {
- if ( (expected_file_fd = HDopen(expected_file_path_ptr, O_RDONLY, 0777))
+ if ( (expected_file_fd = HDopen(expected_file_path_ptr, O_RDONLY, 0777))
== -1 ) {
if ( verbose ) {
@@ -2828,12 +2848,12 @@ verify_journal_contents(const char * journal_file_path_ptr,
}
/* The first lines of the journal and expected files will usually differ
- * in magic number and creation date. We could look at everything else
- * on the line, but for now we will just skip past it, and compute the
+ * in magic number and creation date. We could look at everything else
+ * on the line, but for now we will just skip past it, and compute the
* length of the remainder of the journal and expected files as we do so.
*
- * Do this by reading the file one character at a time until we hit a
- * newline. This is very inefficient, but this is test code, and the
+ * Do this by reading the file one character at a time until we hit a
+ * newline. This is very inefficient, but this is test code, and the
* first line can't be very long.
*/
if ( pass2 ) {
@@ -2841,7 +2861,7 @@ verify_journal_contents(const char * journal_file_path_ptr,
first_line_len = 1;
read_result = HDread(journal_file_fd, &ch, 1);
- while ( ( ch != '\n' ) &&
+ while ( ( ch != '\n' ) &&
( first_line_len < 256 ) &&
( read_result == 1 ) ) {
@@ -2850,7 +2870,7 @@ verify_journal_contents(const char * journal_file_path_ptr,
}
if ( ch != '\n' ) {
-
+
failure_mssg2 = "error skipping first line of journal file.";
pass2 = FALSE;
@@ -2870,7 +2890,7 @@ verify_journal_contents(const char * journal_file_path_ptr,
first_line_len = 1;
read_result = HDread(expected_file_fd, &ch, 1);
- while ( ( ch != '\n' ) &&
+ while ( ( ch != '\n' ) &&
( first_line_len < 256 ) &&
( read_result == 1 ) ) {
@@ -2879,7 +2899,7 @@ verify_journal_contents(const char * journal_file_path_ptr,
}
if ( ch != '\n' ) {
-
+
failure_mssg2 = "error skipping first line of expected file.";
pass2 = FALSE;
@@ -2903,12 +2923,12 @@ verify_journal_contents(const char * journal_file_path_ptr,
}
}
- /* If we get this far without an error, the lengths of the actual
+ /* If we get this far without an error, the lengths of the actual
* and expected files (after skipping the first line) are identical.
* Thus we have to go and compare the actual data.
*/
while ( ( pass2 ) &&
- ( journal_remainder_len > 0 ) )
+ ( journal_remainder_len > 0 ) )
{
HDassert( journal_remainder_len == expected_remainder_len );
@@ -2931,7 +2951,7 @@ verify_journal_contents(const char * journal_file_path_ptr,
if ( verbose ) {
- HDfprintf(stdout,
+ HDfprintf(stdout,
"%s: HDread(j) failed. result = %d, errno = %d.\n",
fcn_name, (int)read_result, errno);
}
@@ -2949,7 +2969,7 @@ verify_journal_contents(const char * journal_file_path_ptr,
if ( verbose ) {
- HDfprintf(stdout,
+ HDfprintf(stdout,
"%s: HDread(e) failed. result = %d, errno = %d.\n",
fcn_name, (int)read_result, errno);
}
@@ -2968,9 +2988,9 @@ verify_journal_contents(const char * journal_file_path_ptr,
if ( verbose ) {
- HDfprintf(stdout,
+ HDfprintf(stdout,
"expected_buf = \"%s\"\n", expected_buf);
- HDfprintf(stdout,
+ HDfprintf(stdout,
"journal_buf = \"%s\"\n", journal_buf);
}
@@ -3035,8 +3055,8 @@ verify_journal_contents(const char * journal_file_path_ptr,
*
* Purpose: If pass2 is true on entry, stat the target journal file,
* and verify that it does not exist. If it does, set
- * pass2 to FALSE, and set failure_mssg2 to point to an
- * appropriate failure message. Similarly, if any errors
+ * pass2 to FALSE, and set failure_mssg2 to point to an
+ * appropriate failure message. Similarly, if any errors
* are detected in this process, set pass2 to FALSE and set
* failure_mssg2 to point to an appropriate error message.
*
@@ -3085,14 +3105,14 @@ verify_journal_deleted(const char * journal_file_path_ptr)
if ( verbose ) {
- HDfprintf(stdout,
+ HDfprintf(stdout,
"%s: HDstat() failed with unexpected errno = %d.\n",
fcn_name, errno);
}
failure_mssg2 = "journal file not deleted(2).";
pass2 = FALSE;
- }
+ }
}
return;
@@ -3105,8 +3125,8 @@ verify_journal_deleted(const char * journal_file_path_ptr)
*
* Purpose: If pass2 is true on entry, stat the target journal file,
* and verify that it has length zero. If it is not, set
- * pass2 to FALSE, and set failure_mssg2 to point to an
- * appropriate failure message. Similarly, if any errors
+ * pass2 to FALSE, and set failure_mssg2 to point to an
+ * appropriate failure message. Similarly, if any errors
* are detected in this process, set pass2 to FALSE and set
* failure_mssg2 to point to an appropriate error message.
*
@@ -3157,7 +3177,7 @@ verify_journal_empty(const char * journal_file_path_ptr)
failure_mssg2 = "Empty journal file expected.";
pass2 = FALSE;
}
- }
+ }
}
return;
@@ -3170,31 +3190,31 @@ verify_journal_empty(const char * journal_file_path_ptr)
/*-------------------------------------------------------------------------
* Function: mdj_smoke_check_00()
*
- * Purpose: Run a basic smoke check on the metadata journaling
+ * Purpose: Run a basic smoke check on the metadata journaling
* facilities of the metadata cache. Proceed as follows:
*
- * 1) Create a file with journaling enabled. Verify that
+ * 1) Create a file with journaling enabled. Verify that
* journal file is created.
*
- * 2) Using the test entries, simulate a selection of
- * transactions, which exercise the full range of
- * metadata cache API which can generate journal entries.
- * Verify that these transactions are reflected correctly
+ * 2) Using the test entries, simulate a selection of
+ * transactions, which exercise the full range of
+ * metadata cache API which can generate journal entries.
+ * Verify that these transactions are reflected correctly
* in the journal.
*
* 3) Close the hdf5 file, and verify that the journal file
- * is deleted. Re-open the file with journaling, and
- * do a transaction or two just to verify that the
+ * is deleted. Re-open the file with journaling, and
+ * do a transaction or two just to verify that the
* journaling is working.
*
* 4) Close the file, and verify that the journal is deleted.
*
- * 5) Re-open the file with journaling disabled. Do a
+ * 5) Re-open the file with journaling disabled. Do a
* transaction or two, and verify that the transactions
* took place, and that there is no journal file.
*
* 6) Enable journaling on the open file. Do a transaction
- * or two to verify that journaling is working.
+ * or two to verify that journaling is working.
*
* 7) Disable journaling on the open file. Verify that the
* journal file has been deleted.
@@ -3206,18 +3226,22 @@ verify_journal_empty(const char * journal_file_path_ptr)
* Programmer: John Mainzer
* 3/11/08
*
- * Changes: Modified function to run using either a human readable
+ * Changes: Modified function to run using either a human readable
* or binary journal file.
* JRM -- 5/8/9
*
+ * Modified function to run using either aio or sio.
+ * JRM -- 1/22/10
+ *
*-------------------------------------------------------------------------
*/
static void
-mdj_smoke_check_00(hbool_t human_readable)
+mdj_smoke_check_00(hbool_t human_readable,
+ hbool_t use_aio)
{
const char * fcn_name = "mdj_smoke_check_00()";
- const char * human_readable_testfiles[] =
+ const char * human_readable_testfiles[] =
{
"testfiles/cache2_journal_sc00_000.jnl",
"testfiles/cache2_journal_sc00_001.jnl",
@@ -3240,7 +3264,7 @@ mdj_smoke_check_00(hbool_t human_readable)
"testfiles/cache2_journal_sc00_018.jnl",
NULL
};
- const char * binary_testfiles[] =
+ const char * binary_testfiles[] =
{
"testfiles/cache2_journal_bsc00_000.jnl",
"testfiles/cache2_journal_bsc00_001.jnl",
@@ -3276,20 +3300,35 @@ mdj_smoke_check_00(hbool_t human_readable)
H5F_t * file_ptr = NULL;
H5C2_t * cache_ptr = NULL;
H5AC2_jnl_config_t jnl_config;
-
+
if ( human_readable ) {
testfiles = human_readable_testfiles;
/* set update_architypes to TRUE to generate new architype files */
update_architypes = FALSE;
- TESTING("human readable mdj smoke check 00 -- general coverage");
+ if ( use_aio ) {
+
+ TESTING("human readable aio mdj smoke check 00 -- general coverage");
+
+ } else {
+
+ TESTING("human readable sio mdj smoke check 00 -- general coverage");
+ }
} else {
testfiles = binary_testfiles;
/* set update_architypes to TRUE to generate new architype files */
update_architypes = TRUE;
- TESTING("binary mdj smoke check 00 -- general coverage");
+
+ if ( use_aio ) {
+
+ TESTING("binary aio mdj smoke check 00 -- general coverage");
+
+ } else {
+
+ TESTING("binary sio mdj smoke check 00 -- general coverage");
+ }
}
pass2 = TRUE;
@@ -3309,23 +3348,23 @@ mdj_smoke_check_00(hbool_t human_readable)
}
}
- if ( show_progress )
+ if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
- if ( verbose ) {
- HDfprintf(stdout, "%s: filename = \"%s\".\n", fcn_name, filename);
+ if ( verbose ) {
+ HDfprintf(stdout, "%s: filename = \"%s\".\n", fcn_name, filename);
}
/* setup the journal file name */
if ( pass2 ) {
- if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename,
+ if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename,
sizeof(journal_filename)) == NULL ) {
pass2 = FALSE;
failure_mssg2 = "h5_fixname() failed (2).\n";
}
- else if ( HDstrlen(journal_filename) >=
+ else if ( HDstrlen(journal_filename) >=
H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) {
pass2 = FALSE;
@@ -3336,19 +3375,20 @@ mdj_smoke_check_00(hbool_t human_readable)
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
- if ( verbose ) {
- HDfprintf(stdout, "%s: journal filename = \"%s\".\n",
- fcn_name, journal_filename);
+ if ( verbose ) {
+ HDfprintf(stdout, "%s: journal filename = \"%s\".\n",
+ fcn_name, journal_filename);
}
/* clean out any existing journal file */
HDremove(journal_filename);
setup_cache_for_journaling(filename, journal_filename, &file_id,
- &file_ptr, &cache_ptr, human_readable, FALSE);
+ &file_ptr, &cache_ptr, human_readable,
+ use_aio, FALSE);
if ( show_progress )
- HDfprintf(stdout, "%s:%d *cp = %d.\n", fcn_name, pass2, cp++);
-
+ HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
+
/********************************************************************/
/* 2) Using the test entries, simulate a selection of transactions, */
@@ -3361,7 +3401,7 @@ mdj_smoke_check_00(hbool_t human_readable)
begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.0");
- insert_entry2(file_ptr, 0, 1, FALSE, H5C2__NO_FLAGS_SET);
+ insert_entry2(file_ptr, 0, 1, FALSE, H5C2__NO_FLAGS_SET);
protect_entry2(file_ptr, 0, 0);
@@ -3423,7 +3463,7 @@ mdj_smoke_check_00(hbool_t human_readable)
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
- /* c) Verify that the most recently dirtied entry get to the head of
+ /* c) Verify that the most recently dirtied entry get to the head of
* the transaction list (and thus appears as the last entry in the
* transaction).
*/
@@ -3455,7 +3495,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[1]);
}
-
+
if ( file_exists(testfiles[1]) ) {
verify_journal_contents(journal_filename, testfiles[1], human_readable);
@@ -3503,7 +3543,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[2]);
}
-
+
if ( file_exists(testfiles[2]) ) {
verify_journal_contents(journal_filename, testfiles[2], human_readable);
@@ -3541,7 +3581,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[3]);
}
-
+
if ( file_exists(testfiles[3]) ) {
verify_journal_contents(journal_filename, testfiles[3], human_readable);
@@ -3589,7 +3629,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[4]);
}
-
+
if ( file_exists(testfiles[4]) ) {
verify_journal_contents(journal_filename, testfiles[4], human_readable);
@@ -3604,7 +3644,7 @@ mdj_smoke_check_00(hbool_t human_readable)
/* e-2) ... then use the H5C2_mark_pinned_or_protected_entry_dirty()
- * call to mark a variety of protected, pinned, and pinned and
+ * call to mark a variety of protected, pinned, and pinned and
* protected entries dirty. Also rename some pinned entries.
*/
@@ -3642,7 +3682,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[5]);
}
-
+
if ( file_exists(testfiles[5]) ) {
verify_journal_contents(journal_filename, testfiles[5], human_readable);
@@ -3681,7 +3721,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[6]);
}
-
+
if ( file_exists(testfiles[6]) ) {
verify_journal_contents(journal_filename, testfiles[6], human_readable);
@@ -3697,7 +3737,7 @@ mdj_smoke_check_00(hbool_t human_readable)
/* f-1) Pin a bunch more entries -- make them variable size, as we need
- * to test resizing. In passing, pin some of the entries using
+ * to test resizing. In passing, pin some of the entries using
* the H5C2_pin_ptrotected_entry() call.
*/
@@ -3732,7 +3772,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[7]);
}
-
+
if ( file_exists(testfiles[7]) ) {
verify_journal_contents(journal_filename, testfiles[7], human_readable);
@@ -3747,8 +3787,8 @@ mdj_smoke_check_00(hbool_t human_readable)
- /* f-2) Now resize a selection of pinned and unpinned entries via
- * protect/unprotect pairs, H5C2_resize_pinned_entry() and
+ /* f-2) Now resize a selection of pinned and unpinned entries via
+ * protect/unprotect pairs, H5C2_resize_pinned_entry() and
* H5C2_mark_pinned_entry_dirty().
*/
@@ -3775,10 +3815,10 @@ mdj_smoke_check_00(hbool_t human_readable)
H5C2__SIZE_CHANGED_FLAG|H5C2__DIRTIED_FLAG,
((VARIABLE_ENTRY_SIZE / 16) * 12));
- resize_pinned_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 4,
+ resize_pinned_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 4,
((VARIABLE_ENTRY_SIZE / 16) * 11));
- resize_pinned_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 5,
+ resize_pinned_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 5,
((VARIABLE_ENTRY_SIZE / 16) * 10));
mark_pinned_entry_dirty2(file_ptr, VARIABLE_ENTRY_TYPE, 6, TRUE,
@@ -3795,7 +3835,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[8]);
}
-
+
if ( file_exists(testfiles[8]) ) {
verify_journal_contents(journal_filename, testfiles[8], human_readable);
@@ -3808,7 +3848,7 @@ mdj_smoke_check_00(hbool_t human_readable)
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
-
+
/* f-3) Now put all the sizes back, and also rename all the entries. */
@@ -3818,7 +3858,7 @@ mdj_smoke_check_00(hbool_t human_readable)
rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 0, FALSE);
protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 0);
unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 0,
- H5C2__SIZE_CHANGED_FLAG,
+ H5C2__SIZE_CHANGED_FLAG,
VARIABLE_ENTRY_SIZE);
rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 1, FALSE);
@@ -3846,7 +3886,7 @@ mdj_smoke_check_00(hbool_t human_readable)
resize_pinned_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 5, VARIABLE_ENTRY_SIZE);
rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 6, FALSE);
- mark_pinned_entry_dirty2(file_ptr, VARIABLE_ENTRY_TYPE, 6, TRUE,
+ mark_pinned_entry_dirty2(file_ptr, VARIABLE_ENTRY_TYPE, 6, TRUE,
VARIABLE_ENTRY_SIZE);
rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 7, FALSE);
@@ -3861,7 +3901,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[9]);
}
-
+
if ( file_exists(testfiles[9]) ) {
verify_journal_contents(journal_filename, testfiles[9], human_readable);
@@ -3873,9 +3913,9 @@ mdj_smoke_check_00(hbool_t human_readable)
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
-
-
-
+
+
+
/* f-4) Finally, rename all the entries back to their original locations,
* and unpin all the pinned entries.
*/
@@ -3896,7 +3936,7 @@ mdj_smoke_check_00(hbool_t human_readable)
rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 2, TRUE);
protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 2);
unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 2,
- H5C2__SIZE_CHANGED_FLAG|H5C2__UNPIN_ENTRY_FLAG,
+ H5C2__SIZE_CHANGED_FLAG|H5C2__UNPIN_ENTRY_FLAG,
VARIABLE_ENTRY_SIZE);
rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 3, TRUE);
@@ -3914,7 +3954,7 @@ mdj_smoke_check_00(hbool_t human_readable)
unpin_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 5);
rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 6, TRUE);
- mark_pinned_entry_dirty2(file_ptr, VARIABLE_ENTRY_TYPE, 6, TRUE,
+ mark_pinned_entry_dirty2(file_ptr, VARIABLE_ENTRY_TYPE, 6, TRUE,
VARIABLE_ENTRY_SIZE);
unpin_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 6);
@@ -3931,7 +3971,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[10]);
}
-
+
if ( file_exists(testfiles[10]) ) {
verify_journal_contents(journal_filename, testfiles[10], human_readable);
@@ -3950,9 +3990,9 @@ mdj_smoke_check_00(hbool_t human_readable)
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
-
-
-
+
+
+
/* g) verify that the journaling code handles a cascade of changes
* caused when the serialization of an entry causes dirties, resizes,
* and/or resizes of other entries.
@@ -3986,7 +4026,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[11]);
}
-
+
if ( file_exists(testfiles[11]) ) {
verify_journal_contents(journal_filename, testfiles[11], human_readable);
@@ -4025,7 +4065,7 @@ mdj_smoke_check_00(hbool_t human_readable)
*
*/
- add_flush_op2(MICRO_ENTRY_TYPE, 20,
+ add_flush_op2(MICRO_ENTRY_TYPE, 20,
FLUSH_OP__DIRTY, MICRO_ENTRY_TYPE, 30, FALSE, 0);
@@ -4070,7 +4110,7 @@ mdj_smoke_check_00(hbool_t human_readable)
/* g-3) Start with a simple check -- dirty (MICRO_ENTRY_TYPE, 20),
- * which should also dirty (MICRO_ENTRY_TYPE, 30) when
+ * which should also dirty (MICRO_ENTRY_TYPE, 30) when
* (MICRO_ENTRY_TYPE, 20) is serialized at transaction close.
*/
@@ -4087,7 +4127,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[12]);
}
-
+
if ( file_exists(testfiles[12]) ) {
verify_journal_contents(journal_filename, testfiles[12], human_readable);
@@ -4098,8 +4138,8 @@ mdj_smoke_check_00(hbool_t human_readable)
}
- /* g-4) Now dirty (MICRO_ENTRY_TYPE, 24), which dirties
- * (MICRO_ENTRY_TYPE, 21), which dirties, resizes, and
+ /* g-4) Now dirty (MICRO_ENTRY_TYPE, 24), which dirties
+ * (MICRO_ENTRY_TYPE, 21), which dirties, resizes, and
* renames (VARIABLE_ENTRY_TYPE, 10) and (VARIABLE_ENTRY_TYPE, 13)
*/
@@ -4116,7 +4156,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[13]);
}
-
+
if ( file_exists(testfiles[13]) ) {
verify_journal_contents(journal_filename, testfiles[13], human_readable);
@@ -4127,9 +4167,9 @@ mdj_smoke_check_00(hbool_t human_readable)
}
- /* g-4) Now dirty (MICRO_ENTRY_TYPE, 25), which dirties
- * (MICRO_ENTRY_TYPE, 22) and (MICRO_ENTRY_TYPE, 23), which
- * in turn resize (VARIABLE_ENTRY_TYPE, 11) and
+ /* g-4) Now dirty (MICRO_ENTRY_TYPE, 25), which dirties
+ * (MICRO_ENTRY_TYPE, 22) and (MICRO_ENTRY_TYPE, 23), which
+ * in turn resize (VARIABLE_ENTRY_TYPE, 11) and
* (VARIABLE_ENTRY_TYPE, 12), and rename (VARIABLE_ENTRY_TYPE, 10)
* and (VARIABLE_ENTRY_TYPE, 13) back to their original locations.
*/
@@ -4147,7 +4187,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[14]);
}
-
+
if ( file_exists(testfiles[14]) ) {
verify_journal_contents(journal_filename, testfiles[14], human_readable);
@@ -4163,7 +4203,7 @@ mdj_smoke_check_00(hbool_t human_readable)
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
-
+
/* h) Dirty an entry, and then expunge it. Entry should not appear
@@ -4171,7 +4211,7 @@ mdj_smoke_check_00(hbool_t human_readable)
* entry in the transaction, and a second time with other entries
* involved.
*
- * Note that no journal file will be written until the first
+ * Note that no journal file will be written until the first
* entry, so start with a transaction that generates some data.
*/
@@ -4201,7 +4241,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[15]);
}
-
+
if ( file_exists(testfiles[15]) ) {
verify_journal_contents(journal_filename, testfiles[15], human_readable);
@@ -4213,7 +4253,7 @@ mdj_smoke_check_00(hbool_t human_readable)
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
-
+
begin_trans(cache_ptr, verbose, (uint64_t)3, "transaction 3.4");
@@ -4232,7 +4272,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[16]);
}
-
+
if ( file_exists(testfiles[16]) ) {
verify_journal_contents(journal_filename, testfiles[16], human_readable);
@@ -4281,7 +4321,8 @@ mdj_smoke_check_00(hbool_t human_readable)
/* c) Re-open the hdf5 file. */
open_existing_file_for_journaling(filename, journal_filename, &file_id,
- &file_ptr, &cache_ptr, human_readable);
+ &file_ptr, &cache_ptr, human_readable,
+ use_aio);
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
@@ -4291,7 +4332,7 @@ mdj_smoke_check_00(hbool_t human_readable)
begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.5");
- insert_entry2(file_ptr, 0, 1, FALSE, H5C2__NO_FLAGS_SET);
+ insert_entry2(file_ptr, 0, 1, FALSE, H5C2__NO_FLAGS_SET);
protect_entry2(file_ptr, 0, 0);
unprotect_entry2(file_ptr, 0, 0, TRUE, H5C2__NO_FLAGS_SET);
@@ -4303,7 +4344,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[17]);
}
-
+
if ( file_exists(testfiles[17]) ) {
verify_journal_contents(journal_filename, testfiles[17], human_readable);
@@ -4356,23 +4397,23 @@ mdj_smoke_check_00(hbool_t human_readable)
/* re-open the file without journaling enabled */
- open_existing_file_without_journaling(filename, &file_id,
+ open_existing_file_without_journaling(filename, &file_id,
&file_ptr, &cache_ptr);
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
- /* do a transaction to verify that journaling is disabled.
+ /* do a transaction to verify that journaling is disabled.
*
- * Note that we will only get a transaction number of zero if
+ * Note that we will only get a transaction number of zero if
* journaling is disabled -- thus the following begin/end trans
* calls should fail if journaling is enabled.
*/
begin_trans(cache_ptr, verbose, (uint64_t)0, "transaction 1.6");
- insert_entry2(file_ptr, 0, 10, FALSE, H5C2__NO_FLAGS_SET);
+ insert_entry2(file_ptr, 0, 10, FALSE, H5C2__NO_FLAGS_SET);
protect_entry2(file_ptr, 0, 0);
unprotect_entry2(file_ptr, 0, 0, TRUE, H5C2__NO_FLAGS_SET);
@@ -4400,7 +4441,7 @@ mdj_smoke_check_00(hbool_t human_readable)
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
-
+
/************************************************************/
/* 6) Enable journaling on the open file. Do a transaction */
/* or two to verify that journaling is working. */
@@ -4452,7 +4493,7 @@ mdj_smoke_check_00(hbool_t human_readable)
begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.7");
- insert_entry2(file_ptr, 0, 20, FALSE, H5C2__NO_FLAGS_SET);
+ insert_entry2(file_ptr, 0, 20, FALSE, H5C2__NO_FLAGS_SET);
protect_entry2(file_ptr, 0, 0);
unprotect_entry2(file_ptr, 0, 0, TRUE, H5C2__NO_FLAGS_SET);
@@ -4464,7 +4505,7 @@ mdj_smoke_check_00(hbool_t human_readable)
copy_file(journal_filename, testfiles[18]);
}
-
+
if ( file_exists(testfiles[18]) ) {
verify_journal_contents(journal_filename, testfiles[18], human_readable);
@@ -4479,7 +4520,7 @@ mdj_smoke_check_00(hbool_t human_readable)
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
-
+
/************************************************************/
/* 7) Disable journaling on the open file. Verify that the */
/* journal file has been deleted. */
@@ -4507,11 +4548,11 @@ mdj_smoke_check_00(hbool_t human_readable)
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
-
+
/*********************************/
/* 8) Close and delete the file. */
/*********************************/
-
+
if ( pass2 ) {
if ( H5Fclose(file_id) < 0 ) {
@@ -4522,23 +4563,23 @@ mdj_smoke_check_00(hbool_t human_readable)
}
}
- HDremove(journal_filename);
+ HDremove(filename);
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
- if ( pass2 ) {
-
- PASSED();
+ if ( pass2 ) {
+
+ PASSED();
if ( testfile_missing ) {
- puts(" WARNING: One or more missing test files.");
+ puts(" WARNING: One or more missing test files.");
fflush(stdout);
}
- } else {
-
- H5_FAILED();
+ } else {
+
+ H5_FAILED();
}
if ( ! pass2 ) {
@@ -4567,18 +4608,22 @@ mdj_smoke_check_00(hbool_t human_readable)
* Programmer: John Mainzer
* 5/19/08
*
- * Changes: Modified function to run using either a human readable
+ * Changes: Modified function to run using either a human readable
* or binary journal file.
* JRM -- 5/13/09
*
+ * Modified function to run using either aio or sio.
+ * JRM -- 1/22/10
+ *
*-------------------------------------------------------------------------
*/
static void
-mdj_smoke_check_01(hbool_t human_readable)
+mdj_smoke_check_01(hbool_t human_readable,
+ hbool_t use_aio)
{
const char * fcn_name = "mdj_smoke_check_01()";
- const char * human_readable_testfiles[] =
+ const char * human_readable_testfiles[] =
{
"testfiles/cache2_journal_sc01_000.jnl",
"testfiles/cache2_journal_sc01_001.jnl",
@@ -4587,7 +4632,7 @@ mdj_smoke_check_01(hbool_t human_readable)
"testfiles/cache2_journal_sc01_004.jnl",
NULL
};
- const char * binary_testfiles[] =
+ const char * binary_testfiles[] =
{
"testfiles/cache2_journal_bsc01_000.jnl",
"testfiles/cache2_journal_bsc01_001.jnl",
@@ -4626,7 +4671,7 @@ mdj_smoke_check_01(hbool_t human_readable)
testfiles = binary_testfiles;
/* set update_architypes to TRUE to generate new architype files */
- update_architypes = FALSE;
+ update_architypes = TRUE;
TESTING("b mdj smoke check 01 -- jnl clean ins, prot, unprot, del, ren");
}
@@ -4647,23 +4692,23 @@ mdj_smoke_check_01(hbool_t human_readable)
}
}
- if ( show_progress )
+ if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
- if ( verbose ) {
- HDfprintf(stdout, "%s: filename = \"%s\".\n", fcn_name, filename);
+ if ( verbose ) {
+ HDfprintf(stdout, "%s: filename = \"%s\".\n", fcn_name, filename);
}
/* setup the journal file name */
if ( pass2 ) {
- if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename,
+ if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename,
sizeof(journal_filename)) == NULL ) {
pass2 = FALSE;
failure_mssg2 = "h5_fixname() failed (2).\n";
}
- else if ( HDstrlen(journal_filename) >=
+ else if ( HDstrlen(journal_filename) >=
H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) {
pass2 = FALSE;
@@ -4674,31 +4719,32 @@ mdj_smoke_check_01(hbool_t human_readable)
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
- if ( verbose ) {
- HDfprintf(stdout, "%s: journal filename = \"%s\".\n",
- fcn_name, journal_filename);
+ if ( verbose ) {
+ HDfprintf(stdout, "%s: journal filename = \"%s\".\n",
+ fcn_name, journal_filename);
}
/* clean out any existing journal file */
HDremove(journal_filename);
- /* Unfortunately, we get different journal output depending on the
+ /* Unfortunately, we get different journal output depending on the
* file driver, as at present we are including the end of address
- * space in journal entries, and the end of address space seems to
- * be in part a function of the file driver.
+ * space in journal entries, and the end of address space seems to
+ * be in part a function of the file driver.
*
- * Thus, if we want to use the core file driver when available, we
- * will either have to remove the end of address space from the
- * journal entries, get the different file drivers to agree on
+ * Thus, if we want to use the core file driver when available, we
+ * will either have to remove the end of address space from the
+ * journal entries, get the different file drivers to agree on
* end of address space, or maintain different sets of architype
* files for the different file drivers.
*/
setup_cache_for_journaling(filename, journal_filename, &file_id,
- &file_ptr, &cache_ptr, human_readable, FALSE);
+ &file_ptr, &cache_ptr, human_readable,
+ use_aio, FALSE);
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
-
+
/******************************************/
/* Run a small, fairly simple stress test */
@@ -4777,7 +4823,7 @@ mdj_smoke_check_01(hbool_t human_readable)
copy_file(journal_filename, testfiles[1]);
}
-
+
if ( file_exists(testfiles[1]) ) {
verify_journal_contents(journal_filename, testfiles[1], human_readable);
@@ -4822,7 +4868,7 @@ mdj_smoke_check_01(hbool_t human_readable)
copy_file(journal_filename, testfiles[2]);
}
-
+
if ( file_exists(testfiles[2]) ) {
verify_journal_contents(journal_filename, testfiles[2], human_readable);
@@ -4862,7 +4908,7 @@ mdj_smoke_check_01(hbool_t human_readable)
copy_file(journal_filename, testfiles[3]);
}
-
+
if ( file_exists(testfiles[3]) ) {
verify_journal_contents(journal_filename, testfiles[3], human_readable);
@@ -4902,7 +4948,7 @@ mdj_smoke_check_01(hbool_t human_readable)
copy_file(journal_filename, testfiles[4]);
}
-
+
if ( file_exists(testfiles[4]) ) {
verify_journal_contents(journal_filename, testfiles[4], human_readable);
@@ -4930,18 +4976,18 @@ mdj_smoke_check_01(hbool_t human_readable)
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
- if ( pass2 ) {
-
- PASSED();
+ if ( pass2 ) {
+
+ PASSED();
if ( testfile_missing ) {
- puts(" WARNING: One or more missing test files.");
+ puts(" WARNING: One or more missing test files.");
fflush(stdout);
}
- } else {
-
- H5_FAILED();
+ } else {
+
+ H5_FAILED();
}
if ( ! pass2 ) {
@@ -4970,18 +5016,22 @@ mdj_smoke_check_01(hbool_t human_readable)
* Programmer: John Mainzer
* 5/19/08
*
- * Changes: Modified function to run using either a human readable
+ * Changes: Modified function to run using either a human readable
* or binary journal file.
* JRM -- 5/13/09
*
+ * Modified function to run using either aio or sio.
+ * JRM -- 1/22/10
+ *
*-------------------------------------------------------------------------
*/
static void
-mdj_smoke_check_02(hbool_t human_readable)
+mdj_smoke_check_02(hbool_t human_readable,
+ hbool_t use_aio)
{
const char * fcn_name = "mdj_smoke_check_02()";
- const char * human_readable_testfiles[] =
+ const char * human_readable_testfiles[] =
{
"testfiles/cache2_journal_sc02_000.jnl",
"testfiles/cache2_journal_sc02_001.jnl",
@@ -4990,7 +5040,7 @@ mdj_smoke_check_02(hbool_t human_readable)
"testfiles/cache2_journal_sc02_004.jnl",
NULL
};
- const char * binary_testfiles[] =
+ const char * binary_testfiles[] =
{
"testfiles/cache2_journal_bsc02_000.jnl",
"testfiles/cache2_journal_bsc02_001.jnl",
@@ -5049,11 +5099,11 @@ mdj_smoke_check_02(hbool_t human_readable)
}
}
- if ( show_progress )
+ if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
- if ( verbose ) {
- HDfprintf(stdout, "%s: filename = \"%s\".\n", fcn_name, filename);
+ if ( verbose ) {
+ HDfprintf(stdout, "%s: filename = \"%s\".\n", fcn_name, filename);
}
/* setup the journal file name */
@@ -5074,31 +5124,32 @@ mdj_smoke_check_02(hbool_t human_readable)
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
- if ( verbose ) {
- HDfprintf(stdout, "%s: journal filename = \"%s\".\n",
- fcn_name, journal_filename);
+ if ( verbose ) {
+ HDfprintf(stdout, "%s: journal filename = \"%s\".\n",
+ fcn_name, journal_filename);
}
/* clean out any existing journal file */
HDremove(journal_filename);
- /* Unfortunately, we get different journal output depending on the
+ /* Unfortunately, we get different journal output depending on the
* file driver, as at present we are including the end of address
- * space in journal entries, and the end of address space seems to
- * be in part a function of the file driver.
+ * space in journal entries, and the end of address space seems to
+ * be in part a function of the file driver.
*
- * Thus, if we want to use the core file driver when available, we
- * will either have to remove the end of address space from the
- * journal entries, get the different file drivers to agree on
+ * Thus, if we want to use the core file driver when available, we
+ * will either have to remove the end of address space from the
+ * journal entries, get the different file drivers to agree on
* end of address space, or maintain different sets of architype
* files for the different file drivers.
*/
setup_cache_for_journaling(filename, journal_filename, &file_id,
- &file_ptr, &cache_ptr, human_readable, FALSE);
+ &file_ptr, &cache_ptr, human_readable,
+ use_aio, FALSE);
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
-
+
/******************************************/
/* Run a small, fairly simple stress test */
@@ -5132,7 +5183,7 @@ mdj_smoke_check_02(hbool_t human_readable)
copy_file(journal_filename, testfiles[0]);
}
-
+
if ( file_exists(testfiles[0]) ) {
verify_journal_contents(journal_filename, testfiles[0], human_readable);
@@ -5177,7 +5228,7 @@ mdj_smoke_check_02(hbool_t human_readable)
copy_file(journal_filename, testfiles[1]);
}
-
+
if ( file_exists(testfiles[1]) ) {
verify_journal_contents(journal_filename, testfiles[1], human_readable);
@@ -5222,7 +5273,7 @@ mdj_smoke_check_02(hbool_t human_readable)
copy_file(journal_filename, testfiles[2]);
}
-
+
if ( file_exists(testfiles[2]) ) {
verify_journal_contents(journal_filename, testfiles[2], human_readable);
@@ -5262,7 +5313,7 @@ mdj_smoke_check_02(hbool_t human_readable)
copy_file(journal_filename, testfiles[3]);
}
-
+
if ( file_exists(testfiles[3]) ) {
verify_journal_contents(journal_filename, testfiles[3], human_readable);
@@ -5302,7 +5353,7 @@ mdj_smoke_check_02(hbool_t human_readable)
copy_file(journal_filename, testfiles[4]);
}
-
+
if ( file_exists(testfiles[4]) ) {
verify_journal_contents(journal_filename, testfiles[4], human_readable);
@@ -5330,18 +5381,18 @@ mdj_smoke_check_02(hbool_t human_readable)
if ( show_progress )
HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++);
- if ( pass2 ) {
-
- PASSED();
+ if ( pass2 ) {
+
+ PASSED();
if ( testfile_missing ) {
- puts(" WARNING: One or more missing test files.");
+ puts(" WARNING: One or more missing test files.");
fflush(stdout);
}
- } else {
-
- H5_FAILED();
+ } else {
+
+ H5_FAILED();
}
if ( ! pass2 ) {
@@ -5359,11 +5410,11 @@ mdj_smoke_check_02(hbool_t human_readable)
/*-------------------------------------------------------------------------
* Function: mdj_api_example_test
*
- * Purpose: Verify that the example code for using the metadata
+ * Purpose: Verify that the example code for using the metadata
* journaling works as expected
*
- * This example demonstrates enabling journaling at file
- * creation time, and enabling journaling on an open file. It
+ * This example demonstrates enabling journaling at file
+ * creation time, and enabling journaling on an open file. It
* also demonstrates disabling journaling both manualy during a
* computation and automatically at file close. Finally,
* it demonstrates the use of H5Fflush() to keep the journal
@@ -5372,77 +5423,77 @@ mdj_smoke_check_02(hbool_t human_readable)
* We begin by creating an hdf5 file with journaling enabled.
*
* The inital calls to TESTING(), SKIPPED(), h5_fixname(),
- * HDremove(), the initialization of pass2, and the like are all
+ * HDremove(), the initialization of pass2, and the like are all
* part of the HDF5 test framework, and may be largely ignored.
* In your application, the only point here is that you will
- * have to set up the paths to your data file and journal
+ * have to set up the paths to your data file and journal
* file. Further, the journal file must not exist before
* the hdf5 file is opened, as hdf5 will refuse to overwrite
* a journal file.
*
- * With these preliminaries dealt with, we allocate a
- * file access property list (FAPL). Journaling uses some
+ * With these preliminaries dealt with, we allocate a
+ * file access property list (FAPL). Journaling uses some
* recent extensions to the superblock, so the first step
- * is to set the library version to latest via a call to
+ * is to set the library version to latest via a call to
* H5Pset_libver_bounds().
*
- * Next, we must set up the journaling property. We could
- * do this in several ways, but in this example we will do
- * this by using H5Pget_jnl_config() to get the default
- * journaling configuration, modifing it, and then using
- * H5Pset_jnl_config() to replace the default with our
- * configuration. See the comments in the code for the
+ * Next, we must set up the journaling property. We could
+ * do this in several ways, but in this example we will do
+ * this by using H5Pget_jnl_config() to get the default
+ * journaling configuration, modifing it, and then using
+ * H5Pset_jnl_config() to replace the default with our
+ * configuration. See the comments in the code for the
* particulars -- note that we must set the version field of
* the H5AC2_jnl_config_t before we call H5Pget_jnl_config().
*
* After setting up the FAPL, we create the file as usual.
* Journaling will be enabled with configuration as specified.
*
- * With file created and journaling running we then go off
+ * With file created and journaling running we then go off
* and do what we want -- in this example we set up a selection
- * of chunked data sets. Note that these data sets (and our
+ * of chunked data sets. Note that these data sets (and our
* access pattern) are chosen to maximize the amount of dirty
- * metadata generated. In your application, you will want to
+ * metadata generated. In your application, you will want to
* do just the opposite if possible.
*
* After the data sets are created, we then shut down journaling
- * and then re-enable it via the H5Fget_jnl_config() and
- * H5Fset_jnl_config() calls. Note that when we re-enable
+ * and then re-enable it via the H5Fget_jnl_config() and
+ * H5Fset_jnl_config() calls. Note that when we re-enable
* journaling via the H5Fset_jnl_config() call, we don't need
- * to set all the fields in the H5AC2_jnl_config_t, since we
- * are re-using the configuration we obtained via the
+ * to set all the fields in the H5AC2_jnl_config_t, since we
+ * are re-using the configuration we obtained via the
* H5Fget_jnl_config() call. If we had opened the file without
- * journaling, and then wanted to enable journaling, we would
- * have had to set up the fields of the H5AC2_jnl_config_t in
- * much the same way we did earlier in the example. We would
- * also have had to create the file initially with the latest
+ * journaling, and then wanted to enable journaling, we would
+ * have had to set up the fields of the H5AC2_jnl_config_t in
+ * much the same way we did earlier in the example. We would
+ * also have had to create the file initially with the latest
* format (using H5Pset_libver_bounds()).
*
- * Having re-enabled journaling, we then proceed to write to
+ * Having re-enabled journaling, we then proceed to write to
* our data sets. Again, please not that our write strategy
* (round robin and small chunks) is designed to maximize
* dirty metadata generation and load on the metadata cache.
* In your application, you should try to do just the opposite
- * if possible.
+ * if possible.
*
* However, since we are maximizing dirty metadata generation,
* the journal file will grow quickly. This can be a problem,
* so from time to time we force truncation of the journal file
* via a call to H5Fflush(). This call flushes the hdf5 file,
* and then truncates the journal file, as the contents of the
- * journal becomes irrelvant after the metadata journal is
+ * journal becomes irrelvant after the metadata journal is
* flushed.
*
- * After writing data to our data sets, we then to a number of
- * reads. We could turn off journaling here, as we are not
- * modifying the file. But since we are not generating any
+ * After writing data to our data sets, we then to a number of
+ * reads. We could turn off journaling here, as we are not
+ * modifying the file. But since we are not generating any
* dirty metadata, we aren't generating any journal entries
* either -- so it really doesn't matter.
*
* Finally, we close the hdf5 file. Since journaling is enabled,
- * the call to H5Fclose() will flush the journal, flush the
- * metadata cache, truncate the journal, mark the file as not
- * having journaling in progress, and then delete the journal
+ * the call to H5Fclose() will flush the journal, flush the
+ * metadata cache, truncate the journal, mark the file as not
+ * having journaling in progress, and then delete the journal
* file as part of the close.
*
* Return: void
@@ -5452,11 +5503,20 @@ mdj_smoke_check_02(hbool_t human_readable)
*
* Modifications:
*
- * Modified the function to used either the human readable
- * or the binary journal file format as directed via the
+ * Modified the function to used either the human readable
+ * or the binary journal file format as directed via the
* new human_readable parameter.
* JRM -- 5/13/09
*
+ * Modified the function to use either AIO or SIO as directed
+ * via the new use_aio parameter.
+ *
+ * JRM -- 1/26/09
+ *
+ * Added num_bufs and buf_size parameters and associated
+ * code.
+ * JRM -- 3/2/10
+ *
*-------------------------------------------------------------------------
*/
@@ -5466,7 +5526,10 @@ mdj_smoke_check_02(hbool_t human_readable)
#define NUM_RANDOM_ACCESSES 200000
static void
-mdj_api_example_test(hbool_t human_readable)
+mdj_api_example_test(hbool_t human_readable,
+ hbool_t use_aio,
+ int num_bufs,
+ size_t buf_size)
{
const char * fcn_name = "mdj_api_example_test()";
char filename[512];
@@ -5495,12 +5558,24 @@ mdj_api_example_test(hbool_t human_readable)
if ( human_readable ) {
- TESTING("mdj example code -- human readable journal file");
+ if ( use_aio ) {
+ TESTING("aio mdj example code -- human readable journal file");
+
+ } else {
+
+ TESTING("sio mdj example code -- human readable journal file");
+ }
} else {
- TESTING("mdj example code -- binary journal file");
+ if ( use_aio ) {
+
+ TESTING("aio mdj example code -- binary journal file");
+ } else {
+
+ TESTING("sio mdj example code -- binary journal file");
+ }
}
if ( skip_long_tests2 > 0 ) {
@@ -5559,7 +5634,7 @@ mdj_api_example_test(hbool_t human_readable)
}
- /* clean out any existing journal file -- must do this as
+ /* clean out any existing journal file -- must do this as
* HDF5 will refuse to overwrite an existing journal file.
*/
if ( ( pass2 ) && ( report_progress ) ) {
@@ -5608,7 +5683,7 @@ mdj_api_example_test(hbool_t human_readable)
}
- /* Get the current FAPL journaling configuration. This should be
+ /* Get the current FAPL journaling configuration. This should be
* the default, and we could just write a predifined journal configuration
* structure to the FAPL directly, but doing it this way shows off the
* H5Pget_jnl_config() call, and is less suceptible to API definition
@@ -5634,7 +5709,7 @@ mdj_api_example_test(hbool_t human_readable)
}
- /* Modify the current FAPL journaling configuration to enable
+ /* Modify the current FAPL journaling configuration to enable
* journaling as desired, and then write the revised configuration
* back to the FAPL.
*/
@@ -5652,39 +5727,37 @@ mdj_api_example_test(hbool_t human_readable)
HDstrcpy(jnl_config_0.journal_file_path, journal_filename);
/* jnl_config_0.journal_recovered should always be FALSE unless
- * you are writing a new journal recovery tool, and need to
- * tell the library that you have recovered the journal and
- * that the file is now readable. As this field is set to
+ * you are writing a new journal recovery tool, and need to
+ * tell the library that you have recovered the journal and
+ * that the file is now readable. As this field is set to
* FALSE by default, we don't touch it here.
*/
- /* the journal buffer size should be some multiple of the block
- * size of the underlying file system.
+ /* the journal buffer size should be some multiple of the block
+ * size of the underlying file system.
*/
- jnl_config_0.jbrb_buf_size = (16 * 1024);
+ jnl_config_0.jbrb_buf_size = buf_size;
- /* the number of journal buffers should be either 1 or 2 when
+ /* the number of journal buffers should be either 1 or 2 when
* synchronous I/O is used for journal writes. If AIO is used,
- * the number should be large enough that the write of a buffer
+ * the number should be large enough that the write of a buffer
* will usually be complete by the time that buffer is needed
* again.
*/
- jnl_config_0.jbrb_num_bufs = 2;
+ jnl_config_0.jbrb_num_bufs = num_bufs;
- /* At present we don't support AIO for journal writes, so this
- * field will be FALSE.
- */
- jnl_config_0.jbrb_use_aio = FALSE;
+ /* select aio or not as directed. */
+ jnl_config_0.jbrb_use_aio = use_aio;
/* set human readable as specified in the human_readable parameter
- * to this function. If human_readable is FALSE, we will use
+ * to this function. If human_readable is FALSE, we will use
* the binary journal file format which should reduce the size
- * of the journal file by about two thirds, and also reduce the
+ * of the journal file by about two thirds, and also reduce the
* overhead involved in formating journal entries for writing
* to the journal file.
*/
jnl_config_0.jbrb_human_readable = human_readable;
-
+
status = H5Pset_jnl_config(fapl_id, &jnl_config_0);
if ( status < 0 ) {
@@ -5772,7 +5845,7 @@ mdj_api_example_test(hbool_t human_readable)
sprintf(dset_name, "/dset%03d", i);
dataset_ids[i] = H5Dcreate2(file_id, dset_name, H5T_STD_I32BE,
- dataspace_id, H5P_DEFAULT,
+ dataspace_id, H5P_DEFAULT,
properties, H5P_DEFAULT);
if ( dataset_ids[i] < 0 ) {
@@ -5799,10 +5872,10 @@ mdj_api_example_test(hbool_t human_readable)
}
- /* just for purposes of demonstration, turn off journaling, and
- * then turn it back on again. Note that this will force a
- * flush of the file, and all metadata with it. Turning off
- * journaling will also cause us to close and discard the
+ /* just for purposes of demonstration, turn off journaling, and
+ * then turn it back on again. Note that this will force a
+ * flush of the file, and all metadata with it. Turning off
+ * journaling will also cause us to close and discard the
* journal file after all metadata is on disk.
*/
if ( ( pass2 ) && ( report_progress ) ) {
@@ -5840,10 +5913,10 @@ mdj_api_example_test(hbool_t human_readable)
/* Note that here we simply set jnl_config_1.enable_journaling to
- * TRUE, and pass it back to the HDF5 library via the
- * H5Fset_jnl_config() call.
+ * TRUE, and pass it back to the HDF5 library via the
+ * H5Fset_jnl_config() call.
*
- * We can do this because jnl_config_1 reflected the current
+ * We can do this because jnl_config_1 reflected the current
* journaling configuration when we got it from the library
* via the H5Fget_jnl_config() call, and H5Fset_mdc_config()
* doesn't change the values of any fields.
@@ -5975,18 +6048,18 @@ mdj_api_example_test(hbool_t human_readable)
}
}
- /* We are generating a lot of dirty metadata here, all of which
+ /* We are generating a lot of dirty metadata here, all of which
* will wind up in the journal file. To keep the journal file
- * from getting too big (and to make sure the raw data is on
+ * from getting too big (and to make sure the raw data is on
* disk, we should do an occasional flush of the HDF5 file.
*
* This will force all metadata to disk, and cause the journal
* file to be truncated.
*
- * On the other hand, it will impose a significant file I/O
+ * On the other hand, it will impose a significant file I/O
* overhead, and slow us down. (try it both ways).
*/
-#if 1
+#if 0
status = H5Fflush(file_id, H5F_SCOPE_GLOBAL);
if ( status < 0 ) {
@@ -6323,7 +6396,7 @@ mdj_api_example_test(hbool_t human_readable)
/*-------------------------------------------------------------------------
* Function: check_superblock_extensions()
*
- * Purpose: Verify that the super block extensions for tracking
+ * Purpose: Verify that the super block extensions for tracking
* journaling status operate as they should.
*
* Note that this test code will have to be re-worked
@@ -6348,7 +6421,7 @@ check_superblock_extensions(void)
char filename[512];
hbool_t show_progress = FALSE;
hbool_t verbose = FALSE;
- int cp = 0;
+ int cp = 0;
hid_t fapl_id = -1;
hid_t file_id = -1;
hid_t dataset_id = -1;
@@ -6361,7 +6434,7 @@ check_superblock_extensions(void)
pass2 = TRUE;
- /* Verify that the journaling superblock extension performs as
+ /* Verify that the journaling superblock extension performs as
* expected. Note that this test will have to be re-written
* (or possibly subsumed in another test) once the full journaling
* code is up and running.
@@ -6372,7 +6445,7 @@ check_superblock_extensions(void)
* listed as being off.
*
* 2) create a dataset in the file, and then close the file
- *
+ *
* 3) Open the file again, and verifiy that journaling is still
* listed as being off.
*
@@ -6380,7 +6453,7 @@ check_superblock_extensions(void)
* being journaled, and close the file again.
*
* 5) Open the file a third time, and verify that the superblock
- * extension indicates that the file is being journaled.
+ * extension indicates that the file is being journaled.
*
* 6) Reset the journaling information to indicate that the file
* is not being journaled, and close the file again.
@@ -6389,16 +6462,16 @@ check_superblock_extensions(void)
* extension indicates that the file is not being journaled.
*
* 8) Write data to the superblock, marking the file as being
- * journaled. Now write different data to the superbloc, that
- * still marks the file as being journaled. Close the file.
+ * journaled. Now write different data to the superbloc, that
+ * still marks the file as being journaled. Close the file.
*
- * 9) Re-open the file, and verify that the second write in 8
+ * 9) Re-open the file, and verify that the second write in 8
* above took.
*
* 10) Write data to the superblock indicating that journaling is
* not in progress. Close the file.
*
- * 11) Reopen the file, and verify that journaling is not in
+ * 11) Reopen the file, and verify that journaling is not in
* progress.
*
* 12) Close the file and delete it.
@@ -6441,7 +6514,7 @@ check_superblock_extensions(void)
/* call H5Pset_libver_bounds() on the fapl_id */
if ( pass2 ) {
- if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST,
+ if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST,
H5F_LIBVER_LATEST) < 0 ) {
pass2 = FALSE;
@@ -6465,7 +6538,7 @@ check_superblock_extensions(void)
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
- /* get a pointer to the files internal data structure and then
+ /* get a pointer to the files internal data structure and then
* verify that journaling is disabled.
*/
if ( pass2 ) {
@@ -6478,7 +6551,7 @@ check_superblock_extensions(void)
failure_mssg2 = "Can't get file_ptr (1).\n";
} else if ( file_ptr->shared->mdc_jnl_enabled ) {
-
+
pass2 = FALSE;
failure_mssg2 = "Journaling enabled on file creation.\n";
}
@@ -6553,7 +6626,7 @@ check_superblock_extensions(void)
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
- /* get a pointer to the files internal data structure and then
+ /* get a pointer to the files internal data structure and then
* verify that journaling is disabled.
*/
if ( pass2 ) {
@@ -6566,7 +6639,7 @@ check_superblock_extensions(void)
failure_mssg2 = "Can't get file_ptr (2).\n";
} else if ( file_ptr->shared->mdc_jnl_enabled ) {
-
+
pass2 = FALSE;
failure_mssg2 = "Journaling enabled on file open (1).\n";
}
@@ -6579,7 +6652,7 @@ check_superblock_extensions(void)
/* being journaled, and close the file again. */
/*****************************************************************/
- /* At present, we just write the super block regardless if the
+ /* At present, we just write the super block regardless if the
* file is opened read/write. This is ugly, but that is how it
* is for now. Thus just go in and modify the journaling fields
* of the super block to taste.
@@ -6651,7 +6724,7 @@ check_superblock_extensions(void)
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
- /* get a pointer to the files internal data structure and then
+ /* get a pointer to the files internal data structure and then
* verify that journaling is enabled.
*/
if ( pass2 ) {
@@ -6664,26 +6737,26 @@ check_superblock_extensions(void)
failure_mssg2 = "Can't get file_ptr (3).\n";
} else if ( ! file_ptr->shared->mdc_jnl_enabled ) {
-
+
pass2 = FALSE;
failure_mssg2 = "Journaling disabled on file open (1).\n";
} else if ( file_ptr->shared->mdc_jnl_magic != 123 ) {
-
+
pass2 = FALSE;
HDfprintf(stdout, "%s: mdc_jnl_magic = %d (%d).\n",
fcn_name, (int)(file_ptr->shared->mdc_jnl_magic),
123);
failure_mssg2 = "unexpected mdc_jnl_magic(1).\n";
- } else if ( file_ptr->shared->mdc_jnl_file_name_len !=
+ } else if ( file_ptr->shared->mdc_jnl_file_name_len !=
(size_t)HDstrlen("abc") ) {
-
+
pass2 = FALSE;
failure_mssg2 = "unexpected mdc_jnl_file_name_len (1).\n";
} else if ( HDstrcmp(file_ptr->shared->mdc_jnl_file_name, "abc") != 0 ) {
-
+
pass2 = FALSE;
failure_mssg2 = "unexpected mdc_jnl_file_name (1).\n";
@@ -6721,7 +6794,7 @@ check_superblock_extensions(void)
}
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
-
+
/******************************************************************/
/* 7) Open the file a fourth time, and verify that the superblock */
@@ -6742,7 +6815,7 @@ check_superblock_extensions(void)
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
- /* get a pointer to the files internal data structure and then
+ /* get a pointer to the files internal data structure and then
* verify that journaling is disabled.
*/
if ( pass2 ) {
@@ -6755,7 +6828,7 @@ check_superblock_extensions(void)
failure_mssg2 = "Can't get file_ptr (4).\n";
} else if ( file_ptr->shared->mdc_jnl_enabled ) {
-
+
pass2 = FALSE;
failure_mssg2 = "Journaling enabled on file open (2).\n";
}
@@ -6818,7 +6891,7 @@ check_superblock_extensions(void)
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
-
+
/***************************************************************/
/* 9) Re-open the file, and verify that the second write in 8 */
/* above took. */
@@ -6842,7 +6915,7 @@ check_superblock_extensions(void)
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
- /* get a pointer to the files internal data structure and then
+ /* get a pointer to the files internal data structure and then
* verify that journaling is enabled.
*/
if ( pass2 ) {
@@ -6855,26 +6928,26 @@ check_superblock_extensions(void)
failure_mssg2 = "Can't get file_ptr (5).\n";
} else if ( ! file_ptr->shared->mdc_jnl_enabled ) {
-
+
pass2 = FALSE;
failure_mssg2 = "Journaling disabled on file open (2).\n";
} else if ( file_ptr->shared->mdc_jnl_magic != 789 ) {
-
+
pass2 = FALSE;
HDfprintf(stdout, "%s: mdc_jnl_magic = %d (%d).\n",
fcn_name, (int)(file_ptr->shared->mdc_jnl_magic),
789);
failure_mssg2 = "unexpected mdc_jnl_magic(2).\n";
- } else if ( file_ptr->shared->mdc_jnl_file_name_len !=
+ } else if ( file_ptr->shared->mdc_jnl_file_name_len !=
(size_t)HDstrlen("z") ) {
-
+
pass2 = FALSE;
failure_mssg2 = "unexpected mdc_jnl_file_name_len (2).\n";
} else if ( HDstrcmp(file_ptr->shared->mdc_jnl_file_name, "z") != 0 ) {
-
+
pass2 = FALSE;
failure_mssg2 = "unexpected mdc_jnl_file_name (2).\n";
@@ -6934,7 +7007,7 @@ check_superblock_extensions(void)
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
- /* get a pointer to the files internal data structure and then
+ /* get a pointer to the files internal data structure and then
* verify that journaling is disabled.
*/
if ( pass2 ) {
@@ -6947,7 +7020,7 @@ check_superblock_extensions(void)
failure_mssg2 = "Can't get file_ptr (6).\n";
} else if ( file_ptr->shared->mdc_jnl_enabled ) {
-
+
pass2 = FALSE;
failure_mssg2 = "Journaling enabled on file open (3).\n";
}
@@ -6959,7 +7032,7 @@ check_superblock_extensions(void)
/*************************************/
/* 12) Close the file and delete it. */
/*************************************/
-
+
if ( pass2 ) {
if ( H5Fclose(file_id) < 0 ) {
@@ -6991,12 +7064,12 @@ check_superblock_extensions(void)
/***************************************************************************
* Function: check_mdjsc_callbacks()
*
- * Purpose: Verify that the registration and deregistration of
+ * Purpose: Verify that the registration and deregistration of
* metadata journaling status change registration/deregistraion
- * works correctly.
+ * works correctly.
*
- * Verify that the status change callbacks are called as
- * they should be, and that the cache is clean when the
+ * Verify that the status change callbacks are called as
+ * they should be, and that the cache is clean when the
* callback is called.
*
* On failure, set pass2 to false, and failure_mssg2 to an
@@ -7006,10 +7079,10 @@ check_superblock_extensions(void)
*
* Programmer: John Mainzer
* 7/2/08
- *
+ *
**************************************************************************/
-static void
+static void
check_mdjsc_callbacks(void)
{
const char * fcn_name = "check_mdjsc_callbacks():";
@@ -7040,14 +7113,14 @@ check_mdjsc_callbacks(void)
*
* Function: test_mdjsc_callback()
*
- * Purpose: Test callback function used to test the metadata
+ * Purpose: Test callback function used to test the metadata
* journaling status change callback facility.
*
* Return: void
*
* Programmer: John Mainzer
* 8/15/08
- *
+ *
**************************************************************************/
static H5C2_t * callback_test_cache_ptr = NULL;
@@ -7058,7 +7131,7 @@ static hbool_t callback_test_null_data_ptr = FALSE;
static hbool_t callback_test_cache_is_dirty = FALSE;
static int callback_test_null_data_ptr_count = 0;
-static herr_t
+static herr_t
test_mdjsc_callback(const H5C2_mdj_config_t * config_ptr,
hid_t UNUSED dxpl_id,
void * data_ptr)
@@ -7067,7 +7140,7 @@ test_mdjsc_callback(const H5C2_mdj_config_t * config_ptr,
{
callback_test_null_config_ptr = TRUE;
}
-
+
if ( ( callback_test_cache_ptr == NULL ) ||
( callback_test_cache_ptr->magic != H5C2__H5C2_T_MAGIC ) )
{
@@ -7078,7 +7151,7 @@ test_mdjsc_callback(const H5C2_mdj_config_t * config_ptr,
callback_test_cache_is_dirty = TRUE;
}
else if ( ( callback_test_cache_ptr != NULL ) &&
- ( callback_test_cache_ptr->mdj_enabled !=
+ ( callback_test_cache_ptr->mdj_enabled !=
config_ptr->enable_journaling ) )
{
callback_test_invalid_config = TRUE;
@@ -7103,8 +7176,8 @@ test_mdjsc_callback(const H5C2_mdj_config_t * config_ptr,
*
* Function: deregister_mdjsc_callback()
*
- * Purpose: Attempt to deregister the metadata journaling status change
- * callback with the supplied index, and verify that the
+ * Purpose: Attempt to deregister the metadata journaling status change
+ * callback with the supplied index, and verify that the
* deregistration took place.
*
* If any error is detected, set pass2 t FALSE, and set the
@@ -7116,7 +7189,7 @@ test_mdjsc_callback(const H5C2_mdj_config_t * config_ptr,
*
* Programmer: John Mainzer
* 8/15/08
- *
+ *
**************************************************************************/
static void
@@ -7126,14 +7199,14 @@ deregister_mdjsc_callback(H5F_t * file_ptr,
{
herr_t result;
- if ( pass2 )
+ if ( pass2 )
{
if ( ( file_ptr == NULL ) ||
( cache_ptr == NULL ) ||
( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) )
{
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"deregister_mdjsc_callback(): bad param(s) on entry.";
}
}
@@ -7142,7 +7215,7 @@ deregister_mdjsc_callback(H5F_t * file_ptr,
{
result = H5AC2_deregister_mdjsc_callback(file_ptr, idx);
- if ( result < 0 )
+ if ( result < 0 )
{
pass2 = FALSE;
failure_mssg2 = "H5AC2_deregister_mdjsc_callback() failed.";
@@ -7160,7 +7233,7 @@ deregister_mdjsc_callback(H5F_t * file_ptr,
*
* Function: register_mdjsc_callback()
*
- * Purpose: Attempt to register the supplied metadata journaling
+ * Purpose: Attempt to register the supplied metadata journaling
* status change callback, and verify that the registration
* took.
*
@@ -7173,7 +7246,7 @@ deregister_mdjsc_callback(H5F_t * file_ptr,
*
* Programmer: John Mainzer
* 8/15/08
- *
+ *
**************************************************************************/
static void
@@ -7186,7 +7259,7 @@ register_mdjsc_callback(H5F_t * file_ptr,
herr_t result;
H5C2_mdj_config_t init_config;
- if ( pass2 )
+ if ( pass2 )
{
if ( ( file_ptr == NULL ) ||
( cache_ptr == NULL ) ||
@@ -7204,7 +7277,7 @@ register_mdjsc_callback(H5F_t * file_ptr,
result = H5AC2_register_mdjsc_callback(file_ptr, fcn_ptr, data_ptr,
idx_ptr, &init_config);
- if ( result < 0 )
+ if ( result < 0 )
{
pass2 = FALSE;
failure_mssg2 = "H5AC2_register_mdjsc_callback() failed.";
@@ -7212,13 +7285,13 @@ register_mdjsc_callback(H5F_t * file_ptr,
else if ( init_config.enable_journaling != cache_ptr->mdj_enabled )
{
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"init_config.enable_journaling != cache_ptr->mdj_enabled";
}
- verify_mdjsc_callback_registered(cache_ptr,
- fcn_ptr,
- data_ptr,
+ verify_mdjsc_callback_registered(cache_ptr,
+ fcn_ptr,
+ data_ptr,
*idx_ptr);
}
@@ -7231,7 +7304,7 @@ register_mdjsc_callback(H5F_t * file_ptr,
*
* Function: verify_mdjsc_table_config()
*
- * Purpose: Verify that the mdjsc callback table is configured as
+ * Purpose: Verify that the mdjsc callback table is configured as
* specified.
*
* If all is as it should be, do nothing.
@@ -7245,7 +7318,7 @@ register_mdjsc_callback(H5F_t * file_ptr,
*
* Programmer: John Mainzer
* 8/15/08
- *
+ *
**************************************************************************/
static void
@@ -7259,20 +7332,20 @@ verify_mdjsc_table_config(H5C2_t * cache_ptr,
hbool_t show_progress = FALSE;
int cp = 0;
- if ( show_progress )
+ if ( show_progress )
HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass2, cp++);
if ( pass2 )
{
if ( ( cache_ptr == NULL ) ||
- ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) )
+ ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) )
{
pass2 = FALSE;
failure_mssg2 = "bad cache_ptr.";
}
}
- if ( show_progress )
+ if ( show_progress )
HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass2, cp++);
if ( pass2 )
@@ -7284,7 +7357,7 @@ verify_mdjsc_table_config(H5C2_t * cache_ptr,
}
}
- if ( show_progress )
+ if ( show_progress )
HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass2, cp++);
if ( pass2 )
@@ -7306,7 +7379,7 @@ verify_mdjsc_table_config(H5C2_t * cache_ptr,
}
}
- if ( show_progress )
+ if ( show_progress )
HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass2, cp++);
if ( ( pass2 ) && ( free_entries ) )
@@ -7325,11 +7398,11 @@ verify_mdjsc_table_config(H5C2_t * cache_ptr,
)
{
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"mdjsc callback table entry in use that should be free";
}
- }
- else
+ }
+ else
{
/* recall that the data_ptr can be NULL when an entry is
* in use.
@@ -7337,7 +7410,7 @@ verify_mdjsc_table_config(H5C2_t * cache_ptr,
if ( ((cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr == NULL )
{
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"mdjsc callback table entry free that shoult be in use";
}
}
@@ -7345,14 +7418,14 @@ verify_mdjsc_table_config(H5C2_t * cache_ptr,
i++;
}
- if ( show_progress )
+ if ( show_progress )
HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass2, cp++);
i = 0;
j = cache_ptr->mdjsc_cb_tbl_fl_head;
- while ( ( pass2 ) &&
- ( i < (table_len - num_entries) ) &&
+ while ( ( pass2 ) &&
+ ( i < (table_len - num_entries) ) &&
( j >= 0 ) &&
( j < table_len ) )
{
@@ -7364,12 +7437,12 @@ verify_mdjsc_table_config(H5C2_t * cache_ptr,
pass2 = FALSE;
failure_mssg2 = "mdjsc callback table free list entry in use.";
}
-
+
i++;
j = record_ptr->fl_next;
}
- if ( show_progress )
+ if ( show_progress )
HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass2, cp++);
if ( pass2 )
@@ -7377,21 +7450,21 @@ verify_mdjsc_table_config(H5C2_t * cache_ptr,
if ( i != (table_len - num_entries) ) {
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"mdjsc callback table free list shorter than expected.";
} else if ( ( record_ptr != NULL ) &&
( record_ptr->fl_next != -1 ) ) {
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"mdjsc callback table free list longer than expected.";
}
}
}
- if ( show_progress )
+ if ( show_progress )
HDfprintf(stdout, "%s:%d: %d -- done.\n", fcn_name, pass2, cp++);
return;
@@ -7418,7 +7491,7 @@ verify_mdjsc_table_config(H5C2_t * cache_ptr,
*
* Programmer: John Mainzer
* 8/15/08
- *
+ *
**************************************************************************/
static void
@@ -7428,7 +7501,7 @@ verify_mdjsc_callback_deregistered(H5C2_t * cache_ptr,
if ( pass2 )
{
if ( ( cache_ptr == NULL ) ||
- ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) )
+ ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) )
{
pass2 = FALSE;
failure_mssg2 = "bad cache_ptr.";
@@ -7482,7 +7555,7 @@ verify_mdjsc_callback_deregistered(H5C2_t * cache_ptr,
*
* Programmer: John Mainzer
* 8/15/08
- *
+ *
**************************************************************************/
static void
@@ -7494,7 +7567,7 @@ verify_mdjsc_callback_registered(H5C2_t * cache_ptr,
if ( pass2 )
{
if ( ( cache_ptr == NULL ) ||
- ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) )
+ ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) )
{
pass2 = FALSE;
failure_mssg2 = "bad cache_ptr.";
@@ -7557,9 +7630,9 @@ verify_mdjsc_callback_registered(H5C2_t * cache_ptr,
*
* Function: verify_mdjsc_callback_error_rejection()
*
- * Purpose: Run a variety of tests to verify that the metadata
- * journaling status change callbacks registration and
- * de-registration routines will fail on obviously
+ * Purpose: Run a variety of tests to verify that the metadata
+ * journaling status change callbacks registration and
+ * de-registration routines will fail on obviously
* invalid input.
*
* If anything is not as it should be, set pass2 to FALSE,
@@ -7571,7 +7644,7 @@ verify_mdjsc_callback_registered(H5C2_t * cache_ptr,
*
* Programmer: John Mainzer
* 8/20/08
- *
+ *
**************************************************************************/
static void
@@ -7603,9 +7676,9 @@ verify_mdjsc_callback_error_rejection(void)
indicies[i] = -1;
}
- /* 1) Create a file with journaling enabled.
+ /* 1) Create a file with journaling enabled.
*
- * 2) Attempt to register callbacks with a variety of NULL
+ * 2) Attempt to register callbacks with a variety of NULL
* pointers supplied for parameters other than data_ptr.
* All attempts should fail.
*
@@ -7679,7 +7752,7 @@ verify_mdjsc_callback_error_rejection(void)
/* clean out any existing journal file */
HDremove(journal_filename);
setup_cache_for_journaling(filename, journal_filename, &file_id,
- &file_ptr, &cache_ptr, TRUE, FALSE);
+ &file_ptr, &cache_ptr, TRUE, FALSE, FALSE);
if ( show_progress ) {
@@ -7688,7 +7761,7 @@ verify_mdjsc_callback_error_rejection(void)
}
- /* 2) Attempt to register callbacks with a variety of NULL
+ /* 2) Attempt to register callbacks with a variety of NULL
* pointers supplied for parameters other than data_ptr.
* All attempts should fail.
*/
@@ -7696,15 +7769,15 @@ verify_mdjsc_callback_error_rejection(void)
if ( pass2 )
{
result = H5AC2_register_mdjsc_callback(NULL,
- test_mdjsc_callback,
- NULL,
+ test_mdjsc_callback,
+ NULL,
&(indicies[0]),
NULL);
if ( result == SUCCEED )
{
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"H5AC2_register_mdjsc_callback() succeeded with NULL file_ptr";
}
}
@@ -7712,15 +7785,15 @@ verify_mdjsc_callback_error_rejection(void)
if ( pass2 )
{
result = H5AC2_register_mdjsc_callback(file_ptr,
- NULL,
- NULL,
+ NULL,
+ NULL,
&(indicies[0]),
NULL);
if ( result == SUCCEED )
{
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"H5AC2_register_mdjsc_callback() succeeded with NULL fcn_ptr";
}
}
@@ -7728,15 +7801,15 @@ verify_mdjsc_callback_error_rejection(void)
if ( pass2 )
{
result = H5AC2_register_mdjsc_callback(file_ptr,
- test_mdjsc_callback,
- NULL,
+ test_mdjsc_callback,
+ NULL,
NULL,
NULL);
if ( result == SUCCEED )
{
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"H5AC2_register_mdjsc_callback() succeeded with NULL idx_ptr";
}
}
@@ -7753,7 +7826,7 @@ verify_mdjsc_callback_error_rejection(void)
if ( result == SUCCEED )
{
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"H5AC2_deregister_mdjsc_callback() succeeded with NULL file_ptr";
}
}
@@ -7765,7 +7838,7 @@ verify_mdjsc_callback_error_rejection(void)
if ( result == SUCCEED )
{
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"H5AC2_deregister_mdjsc_callback() succeeded with invld idx(1)";
}
}
@@ -7785,13 +7858,13 @@ verify_mdjsc_callback_error_rejection(void)
register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback,
&(counters[2]), &(indicies[2]));
- free_entries[0] = FALSE;
- free_entries[1] = FALSE;
- free_entries[2] = FALSE;
+ free_entries[0] = FALSE;
+ free_entries[1] = FALSE;
+ free_entries[2] = FALSE;
expected_num_entries += 3;
expected_max_idx = 2;
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -7803,7 +7876,7 @@ verify_mdjsc_callback_error_rejection(void)
if ( result == SUCCEED )
{
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"H5AC2_deregister_mdjsc_callback() succeeded with invld idx(2)";
}
}
@@ -7815,12 +7888,12 @@ verify_mdjsc_callback_error_rejection(void)
if ( result == SUCCEED )
{
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"H5AC2_deregister_mdjsc_callback() succeeded with invld idx(3)";
}
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -7832,15 +7905,15 @@ verify_mdjsc_callback_error_rejection(void)
if ( result != SUCCEED )
{
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"H5AC2_deregister_mdjsc_callback() failed with valid idx";
}
else
{
- free_entries[1] = TRUE;
+ free_entries[1] = TRUE;
expected_num_entries--;
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -7854,7 +7927,7 @@ verify_mdjsc_callback_error_rejection(void)
if ( result == SUCCEED )
{
pass2 = FALSE;
- failure_mssg2 =
+ failure_mssg2 =
"H5AC2_deregister_mdjsc_callback() succeeded with invld idx(4)";
}
}
@@ -7867,12 +7940,12 @@ verify_mdjsc_callback_error_rejection(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, 0);
deregister_mdjsc_callback(file_ptr, cache_ptr, 2);
- free_entries[0] = TRUE;
- free_entries[2] = TRUE;
+ free_entries[0] = TRUE;
+ free_entries[2] = TRUE;
expected_num_entries -= 2;
expected_max_idx = -1;
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -7902,7 +7975,7 @@ verify_mdjsc_callback_error_rejection(void)
#endif
if ( show_progress ) {
- HDfprintf(stdout, "%s%d cp = %d done.\n",
+ HDfprintf(stdout, "%s%d cp = %d done.\n",
fcn_name, (int)pass2, cp++);
HDfflush(stdout);
}
@@ -7916,9 +7989,9 @@ verify_mdjsc_callback_error_rejection(void)
*
* Function: verify_mdjsc_callback_execution()
*
- * Purpose: Run a variety of tests to verify that the metadata
+ * Purpose: Run a variety of tests to verify that the metadata
* journaling status change callbacks are actually performed,
- * at the correct time, and that the expected data is passed
+ * at the correct time, and that the expected data is passed
* to the callback function.
*
* If anything is not as it should be, set pass2 to FALSE,
@@ -7930,7 +8003,7 @@ verify_mdjsc_callback_error_rejection(void)
*
* Programmer: John Mainzer
* 8/15/08
- *
+ *
**************************************************************************/
static void
@@ -7966,22 +8039,22 @@ verify_mdjsc_callback_execution(void)
indicies[i] = -1;
}
- /* 1) Create a file with journaling enabled.
+ /* 1) Create a file with journaling enabled.
*
- * 2) Register a callback.
+ * 2) Register a callback.
*
* 3) Disable journaling. Verify that the callback is called,
* that it gets the correct data, and that the cache is clean
* at time of call.
*
- * 4) Enable journaling again. Verify that the callback is
+ * 4) Enable journaling again. Verify that the callback is
* called, that it gets the correct data, and that the cache
* is clear at time of call.
*
- * 5) Perform some writes to the file.
+ * 5) Perform some writes to the file.
*
- * 6) Disable journaling. Verify that the callback is called,
- * that it gets the correct data, and that the cache is
+ * 6) Disable journaling. Verify that the callback is called,
+ * that it gets the correct data, and that the cache is
* clean at time of call.
*
* 7) Perform some more writes to the file.
@@ -7991,10 +8064,10 @@ verify_mdjsc_callback_execution(void)
* is clear at time of call.
*
* 9) Deregister the callback, and close the file. Recall that
- * all metadata journaling status change callbacks must
+ * all metadata journaling status change callbacks must
* deregister before the metadata cache is destroyed.
*
- * 10) Re-open the file with journaling disabled, and register
+ * 10) Re-open the file with journaling disabled, and register
* several callbacks. Ensure that at least one has NULL
* data_ptr.
*
@@ -8073,7 +8146,7 @@ verify_mdjsc_callback_execution(void)
/* clean out any existing journal file */
HDremove(journal_filename);
setup_cache_for_journaling(filename, journal_filename, &file_id,
- &file_ptr, &cache_ptr, TRUE, FALSE);
+ &file_ptr, &cache_ptr, TRUE, FALSE, FALSE);
if ( show_progress ) {
@@ -8088,11 +8161,11 @@ verify_mdjsc_callback_execution(void)
register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback,
&(counters[0]), &(indicies[0]));
- free_entries[0] = FALSE;
+ free_entries[0] = FALSE;
expected_num_entries++;
expected_max_idx = 0;
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -8185,7 +8258,7 @@ verify_mdjsc_callback_execution(void)
}
- /* 4) Enable journaling again. Verify that the callback is
+ /* 4) Enable journaling again. Verify that the callback is
* called, that it gets the correct data, and that the cache
* is clear at time of call.
*/
@@ -8338,8 +8411,8 @@ verify_mdjsc_callback_execution(void)
}
- /* 6) Disable journaling. Verify that the callback is called,
- * that it gets the correct data, and that the cache is
+ /* 6) Disable journaling. Verify that the callback is called,
+ * that it gets the correct data, and that the cache is
* clean at time of call.
*/
@@ -8571,20 +8644,20 @@ verify_mdjsc_callback_execution(void)
HDfflush(stdout);
}
-
+
/* 9) Deregister the callback, and close the file. Recall that
- * all metadata journaling status change callbacks must
+ * all metadata journaling status change callbacks must
* deregister before the metadata cache is destroyed.
*/
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[0]);
indicies[0] = -1;
- free_entries[0] = TRUE;
+ free_entries[0] = TRUE;
expected_num_entries = 0;
expected_max_idx = -1;
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -8608,7 +8681,7 @@ verify_mdjsc_callback_execution(void)
- /* 10) Re-open the file with journaling disabled, and register
+ /* 10) Re-open the file with journaling disabled, and register
* several callbacks. Ensure that at least one has NULL
* data_ptr.
*/
@@ -8624,13 +8697,13 @@ verify_mdjsc_callback_execution(void)
register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback,
&(counters[2]), &(indicies[2]));
- free_entries[0] = FALSE;
- free_entries[1] = FALSE;
- free_entries[2] = FALSE;
+ free_entries[0] = FALSE;
+ free_entries[1] = FALSE;
+ free_entries[2] = FALSE;
expected_num_entries += 3;
expected_max_idx = 2;
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -8697,8 +8770,8 @@ verify_mdjsc_callback_execution(void)
if ( pass2 ) {
- if ( ( counters[0] != 1 ) &&
- ( counters[1] != 0 ) &&
+ if ( ( counters[0] != 1 ) &&
+ ( counters[1] != 0 ) &&
( counters[2] != 1 ) &&
( counters[3] != 0 ) )
{
@@ -8811,7 +8884,7 @@ verify_mdjsc_callback_execution(void)
HDassert( indicies[i] == i );
- free_entries[i] = FALSE;
+ free_entries[i] = FALSE;
expected_num_entries++;
if ( i > expected_max_idx ) {
@@ -8824,7 +8897,7 @@ verify_mdjsc_callback_execution(void)
expected_table_len *= 2;
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -8943,7 +9016,7 @@ verify_mdjsc_callback_execution(void)
/* 15) Deregister some of the callbacks. */
- /* working from the top downwards, de-register all entries with
+ /* working from the top downwards, de-register all entries with
* indicies not divisible by 8.
*/
@@ -8954,10 +9027,10 @@ verify_mdjsc_callback_execution(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]);
indicies[i] = -1;
- free_entries[i] = TRUE;
+ free_entries[i] = TRUE;
expected_num_entries--;
- if ( i == expected_max_idx )
+ if ( i == expected_max_idx )
{
double fraction_in_use;
@@ -8970,12 +9043,12 @@ verify_mdjsc_callback_execution(void)
fraction_in_use = ((double)expected_num_entries) /
((double)expected_table_len);
- while ( ( expected_max_idx < (expected_table_len / 2) )
+ while ( ( expected_max_idx < (expected_table_len / 2) )
&&
- ( fraction_in_use <
- H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
+ ( fraction_in_use <
+ H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
&&
- ( (expected_table_len / 2) >=
+ ( (expected_table_len / 2) >=
H5C2__MIN_MDJSC_CB_TBL_LEN )
)
{
@@ -8983,8 +9056,8 @@ verify_mdjsc_callback_execution(void)
}
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
- expected_num_entries,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ expected_num_entries,
expected_max_idx,
free_entries);
}
@@ -9123,10 +9196,10 @@ verify_mdjsc_callback_execution(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]);
indicies[i] = -1;
- free_entries[i] = TRUE;
+ free_entries[i] = TRUE;
expected_num_entries--;
- if ( i == expected_max_idx )
+ if ( i == expected_max_idx )
{
double fraction_in_use;
@@ -9139,12 +9212,12 @@ verify_mdjsc_callback_execution(void)
fraction_in_use = ((double)expected_num_entries) /
((double)expected_table_len);
- while ( ( expected_max_idx < (expected_table_len / 2) )
+ while ( ( expected_max_idx < (expected_table_len / 2) )
&&
- ( fraction_in_use <
- H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
+ ( fraction_in_use <
+ H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
&&
- ( (expected_table_len / 2) >=
+ ( (expected_table_len / 2) >=
H5C2__MIN_MDJSC_CB_TBL_LEN )
)
{
@@ -9152,8 +9225,8 @@ verify_mdjsc_callback_execution(void)
}
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
- expected_num_entries,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ expected_num_entries,
expected_max_idx,
free_entries);
}
@@ -9196,7 +9269,7 @@ verify_mdjsc_callback_execution(void)
#endif
if ( show_progress ) {
- HDfprintf(stdout, "%s%d cp = %d done.\n",
+ HDfprintf(stdout, "%s%d cp = %d done.\n",
fcn_name, (int)pass2, cp++);
HDfflush(stdout);
}
@@ -9210,8 +9283,8 @@ verify_mdjsc_callback_execution(void)
*
* Function: verify_mdjsc_callback_registration_deregistration()
*
- * Purpose: Run a variety of tests to verify that the metadata
- * journaling status change callback registration and
+ * Purpose: Run a variety of tests to verify that the metadata
+ * journaling status change callback registration and
* deregistration works as expected.
*
* If all tests pass, do nothing.
@@ -9225,13 +9298,13 @@ verify_mdjsc_callback_execution(void)
*
* Programmer: John Mainzer
* 8/15/08
- *
+ *
**************************************************************************/
static void
verify_mdjsc_callback_registration_deregistration(void)
{
- const char * fcn_name =
+ const char * fcn_name =
"verify_mdjsc_callback_registration_deregistration():";
char filename[512];
char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1];
@@ -9282,7 +9355,7 @@ verify_mdjsc_callback_registration_deregistration(void)
* 7) In LIFO order, deregister (H5C2__MIN_MDJSC_CB_TBL_LEN / 2) + 1
* callbacks in LIFO order. Verify that the entries are deregistered,
* and that the table has not changed size.
- *
+ *
* 8) Again, in LIFO order, deregister another callback. Verify that
* the callback is deregistered, and that the table has been reduced
* in size to H5C2__MIN_MDJSC_CB_TBL_LEN.
@@ -9293,34 +9366,34 @@ verify_mdjsc_callback_registration_deregistration(void)
* that all callbacks are registered, and that the table lenght grows
* to 16 * H5C2__MIN_MDJSC_CB_TBL_LEN.
*
- * 11) Deregister all callbacks with even indicies. Verify the
+ * 11) Deregister all callbacks with even indicies. Verify the
* deregistrations. Verify that the table does not shrink.
*
- * 12) Register a callback. Verify that it is place in one of the
+ * 12) Register a callback. Verify that it is place in one of the
* slots freed by the dergistrations in 11) above.
*
* 13) Starting with the lowest index, deregister all the callbacks.
- * Verify the deregistrations, and also verify that the table
+ * Verify the deregistrations, and also verify that the table
* does not shrink until the last callback is de-registered.
*
* 14) Register 8 * H5C2__MIN_MDJSC_CB_TBL_LEN + 1 callbacks. Verify
* that all callbacks are registered, and that the table length grows
* to 16 * H5C2__MIN_MDJSC_CB_TBL_LEN.
*
- * 15) Starting with the highest index, deregister all entries with
+ * 15) Starting with the highest index, deregister all entries with
* index not divisible by H5C2__MIN_MDJSC_CB_TBL_LEN / 2. Verify
* that the callbacks are de-registers, and that the table does
* not shrink
*
- * 16) Register H5C2__MIN_MDJSC_CB_TBL_LEN / 2 callbacks. Verify that
+ * 16) Register H5C2__MIN_MDJSC_CB_TBL_LEN / 2 callbacks. Verify that
* they are placed in slots freed by the dergistrations in 15) above.
*
- * 17) Starting with the lowest index, deregister all entries with
- * index with index >= H5C2__MIN_MDJSC_CB_TBL_LEN and not divisible
- * by H5C2__MIN_MDJSC_CB_TBL_LEN. Verify that the callbacks are
+ * 17) Starting with the lowest index, deregister all entries with
+ * index with index >= H5C2__MIN_MDJSC_CB_TBL_LEN and not divisible
+ * by H5C2__MIN_MDJSC_CB_TBL_LEN. Verify that the callbacks are
* deregistered, and that the table does not shrink.
*
- * 18) Register a callback. Verify that it is place in one of the
+ * 18) Register a callback. Verify that it is place in one of the
* slots freed by the dergistrations in 17) above.
*
* 19) Starting with the highest index, deregister all callbacks.
@@ -9391,7 +9464,7 @@ verify_mdjsc_callback_registration_deregistration(void)
/* clean out any existing journal file */
HDremove(journal_filename);
setup_cache_for_journaling(filename, journal_filename, &file_id,
- &file_ptr, &cache_ptr, TRUE, FALSE);
+ &file_ptr, &cache_ptr, TRUE, FALSE, FALSE);
/* 2) Register a callback. Verify that is is added correctly to
@@ -9402,11 +9475,11 @@ verify_mdjsc_callback_registration_deregistration(void)
register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback,
&(counters[j]), &(indicies[j]));
- free_entries[j] = FALSE;
+ free_entries[j] = FALSE;
expected_num_entries++;
expected_max_idx = 0;
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -9426,11 +9499,11 @@ verify_mdjsc_callback_registration_deregistration(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[j]);
- free_entries[j] = TRUE;
+ free_entries[j] = TRUE;
expected_num_entries--;
expected_max_idx = -1;
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -9451,11 +9524,11 @@ verify_mdjsc_callback_registration_deregistration(void)
register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback,
&(counters[j]), &(indicies[j]));
- free_entries[j] = FALSE;
+ free_entries[j] = FALSE;
expected_num_entries++;
expected_max_idx++;
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -9482,7 +9555,7 @@ verify_mdjsc_callback_registration_deregistration(void)
HDfflush(stdout);
}
- free_entries[j] = FALSE;
+ free_entries[j] = FALSE;
expected_num_entries++;
expected_max_idx++;
@@ -9492,7 +9565,7 @@ verify_mdjsc_callback_registration_deregistration(void)
HDfflush(stdout);
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -9518,12 +9591,12 @@ verify_mdjsc_callback_registration_deregistration(void)
register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback,
&(counters[j]), &(indicies[j]));
- free_entries[j] = FALSE;
+ free_entries[j] = FALSE;
expected_num_entries++;
expected_max_idx++;
expected_table_len *= 2;
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -9547,11 +9620,11 @@ verify_mdjsc_callback_registration_deregistration(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[j]);
- free_entries[j] = TRUE;
+ free_entries[j] = TRUE;
expected_num_entries--;
expected_max_idx--;
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -9572,12 +9645,12 @@ verify_mdjsc_callback_registration_deregistration(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[j]);
- free_entries[j] = TRUE;
+ free_entries[j] = TRUE;
expected_num_entries--;
expected_max_idx--;
expected_table_len /= 2;
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -9587,7 +9660,7 @@ verify_mdjsc_callback_registration_deregistration(void)
HDfflush(stdout);
}
-
+
/* 9) Deregister all callbacks. Verify that the table is empty.
*/
@@ -9597,11 +9670,11 @@ verify_mdjsc_callback_registration_deregistration(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[j]);
- free_entries[j] = TRUE;
+ free_entries[j] = TRUE;
expected_num_entries--;
expected_max_idx--;
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -9625,7 +9698,7 @@ verify_mdjsc_callback_registration_deregistration(void)
HDassert( indicies[i] == i );
- free_entries[i] = FALSE;
+ free_entries[i] = FALSE;
expected_num_entries++;
expected_max_idx++;
@@ -9634,7 +9707,7 @@ verify_mdjsc_callback_registration_deregistration(void)
expected_table_len *= 2;
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -9648,9 +9721,9 @@ verify_mdjsc_callback_registration_deregistration(void)
HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++);
HDfflush(stdout);
}
+
-
- /* 11) Deregister all callbacks with even indicies. Verify the
+ /* 11) Deregister all callbacks with even indicies. Verify the
* deregistrations. Verify that the table does not shrink.
*/
@@ -9659,14 +9732,14 @@ verify_mdjsc_callback_registration_deregistration(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]);
indicies[i] = -1;
- free_entries[i] = TRUE;
+ free_entries[i] = TRUE;
expected_num_entries--;
if ( i == expected_max_idx ) {
expected_max_idx--;
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -9679,11 +9752,11 @@ verify_mdjsc_callback_registration_deregistration(void)
}
- /* 12) Register a callback. Verify that it is place in one of the
+ /* 12) Register a callback. Verify that it is place in one of the
* slots freed by the dergistrations in 11) above.
*/
- /* The index assigned to the new callback is determined by the
+ /* The index assigned to the new callback is determined by the
* free list management algorithm. In the present implementation
* freed entries are added to the head of the free list, so the
* next index issues will be 8 * H5C2__MIN_MDJSC_CB_TBL_LEN.
@@ -9695,7 +9768,7 @@ verify_mdjsc_callback_registration_deregistration(void)
&(counters[j]), &(indicies[j]));
HDassert( indicies[j] == j ); /* see comment above */
- free_entries[j] = FALSE;
+ free_entries[j] = FALSE;
expected_num_entries++;
if ( j > expected_max_idx ) {
@@ -9703,7 +9776,7 @@ verify_mdjsc_callback_registration_deregistration(void)
expected_max_idx = j;
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -9715,27 +9788,27 @@ verify_mdjsc_callback_registration_deregistration(void)
/* 13) Starting with the lowest index, deregister all the callbacks.
- * Verify the deregistrations, and also verify that the table
+ * Verify the deregistrations, and also verify that the table
* does not shrink until the last callback is de-registered.
*/
for ( i = 0; i < (8 * H5C2__MIN_MDJSC_CB_TBL_LEN) + 1; i++ )
{
- if ( ! free_entries[i] )
+ if ( ! free_entries[i] )
{
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]);
indicies[i] = -1;
- free_entries[i] = TRUE;
+ free_entries[i] = TRUE;
expected_num_entries--;
- if ( i == expected_max_idx )
+ if ( i == expected_max_idx )
{
expected_max_idx = -1;
expected_table_len = H5C2__MIN_MDJSC_CB_TBL_LEN;
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -9746,7 +9819,7 @@ verify_mdjsc_callback_registration_deregistration(void)
HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++);
HDfflush(stdout);
}
-
+
/* 14) Register 8 * H5C2__MIN_MDJSC_CB_TBL_LEN + 1 callbacks. Verify
* that all callbacks are registered, and that the table length grows
@@ -9760,7 +9833,7 @@ verify_mdjsc_callback_registration_deregistration(void)
HDassert( indicies[i] == i );
- free_entries[i] = FALSE;
+ free_entries[i] = FALSE;
expected_num_entries++;
expected_max_idx++;
@@ -9769,7 +9842,7 @@ verify_mdjsc_callback_registration_deregistration(void)
expected_table_len *= 2;
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -9783,9 +9856,9 @@ verify_mdjsc_callback_registration_deregistration(void)
HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++);
HDfflush(stdout);
}
+
-
- /* 15) Starting with the highest index, deregister all entries with
+ /* 15) Starting with the highest index, deregister all entries with
* index not divisible by H5C2__MIN_MDJSC_CB_TBL_LEN / 2. Verify
* that the callbacks are de-registers, and that the table does
* not shrink
@@ -9799,15 +9872,15 @@ verify_mdjsc_callback_registration_deregistration(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]);
indicies[i] = -1;
- free_entries[i] = TRUE;
+ free_entries[i] = TRUE;
expected_num_entries--;
- if ( i == expected_max_idx )
+ if ( i == expected_max_idx )
{
expected_max_idx = -1;
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -9818,13 +9891,13 @@ verify_mdjsc_callback_registration_deregistration(void)
HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++);
HDfflush(stdout);
}
+
-
- /* 16) Register H5C2__MIN_MDJSC_CB_TBL_LEN / 2 callbacks. Verify that
+ /* 16) Register H5C2__MIN_MDJSC_CB_TBL_LEN / 2 callbacks. Verify that
* they are placed in slots freed by the dergistrations in 15) above.
*/
- /* The index assigned to the new callback is determined by the
+ /* The index assigned to the new callback is determined by the
* free list management algorithm. In the present implementation
* freed entries are added to the head of the free list, so the
* next index issues will be 1.
@@ -9843,7 +9916,7 @@ verify_mdjsc_callback_registration_deregistration(void)
&(counters[j]), &(indicies[j]));
HDassert( indicies[j] == j ); /* see comment above */
- free_entries[j] = FALSE;
+ free_entries[j] = FALSE;
expected_num_entries++;
if ( j > expected_max_idx ) {
@@ -9851,7 +9924,7 @@ verify_mdjsc_callback_registration_deregistration(void)
expected_max_idx = j;
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -9865,14 +9938,14 @@ verify_mdjsc_callback_registration_deregistration(void)
}
- /* 17) Starting with the lowest index, deregister all entries with
- * index with index >= H5C2__MIN_MDJSC_CB_TBL_LEN and not divisible
- * by H5C2__MIN_MDJSC_CB_TBL_LEN. Verify that the callbacks are
+ /* 17) Starting with the lowest index, deregister all entries with
+ * index with index >= H5C2__MIN_MDJSC_CB_TBL_LEN and not divisible
+ * by H5C2__MIN_MDJSC_CB_TBL_LEN. Verify that the callbacks are
* deregistered, and that the table does not shrink.
*/
- for ( i = H5C2__MIN_MDJSC_CB_TBL_LEN;
- i < (8 * H5C2__MIN_MDJSC_CB_TBL_LEN) + 1;
+ for ( i = H5C2__MIN_MDJSC_CB_TBL_LEN;
+ i < (8 * H5C2__MIN_MDJSC_CB_TBL_LEN) + 1;
i++ )
{
if ( ( ! free_entries[i] ) &&
@@ -9881,15 +9954,15 @@ verify_mdjsc_callback_registration_deregistration(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]);
indicies[i] = -1;
- free_entries[i] = TRUE;
+ free_entries[i] = TRUE;
expected_num_entries--;
- if ( i == expected_max_idx )
+ if ( i == expected_max_idx )
{
expected_max_idx = -1;
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -9900,13 +9973,13 @@ verify_mdjsc_callback_registration_deregistration(void)
HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++);
HDfflush(stdout);
}
+
-
- /* 18) Register a callback. Verify that it is place in one of the
+ /* 18) Register a callback. Verify that it is place in one of the
* slots freed by the dergistrations in 17) above.
*/
- /* The index assigned to the new callback is determined by the
+ /* The index assigned to the new callback is determined by the
* free list management algorithm. In the present implementation
* freed entries are added to the head of the free list, so the
* next index issues will be (7 * H5C2__MIN_MDJSC_CB_TBL_LEN) +
@@ -9919,7 +9992,7 @@ verify_mdjsc_callback_registration_deregistration(void)
&(counters[j]), &(indicies[j]));
HDassert( indicies[j] == j ); /* see comment above */
- free_entries[j] = FALSE;
+ free_entries[j] = FALSE;
expected_num_entries++;
if ( j > expected_max_idx ) {
@@ -9927,7 +10000,7 @@ verify_mdjsc_callback_registration_deregistration(void)
expected_max_idx = j;
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
@@ -9949,10 +10022,10 @@ verify_mdjsc_callback_registration_deregistration(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]);
indicies[i] = -1;
- free_entries[i] = TRUE;
+ free_entries[i] = TRUE;
expected_num_entries--;
- if ( i == expected_max_idx )
+ if ( i == expected_max_idx )
{
double fraction_in_use;
@@ -9966,9 +10039,9 @@ verify_mdjsc_callback_registration_deregistration(void)
((double)expected_table_len);
- if ( ( expected_max_idx < (expected_table_len / 2) )
+ if ( ( expected_max_idx < (expected_table_len / 2) )
&&
- ( fraction_in_use < H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
+ ( fraction_in_use < H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
&&
( (expected_table_len / 2) >= H5C2__MIN_MDJSC_CB_TBL_LEN )
)
@@ -9977,7 +10050,7 @@ verify_mdjsc_callback_registration_deregistration(void)
}
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -9988,7 +10061,7 @@ verify_mdjsc_callback_registration_deregistration(void)
HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++);
HDfflush(stdout);
}
-
+
/* 20) Do a torture tests -- forcing the number of registered callbacks
* into the thousands. After each registration and deregistration,
@@ -10004,7 +10077,7 @@ verify_mdjsc_callback_registration_deregistration(void)
HDassert( indicies[i] == i );
- free_entries[i] = FALSE;
+ free_entries[i] = FALSE;
expected_num_entries++;
expected_max_idx++;
@@ -10013,7 +10086,7 @@ verify_mdjsc_callback_registration_deregistration(void)
expected_table_len *= 2;
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -10027,8 +10100,8 @@ verify_mdjsc_callback_registration_deregistration(void)
HDfflush(stdout);
}
-
- /* Starting from 3 * max_callbacks / 8 and working down to
+
+ /* Starting from 3 * max_callbacks / 8 and working down to
* max_callbacks / 8, deregister the odd index callbacks.
*/
for ( i = (3 * max_callbacks / 8); i >= max_callbacks / 8; i-- )
@@ -10038,10 +10111,10 @@ verify_mdjsc_callback_registration_deregistration(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]);
indicies[i] = -1;
- free_entries[i] = TRUE;
+ free_entries[i] = TRUE;
expected_num_entries--;
- if ( i == expected_max_idx )
+ if ( i == expected_max_idx )
{
double fraction_in_use;
@@ -10055,9 +10128,9 @@ verify_mdjsc_callback_registration_deregistration(void)
((double)expected_table_len);
- if ( ( expected_max_idx < (expected_table_len / 2) )
+ if ( ( expected_max_idx < (expected_table_len / 2) )
&&
- ( fraction_in_use < H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
+ ( fraction_in_use < H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
&&
( (expected_table_len / 2) >= H5C2__MIN_MDJSC_CB_TBL_LEN )
)
@@ -10066,7 +10139,7 @@ verify_mdjsc_callback_registration_deregistration(void)
}
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -10081,10 +10154,10 @@ verify_mdjsc_callback_registration_deregistration(void)
/* now re-register the callbacks just deregistered. To keep the test
* at least somewhat sane, re-register the entries in the order they
* appear in the free list, so as to maintain the indicies[i] == i
- * invarient. At present, this means re-registering entries the
+ * invarient. At present, this means re-registering entries the
* the reverse of the order they were deregistered in.
*/
-
+
for ( i = (max_callbacks / 8); i <= (3 * max_callbacks / 8); i++ )
{
if ( ( pass2 ) && ( free_entries[i] ) && ( (i % 2) == 1 ) )
@@ -10094,7 +10167,7 @@ verify_mdjsc_callback_registration_deregistration(void)
HDassert( indicies[i] == i );
- free_entries[i] = FALSE;
+ free_entries[i] = FALSE;
expected_num_entries++;
if ( i > expected_max_idx ) {
@@ -10107,7 +10180,7 @@ verify_mdjsc_callback_registration_deregistration(void)
expected_table_len *= 2;
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -10123,7 +10196,7 @@ verify_mdjsc_callback_registration_deregistration(void)
}
/* now register more entries up to max_callbacks */
-
+
for ( i = (max_callbacks / 2); i < max_callbacks; i++ )
{
if ( ( pass2 ) && ( free_entries[i] ) )
@@ -10133,7 +10206,7 @@ verify_mdjsc_callback_registration_deregistration(void)
HDassert( indicies[i] == i );
- free_entries[i] = FALSE;
+ free_entries[i] = FALSE;
expected_num_entries++;
if ( i > expected_max_idx ) {
@@ -10146,7 +10219,7 @@ verify_mdjsc_callback_registration_deregistration(void)
expected_table_len *= 2;
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
expected_num_entries, expected_max_idx,
free_entries);
}
@@ -10173,10 +10246,10 @@ verify_mdjsc_callback_registration_deregistration(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]);
indicies[i] = -1;
- free_entries[i] = TRUE;
+ free_entries[i] = TRUE;
expected_num_entries--;
- if ( i == expected_max_idx )
+ if ( i == expected_max_idx )
{
double fraction_in_use;
@@ -10189,12 +10262,12 @@ verify_mdjsc_callback_registration_deregistration(void)
fraction_in_use = ((double)expected_num_entries) /
((double)expected_table_len);
- if ( ( expected_max_idx < (expected_table_len / 2) )
+ if ( ( expected_max_idx < (expected_table_len / 2) )
&&
- ( fraction_in_use <
- H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
+ ( fraction_in_use <
+ H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
&&
- ( (expected_table_len / 2) >=
+ ( (expected_table_len / 2) >=
H5C2__MIN_MDJSC_CB_TBL_LEN )
)
{
@@ -10202,8 +10275,8 @@ verify_mdjsc_callback_registration_deregistration(void)
}
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
- expected_num_entries,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ expected_num_entries,
expected_max_idx,
free_entries);
}
@@ -10217,7 +10290,7 @@ verify_mdjsc_callback_registration_deregistration(void)
}
- /* working from the top downwards, de-register all entries with
+ /* working from the top downwards, de-register all entries with
* indicies not divisible by 3.
*/
@@ -10228,10 +10301,10 @@ verify_mdjsc_callback_registration_deregistration(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]);
indicies[i] = -1;
- free_entries[i] = TRUE;
+ free_entries[i] = TRUE;
expected_num_entries--;
- if ( i == expected_max_idx )
+ if ( i == expected_max_idx )
{
double fraction_in_use;
@@ -10244,12 +10317,12 @@ verify_mdjsc_callback_registration_deregistration(void)
fraction_in_use = ((double)expected_num_entries) /
((double)expected_table_len);
- while ( ( expected_max_idx < (expected_table_len / 2) )
+ while ( ( expected_max_idx < (expected_table_len / 2) )
&&
- ( fraction_in_use <
- H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
+ ( fraction_in_use <
+ H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
&&
- ( (expected_table_len / 2) >=
+ ( (expected_table_len / 2) >=
H5C2__MIN_MDJSC_CB_TBL_LEN )
)
{
@@ -10257,8 +10330,8 @@ verify_mdjsc_callback_registration_deregistration(void)
}
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
- expected_num_entries,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ expected_num_entries,
expected_max_idx,
free_entries);
}
@@ -10270,7 +10343,7 @@ verify_mdjsc_callback_registration_deregistration(void)
HDfflush(stdout);
}
-
+
/* working from low index up, deregister all entries with index
* greater than (max_callbacks / 8).
*/
@@ -10282,10 +10355,10 @@ verify_mdjsc_callback_registration_deregistration(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]);
indicies[i] = -1;
- free_entries[i] = TRUE;
+ free_entries[i] = TRUE;
expected_num_entries--;
- if ( i == expected_max_idx )
+ if ( i == expected_max_idx )
{
double fraction_in_use;
@@ -10298,12 +10371,12 @@ verify_mdjsc_callback_registration_deregistration(void)
fraction_in_use = ((double)expected_num_entries) /
((double)expected_table_len);
- while ( ( expected_max_idx < (expected_table_len / 2) )
+ while ( ( expected_max_idx < (expected_table_len / 2) )
&&
- ( fraction_in_use <
- H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
+ ( fraction_in_use <
+ H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
&&
- ( (expected_table_len / 2) >=
+ ( (expected_table_len / 2) >=
H5C2__MIN_MDJSC_CB_TBL_LEN )
)
{
@@ -10311,8 +10384,8 @@ verify_mdjsc_callback_registration_deregistration(void)
}
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
- expected_num_entries,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ expected_num_entries,
expected_max_idx,
free_entries);
}
@@ -10336,10 +10409,10 @@ verify_mdjsc_callback_registration_deregistration(void)
deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]);
indicies[i] = -1;
- free_entries[i] = TRUE;
+ free_entries[i] = TRUE;
expected_num_entries--;
- if ( i == expected_max_idx )
+ if ( i == expected_max_idx )
{
double fraction_in_use;
@@ -10352,12 +10425,12 @@ verify_mdjsc_callback_registration_deregistration(void)
fraction_in_use = ((double)expected_num_entries) /
((double)expected_table_len);
- while ( ( expected_max_idx < (expected_table_len / 2) )
+ while ( ( expected_max_idx < (expected_table_len / 2) )
&&
- ( fraction_in_use <
- H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
+ ( fraction_in_use <
+ H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO )
&&
- ( (expected_table_len / 2) >=
+ ( (expected_table_len / 2) >=
H5C2__MIN_MDJSC_CB_TBL_LEN )
)
{
@@ -10365,8 +10438,8 @@ verify_mdjsc_callback_registration_deregistration(void)
}
}
- verify_mdjsc_table_config(cache_ptr, expected_table_len,
- expected_num_entries,
+ verify_mdjsc_table_config(cache_ptr, expected_table_len,
+ expected_num_entries,
expected_max_idx,
free_entries);
}
@@ -10408,7 +10481,7 @@ verify_mdjsc_callback_registration_deregistration(void)
#endif
if ( show_progress ) {
- HDfprintf(stdout, "%s%d cp = %d done.\n",
+ HDfprintf(stdout, "%s%d cp = %d done.\n",
fcn_name, (int)pass2, cp++);
HDfflush(stdout);
}
@@ -10422,7 +10495,7 @@ verify_mdjsc_callback_registration_deregistration(void)
* Function: check_buffer_writes
*
* Purpose: Verify the function H5C_jb__write_to_buffer properly writes
- * messages of varying sizes into the journal buffers, and
+ * messages of varying sizes into the journal buffers, and
* that the journal buffers properly flush out when filled.
*
* Return: void
@@ -10431,13 +10504,13 @@ verify_mdjsc_callback_registration_deregistration(void)
* Thursday, February 21, 2008
*
* Changes: John Mainzer -- 4/16/09
- * Updated for the addition of new parameters to
+ * Updated for the addition of new parameters to
* H5C2_jb__init().
- *
+ *
**************************************************************************/
-static void
-check_buffer_writes(void)
+static void
+check_buffer_writes(hbool_t use_aio)
{
const char * fcn_name = "check_buffer_writes(): ";
char filename[512];
@@ -10450,7 +10523,14 @@ check_buffer_writes(void)
char filldata[12][100];
int repeatnum[12];
- TESTING("metadata buffer & file writes");
+ if ( use_aio ) {
+
+ TESTING("metadata buffer & file aio writes");
+
+ } else {
+
+ TESTING("metadata buffer & file sio writes");
+ }
pass2 = TRUE;
@@ -10461,16 +10541,16 @@ check_buffer_writes(void)
HDmemcpy(filldata[3], "ZAB-ZAB-ZAB-ZAB-ZAB-ZAB-ZAB-ZA\n", 32);
HDmemcpy(filldata[4], "ABC-ABC-ABC-ABC-ABC-ABC-ABC-ABC\n", 33);
HDmemcpy(filldata[5], "BCD-BCD-BCD-BCD-BCD-BCD-BCD-BCD-\n", 34);
- HDmemcpy(filldata[6], "12345-12345-12345-12345-12345-12345-12345-1234\n",
+ HDmemcpy(filldata[6], "12345-12345-12345-12345-12345-12345-12345-1234\n",
48);
- HDmemcpy(filldata[7], "01234-01234-01234-01234-01234-01234-01234-01234\n",
+ HDmemcpy(filldata[7], "01234-01234-01234-01234-01234-01234-01234-01234\n",
49);
HDmemcpy(filldata[8], "23456-23456-23456-23456-23456-23456-23456-23456-\n",
50);
HDmemcpy(filldata[9], "aaaa-bbbb-cccc-dddd-eeee-ffff-gggg-hhhh-iiii-jjjj-kkkk-llll-mmmm-nnnn-oooo-pppp-qqqq-rrrr-ssss\n", 96);
HDmemcpy(filldata[10], "bbbb-cccc-dddd-eeee-ffff-gggg-hhhh-iiii-jjjj-kkkk-llll-mmmm-nnnn-oooo-pppp-qqqq-rrrr-ssss-tttt-\n", 97);
HDmemcpy(filldata[11], "cccc-dddd-eeee-ffff-gggg-hhhh-iiii-jjjj-kkkk-llll-mmmm-nnnn-oooo-pppp-qqqq-rrrr-ssss-tttt-uuuu-v\n", 98);
-
+
/* Assert that size of data is as expected */
HDassert(HDstrlen(filldata[0]) == 15);
HDassert(HDstrlen(filldata[1]) == 16);
@@ -10487,9 +10567,9 @@ check_buffer_writes(void)
/* Give structure its magic number */
jbrb_struct.magic = H5C2__H5C2_JBRB_T_MAGIC;
-
- if ( show_progress ) /* 1 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+
+ if ( show_progress ) /* 1 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* setup the file name */
@@ -10504,25 +10584,25 @@ check_buffer_writes(void)
} /* end if */
} /* end if */
-
- if ( show_progress ) /* 2 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+
+ if ( show_progress ) /* 2 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Initialize H5C2_jbrb_t structure. */
if ( pass2 ) {
- /* Note that the sizeof_addr & sizeof_size parameters are
+ /* Note that the sizeof_addr & sizeof_size parameters are
* ignored when human_readable is TRUE.
*/
- result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
+ result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
/* journal_magic */ 123,
/* HDF5 file name */ HDF5_FILE_NAME,
- /* journal file name */ filename,
- /* Buffer size */ 16,
- /* Number of Buffers */ 3,
- /* Use Synchronois I/O */ FALSE,
+ /* journal file name */ filename,
+ /* Buffer size */ 16,
+ /* Number of Buffers */ 3,
+ /* Use Synchronois I/O */ use_aio,
/* human readable journal */ TRUE,
/* sizeof_addr */ 8,
/* sizeof_size */ 8);
@@ -10545,24 +10625,24 @@ check_buffer_writes(void)
failure_mssg2 = "H5C2_jb__write_header_entry failed";
}
}
-
- if ( show_progress ) /* 3 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+
+ if ( show_progress ) /* 3 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Flush and truncate journal file to get rid of the header
* message for subsequent tests. */
if ( pass2 ) {
-
+
if ( H5C2_jb__flush(&jbrb_struct) != SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb_flush failed";
- } /* end if */
+ } /* end if */
} /* end if */
-
+
/* Truncate journal file */
if ( pass2 ) {
@@ -10575,38 +10655,38 @@ check_buffer_writes(void)
} /* end if */
- if ( show_progress ) /* 4 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 4 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* open journal file for reading */
readback = fopen(filename, "r");
- /* run a collection of calls to write_flush_verify(). These calls
- * write specific lengths of data into the journal buffers and
- * then flushes them to disk, and ensures that what makes it to
- * disk is as expected
+ /* run a collection of calls to write_flush_verify(). These calls
+ * write specific lengths of data into the journal buffers and
+ * then flushes them to disk, and ensures that what makes it to
+ * disk is as expected
*/
for (i=0; i<12; i++) {
- write_flush_verify(&jbrb_struct,
- (int)HDstrlen(filldata[i]),
- filldata[i],
+ write_flush_verify(&jbrb_struct,
+ (int)HDstrlen(filldata[i]),
+ filldata[i],
readback);
if ( show_progress )
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
} /* end for */
- /* run a collection of calls to write_noflush_verify(). These
- * calls write specific lengths of data into the journal buffers
- * multiple times, but only flushes at the end of the set of writes.
- * This tests to ensure that the automatic flush calls in
- * H5C2_jb__write_to_buffer are working properly. The routine then
- * ensures that what makes it it disk is as expected
+ /* run a collection of calls to write_noflush_verify(). These
+ * calls write specific lengths of data into the journal buffers
+ * multiple times, but only flushes at the end of the set of writes.
+ * This tests to ensure that the automatic flush calls in
+ * H5C2_jb__write_to_buffer are working properly. The routine then
+ * ensures that what makes it it disk is as expected
*/
/* Initialize repeat array to specify how many times to repeat each write
@@ -10631,13 +10711,13 @@ check_buffer_writes(void)
filldata[i],
readback,
repeatnum[i]);
-
+
if ( show_progress )
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
} /* end for */
-
+
/* close journal file pointer */
fclose(readback);
@@ -10685,7 +10765,7 @@ check_buffer_writes(void)
/***************************************************************************
* Function: write_flush_verify
*
- * Purpose: Helper function for check_buffer_writes test. Writes a
+ * Purpose: Helper function for check_buffer_writes test. Writes a
* piece of data of specified size into the journal buffer, then
* flushes the journal buffers. The data is read back and
* verified for correctness.
@@ -10694,19 +10774,19 @@ check_buffer_writes(void)
*
* Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
* Thursday, February 21, 2008
- *
+ *
**************************************************************************/
-static void
-write_flush_verify(H5C2_jbrb_t * struct_ptr,
- int size,
- char * data,
+static void
+write_flush_verify(H5C2_jbrb_t * struct_ptr,
+ int size,
+ char * data,
FILE * readback)
{
char verify[150];
if ( pass2 ) {
- if ( H5C2_jb__write_to_buffer(struct_ptr, (size_t)size,
+ if ( H5C2_jb__write_to_buffer(struct_ptr, (size_t)size,
data, 0, (uint64_t)0) != SUCCEED ) {
pass2 = FALSE;
@@ -10730,7 +10810,7 @@ write_flush_verify(H5C2_jbrb_t * struct_ptr,
if ( pass2 ) {
fgets(verify, size+10, readback);
-
+
if (HDstrcmp(verify, data) != 0) {
pass2 = FALSE;
@@ -10749,10 +10829,10 @@ write_flush_verify(H5C2_jbrb_t * struct_ptr,
/***************************************************************************
* Function: write_noflush_verify
*
- * Purpose: Helper function for check_buffer_writes test. Writes a
+ * Purpose: Helper function for check_buffer_writes test. Writes a
* piece of data of specified size into the journal buffer
* multiple times, without calling H5C_jb__flush in between
- * writes. After all writes are completed, H5C_jb__flush is
+ * writes. After all writes are completed, H5C_jb__flush is
* called, and the data is read back from the journal file and
* verified for correctness.
*
@@ -10760,23 +10840,23 @@ write_flush_verify(H5C2_jbrb_t * struct_ptr,
*
* Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
* Thursday, February 21, 2008
- *
+ *
**************************************************************************/
-static void
-write_noflush_verify(H5C2_jbrb_t * struct_ptr,
- int size,
- char * data,
- FILE * readback,
+static void
+write_noflush_verify(H5C2_jbrb_t * struct_ptr,
+ int size,
+ char * data,
+ FILE * readback,
int repeats)
{
int i;
- char verify[150];
+ char verify[150];
for (i=0; i<repeats; i++) {
if ( pass2 ) {
-
- if ( H5C2_jb__write_to_buffer(struct_ptr, (size_t)size,
+
+ if ( H5C2_jb__write_to_buffer(struct_ptr, (size_t)size,
data, 0, (uint64_t)0) != SUCCEED ) {
pass2 = FALSE;
@@ -10795,7 +10875,7 @@ write_noflush_verify(H5C2_jbrb_t * struct_ptr,
pass2 = FALSE;
failure_mssg2 = "H5C2_jb_flush failed";
- } /* end if */
+ } /* end if */
} /* end if */
@@ -10836,11 +10916,11 @@ write_noflush_verify(H5C2_jbrb_t * struct_ptr,
* in which all white space is replaced with underscores.
*
* JRM -- 4/16/09
- * Updated for the addition of new parameters to
+ * Updated for the addition of new parameters to
* H5C2_jb__init().
- *
+ *
**************************************************************************/
-static void
+static void
check_message_format(void)
{
const char * fcn_name = "check_message_format(): ";
@@ -10880,17 +10960,17 @@ check_message_format(void)
/* Initialize H5C2_jbrb_t structure. */
if ( pass2 ) {
- /* Note that the sizeof_addr & sizeof_size parameters are
+ /* Note that the sizeof_addr & sizeof_size parameters are
* ignored when human_readable is TRUE.
*/
- result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
+ result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
/* journal_magic */ 123,
/* HDF5 file name */ HDF5_FILE_NAME,
- /* journal file name */ filename,
- /* Buffer size */ 16,
- /* Number of Buffers */ 3,
- /* Use Synchronois I/O */ FALSE,
+ /* journal file name */ filename,
+ /* Buffer size */ 16,
+ /* Number of Buffers */ 3,
+ /* Use Synchronois I/O */ FALSE,
/* human readable journal */ TRUE,
/* sizeof_addr */ 8,
/* sizeof_size */ 8);
@@ -10904,17 +10984,17 @@ check_message_format(void)
} /* end if */
- if ( show_progress ) /* 1 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 1 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
-
+
/* Start a transaction */
if ( pass2 ) {
- if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)1)
+ if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)1)
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__start_transaction failed";
@@ -10922,20 +11002,20 @@ check_message_format(void)
} /* end if */
- if ( show_progress ) /* 2 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 2 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
-
+
/* Write a journal entry */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)1,
- /* base address */ (haddr_t)0,
- /* data length */ 1,
- /* data */ (const uint8_t *)"A")
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)1,
+ /* base address */ (haddr_t)0,
+ /* data length */ 1,
+ /* data */ (const uint8_t *)"A")
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__journal_entry failed";
@@ -10943,20 +11023,20 @@ check_message_format(void)
} /* end if */
- if ( show_progress ) /* 3 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 3 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
-
+
/* Write a journal entry */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)1,
- /* base address */ (haddr_t)1,
- /* data length */ 2,
- /* data */ (const uint8_t *)"AB")
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)1,
+ /* base address */ (haddr_t)1,
+ /* data length */ 2,
+ /* data */ (const uint8_t *)"AB")
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__journal_entry failed";
@@ -10964,20 +11044,20 @@ check_message_format(void)
} /* end if */
- if ( show_progress ) /* 4 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 4 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
-
+
/* Write a journal entry */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)1,
- /* base address */ (haddr_t)3,
- /* data length */ 4,
- /* data */ (const uint8_t *)"CDEF")
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)1,
+ /* base address */ (haddr_t)3,
+ /* data length */ 4,
+ /* data */ (const uint8_t *)"CDEF")
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__journal_entry failed";
@@ -10985,34 +11065,34 @@ check_message_format(void)
} /* end if */
- if ( show_progress ) /* 5 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 5 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
-
+
/* End transaction */
if ( pass2 ) {
- if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)1)
+ if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)1)
!= SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__end_transaction failed";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 6 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 6 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Start a transaction */
if ( pass2 ) {
- if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)2)
+ if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)2)
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__start_transaction failed";
@@ -11020,20 +11100,20 @@ check_message_format(void)
} /* end if */
- if ( show_progress ) /* 7 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 7 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write a journal entry */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)2,
- /* base address */ (haddr_t)285,
- /* data length */ 11,
- /* data */ (const uint8_t *)"Test Data?!")
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)2,
+ /* base address */ (haddr_t)285,
+ /* data length */ 11,
+ /* data */ (const uint8_t *)"Test Data?!")
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__journal_entry failed";
@@ -11041,31 +11121,31 @@ check_message_format(void)
} /* end if */
- if ( show_progress ) /* 8 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 8 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* End transaction */
if ( pass2 ) {
- if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)2)
+ if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)2)
!= SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__end_transaction failed";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 9 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 9 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Flush the journal buffers. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -11117,8 +11197,8 @@ check_message_format(void)
}
}
- if ( show_progress ) /* 10 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 10 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
if ( pass2 ) {
@@ -11146,9 +11226,9 @@ check_message_format(void)
if ( show_progress ) {
- HDfprintf(stdout, "verify[%d] = \"%s\"\n",
+ HDfprintf(stdout, "verify[%d] = \"%s\"\n",
i, verify[i]);
- HDfprintf(stdout, "from_journal[%d] = \"%s\"\n",
+ HDfprintf(stdout, "from_journal[%d] = \"%s\"\n",
i, from_journal[i]);
}
@@ -11160,7 +11240,7 @@ check_message_format(void)
} /* end if */
} /* end for */
-
+
fclose(readback);
}
@@ -11176,17 +11256,17 @@ check_message_format(void)
} /* end if */
- if ( show_progress ) /* 11 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 11 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Start a transaction */
if ( pass2 ) {
- if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)3)
+ if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)3)
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__start_transaction failed";
@@ -11194,20 +11274,20 @@ check_message_format(void)
} /* end if */
- if ( show_progress ) /* 12 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 12 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write a journal entry */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)3,
- /* base address */ (haddr_t)28591,
- /* data length */ 6,
- /* data */ (const uint8_t *)"#1nN`}")
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)3,
+ /* base address */ (haddr_t)28591,
+ /* data length */ 6,
+ /* data */ (const uint8_t *)"#1nN`}")
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__journal_entry failed";
@@ -11215,65 +11295,65 @@ check_message_format(void)
} /* end if */
- if ( show_progress ) /* 13 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 13 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* End transaction */
if ( pass2 ) {
- if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)3)
+ if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)3)
!= SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__end_transaction failed";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 14 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 14 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Add a comment */
if ( pass2 ) {
- if ( H5C2_jb__comment(/* H5C2_jbrb_t */ &jbrb_struct,
- /* comment message */ "This is a comment!")
+ if ( H5C2_jb__comment(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* comment message */ "This is a comment!")
!= SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__comment failed";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 14 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 14 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Add a comment */
if ( pass2 ) {
- if ( H5C2_jb__comment(/* H5C2_jbrb_t */ &jbrb_struct,
- /* comment message */ "This is another comment!")
+ if ( H5C2_jb__comment(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* comment message */ "This is another comment!")
!= SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__comment failed";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 14 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 14 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Flush the journal buffers. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -11326,8 +11406,8 @@ check_message_format(void)
}
}
- if ( show_progress ) /* 15 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 15 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
if ( pass2 ) {
@@ -11352,9 +11432,9 @@ check_message_format(void)
if ( show_progress ) {
- HDfprintf(stdout, "verify[%d] = \"%s\"\n",
+ HDfprintf(stdout, "verify[%d] = \"%s\"\n",
i, verify[i]);
- HDfprintf(stdout, "from_journal[%d] = \"%s\"\n",
+ HDfprintf(stdout, "from_journal[%d] = \"%s\"\n",
i, from_journal[i]);
}
@@ -11394,8 +11474,8 @@ check_message_format(void)
} /* end if */
- if ( show_progress ) /* 16 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 16 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* report pass / failure information */
@@ -11417,7 +11497,7 @@ check_message_format(void)
/***************************************************************************
* Function: check_binary_message_format
*
- * Purpose: Verify that the functions that write binary messages into
+ * Purpose: Verify that the functions that write binary messages into
* the journal buffers actually write the correct messages.
*
* Note that this test was hacked from Mike's similar test
@@ -11430,10 +11510,10 @@ check_message_format(void)
* 5/2/09
*
* Changes: None.
- *
+ *
**************************************************************************/
-static void
+static void
check_binary_message_format(void)
{
const char * fcn_name = "check_binary_message_format()";
@@ -11471,17 +11551,17 @@ check_binary_message_format(void)
/* Initialize H5C2_jbrb_t structure. */
if ( pass2 ) {
- /* Note that the sizeof_addr & sizeof_size parameters are
+ /* Note that the sizeof_addr & sizeof_size parameters are
* ignored when human_readable is TRUE.
*/
- result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
+ result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
/* journal_magic */ 123,
/* HDF5 file name */ HDF5_FILE_NAME,
- /* journal file name */ filename,
- /* Buffer size */ 16,
- /* Number of Buffers */ 3,
- /* Use Synchronois I/O */ FALSE,
+ /* journal file name */ filename,
+ /* Buffer size */ 16,
+ /* Number of Buffers */ 3,
+ /* Use Synchronois I/O */ FALSE,
/* human readable journal */ FALSE,
/* sizeof_addr */ 8,
/* sizeof_size */ 8);
@@ -11495,17 +11575,17 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 1 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 1 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
-
+
/* Start a transaction */
if ( pass2 ) {
- if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)1)
+ if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)1)
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__start_transaction failed";
@@ -11513,20 +11593,20 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 2 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 2 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
-
+
/* Write a journal entry */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)1,
- /* base address */ (haddr_t)0,
- /* data length */ 1,
- /* data */ (const uint8_t *)"A")
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)1,
+ /* base address */ (haddr_t)0,
+ /* data length */ 1,
+ /* data */ (const uint8_t *)"A")
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__journal_entry failed";
@@ -11534,17 +11614,17 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 3 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 3 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write an eoa message */
if ( pass2 ) {
- if ( H5C2_jb__eoa(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__eoa(/* H5C2_jbrb_t */ &jbrb_struct,
/* eoa */ (haddr_t)0x01020304)
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__eoa failed(1)";
@@ -11552,20 +11632,20 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 4 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 4 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
-
+
/* Write a journal entry */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)1,
- /* base address */ (haddr_t)1,
- /* data length */ 2,
- /* data */ (const uint8_t *)"AB")
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)1,
+ /* base address */ (haddr_t)1,
+ /* data length */ 2,
+ /* data */ (const uint8_t *)"AB")
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__journal_entry failed";
@@ -11573,20 +11653,20 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 5 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 5 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
-
+
/* Write a journal entry */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)1,
- /* base address */ (haddr_t)3,
- /* data length */ 4,
- /* data */ (const uint8_t *)"CDEF")
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)1,
+ /* base address */ (haddr_t)3,
+ /* data length */ 4,
+ /* data */ (const uint8_t *)"CDEF")
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__journal_entry failed";
@@ -11594,34 +11674,34 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 6 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 6 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
-
+
/* End transaction */
if ( pass2 ) {
- if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)1)
+ if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)1)
!= SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__end_transaction failed (1)";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 7 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 7 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write an eoa message */
if ( pass2 ) {
- if ( H5C2_jb__eoa(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__eoa(/* H5C2_jbrb_t */ &jbrb_struct,
/* eoa */ (haddr_t)0x0102030405)
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__eoa failed(2)";
@@ -11629,17 +11709,17 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 8 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 8 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Start a transaction */
if ( pass2 ) {
- if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)2)
+ if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)2)
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__start_transaction failed";
@@ -11647,20 +11727,20 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 9 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 9 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write a journal entry */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)2,
- /* base address */ (haddr_t)285,
- /* data length */ 11,
- /* data */ (const uint8_t *)"Test Data?!")
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)2,
+ /* base address */ (haddr_t)285,
+ /* data length */ 11,
+ /* data */ (const uint8_t *)"Test Data?!")
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__journal_entry failed";
@@ -11668,31 +11748,31 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 10 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 10 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* End transaction */
if ( pass2 ) {
- if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)2)
+ if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)2)
!= SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__end_transaction failed (2)";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 11 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 11 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Flush the journal buffers. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -11744,8 +11824,8 @@ check_binary_message_format(void)
}
}
- if ( show_progress ) /* 12 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 12 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
if ( pass2 ) {
@@ -11756,8 +11836,8 @@ check_binary_message_format(void)
uint8_t expected_msg_1[] =
{
/* mssg 1: begin transaction 1 */
- /* header: */ 'b', 't', 'r', 'n',
- /* version: */ 0x00,
+ /* header: */ 'b', 't', 'r', 'n',
+ /* version: */ 0x00,
/* trans num: */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
int expected_msg_1_len = 13;
@@ -11766,7 +11846,7 @@ check_binary_message_format(void)
{
/* mssg 2: journal entry */
/* header: */ 'j', 'e', 'n', 't',
- /* version: */ 0x00,
+ /* version: */ 0x00,
/* trans num: */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* base addr: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* length: */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -11778,8 +11858,8 @@ check_binary_message_format(void)
uint8_t expected_msg_3[] =
{
/* mssg 3: eoas */
- /* header: */ 'e', 'o', 'a', 's',
- /* version: */ 0x00,
+ /* header: */ 'e', 'o', 'a', 's',
+ /* version: */ 0x00,
/* trans num: */ 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00
};
int expected_msg_3_len = 13;
@@ -11788,7 +11868,7 @@ check_binary_message_format(void)
{
/* mssg 4: journal entry */
/* header: */ 'j', 'e', 'n', 't',
- /* version: */ 0x00,
+ /* version: */ 0x00,
/* trans num: */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* base addr: */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* length: */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -11801,7 +11881,7 @@ check_binary_message_format(void)
{
/* mssg 5: journal entry */
/* header: */ 'j', 'e', 'n', 't',
- /* version: */ 0x00,
+ /* version: */ 0x00,
/* trans num: */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* base addr: */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* length: */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -11813,8 +11893,8 @@ check_binary_message_format(void)
uint8_t expected_msg_6[] =
{
/* mssg 6: end transaction 1 */
- /* header: */ 'e', 't', 'r', 'n',
- /* version: */ 0x00,
+ /* header: */ 'e', 't', 'r', 'n',
+ /* version: */ 0x00,
/* trans num: */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
int expected_msg_6_len = 13;
@@ -11822,8 +11902,8 @@ check_binary_message_format(void)
uint8_t expected_msg_7[] =
{
/* mssg 7: eoas */
- /* header: */ 'e', 'o', 'a', 's',
- /* version: */ 0x00,
+ /* header: */ 'e', 'o', 'a', 's',
+ /* version: */ 0x00,
/* trans num: */ 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00
};
int expected_msg_7_len = 13;
@@ -11831,8 +11911,8 @@ check_binary_message_format(void)
uint8_t expected_msg_8[] =
{
/* mssg 8: begin transaction 2 */
- /* header: */ 'b', 't', 'r', 'n',
- /* version: */ 0x00,
+ /* header: */ 'b', 't', 'r', 'n',
+ /* version: */ 0x00,
/* trans num: */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
int expected_msg_8_len = 13;
@@ -11841,11 +11921,11 @@ check_binary_message_format(void)
{
/* mssg 9: journal entry */
/* h9ader: */ 'j', 'e', 'n', 't',
- /* version: */ 0x00,
+ /* version: */ 0x00,
/* trans num: */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* base addr: */ 0x1d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* length: */ 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- /* body: */ 'T', 'e', 's', 't', ' ', 'D', 'a', 't',
+ /* body: */ 'T', 'e', 's', 't', ' ', 'D', 'a', 't',
'a', '?', '!',
/* chksum: */ 0x01, 0x7f, 0xf3, 0x43
};
@@ -11854,13 +11934,13 @@ check_binary_message_format(void)
uint8_t expected_msg_10[] =
{
/* mssg 10: end transaction 2 */
- /* header: */ 'e', 't', 'r', 'n',
- /* version: */ 0x00,
+ /* header: */ 'e', 't', 'r', 'n',
+ /* version: */ 0x00,
/* trans num: */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
int expected_msg_10_len = 13;
-
+
sprintf(expected_header, "0 ver_num 1 target_file_name HDF5.file journal_magic 123 creation_date %10.10s human_readable 0 offset_width 8 length_width 8\n", time_buf);
expected_header_len = HDstrlen(expected_header);
@@ -11868,14 +11948,14 @@ check_binary_message_format(void)
pass2 = FALSE;
failure_mssg2 = "Can't open journal file for test (1).";
-
- }
-
+
+ }
+
if ( pass2 ) {
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ (uint8_t *)expected_header,
+ /* fd */ fd,
+ /* expected_msg */ (uint8_t *)expected_header,
/* expected msg len */ expected_header_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual headers differ.",
@@ -11884,8 +11964,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_1,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_1,
/* expected msg len */ expected_msg_1_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual msg 1 differ.",
@@ -11894,8 +11974,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_2,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_2,
/* expected msg len */ expected_msg_2_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual msg 2 differ.",
@@ -11904,8 +11984,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_3,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_3,
/* expected msg len */ expected_msg_3_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual msg 3 differ.",
@@ -11914,8 +11994,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_4,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_4,
/* expected msg len */ expected_msg_4_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual msg 4 differ.",
@@ -11924,8 +12004,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_5,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_5,
/* expected msg len */ expected_msg_5_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual msg 5 differ.",
@@ -11934,8 +12014,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_6,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_6,
/* expected msg len */ expected_msg_6_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual msg 6 differ.",
@@ -11944,8 +12024,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_7,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_7,
/* expected msg len */ expected_msg_7_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual msg7 differ.",
@@ -11954,8 +12034,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_8,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_8,
/* expected msg len */ expected_msg_8_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual msg 8 differ.",
@@ -11964,8 +12044,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_9,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_9,
/* expected msg len */ expected_msg_9_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual msg 9 differ.",
@@ -11974,8 +12054,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_10,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_10,
/* expected msg len */ expected_msg_10_len,
/* last_msg */ TRUE,
/* mismatch failure msg */ "expected and actual msg 10 differ.",
@@ -12003,17 +12083,17 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 13 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 13 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write an eoa message */
if ( pass2 ) {
- if ( H5C2_jb__eoa(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__eoa(/* H5C2_jbrb_t */ &jbrb_struct,
/* eoa */ (haddr_t)0x010203040506)
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__eoa failed(3)";
@@ -12021,17 +12101,17 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 14 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 14 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Start a transaction */
if ( pass2 ) {
- if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)3)
+ if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)3)
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__start_transaction failed";
@@ -12039,20 +12119,20 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 15 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 15 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write a journal entry */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)3,
- /* base address */ (haddr_t)28591,
- /* data length */ 6,
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)3,
+ /* base address */ (haddr_t)28591,
+ /* data length */ 6,
/* data */ (const uint8_t *)"#1nN`}" )
!= SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__journal_entry failed";
@@ -12060,65 +12140,65 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 16 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 16 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* End transaction */
if ( pass2 ) {
- if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
- /* trans number */ (uint64_t)3)
+ if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* trans number */ (uint64_t)3)
!= SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__end_transaction failed (3)";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 17 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 17 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Add a comment */
if ( pass2 ) {
- if ( H5C2_jb__comment(/* H5C2_jbrb_t */ &jbrb_struct,
- /* comment message */ "This is a comment!")
+ if ( H5C2_jb__comment(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* comment message */ "This is a comment!")
!= SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__comment failed";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 18 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 18 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Add a comment */
if ( pass2 ) {
- if ( H5C2_jb__comment(/* H5C2_jbrb_t */ &jbrb_struct,
- /* comment message */ "This is another comment!")
+ if ( H5C2_jb__comment(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* comment message */ "This is another comment!")
!= SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__comment failed";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 19 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 19 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Flush the journal buffers. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -12171,8 +12251,8 @@ check_binary_message_format(void)
}
}
- if ( show_progress ) /* 20 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 20 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
if ( pass2 ) {
@@ -12183,8 +12263,8 @@ check_binary_message_format(void)
uint8_t expected_msg_11[] =
{
/* mssg 11: eoas */
- /* header: */ 'e', 'o', 'a', 's',
- /* version: */ 0x00,
+ /* header: */ 'e', 'o', 'a', 's',
+ /* version: */ 0x00,
/* trans num: */ 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00
};
int expected_msg_11_len = 13;
@@ -12193,8 +12273,8 @@ check_binary_message_format(void)
uint8_t expected_msg_12[] =
{
/* mssg 12: begin transaction 3 */
- /* header: */ 'b', 't', 'r', 'n',
- /* version: */ 0x00,
+ /* header: */ 'b', 't', 'r', 'n',
+ /* version: */ 0x00,
/* trans num: */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
int expected_msg_12_len = 13;
@@ -12203,7 +12283,7 @@ check_binary_message_format(void)
{
/* mssg 13: journal entry */
/* header: */ 'j', 'e', 'n', 't',
- /* version: */ 0x00,
+ /* version: */ 0x00,
/* trans num: */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* base addr: */ 0xaf, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* length: */ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -12215,12 +12295,12 @@ check_binary_message_format(void)
uint8_t expected_msg_14[] =
{
/* mssg 14: end transaction 1 */
- /* header: */ 'e', 't', 'r', 'n',
- /* version: */ 0x00,
+ /* header: */ 'e', 't', 'r', 'n',
+ /* version: */ 0x00,
/* trans num: */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
int expected_msg_14_len = 13;
-
+
sprintf(expected_header, "0 ver_num 1 target_file_name HDF5.file journal_magic 123 creation_date %10.10s human_readable 0 offset_width 8 length_width 8\n", time_buf);
expected_header_len = HDstrlen(expected_header);
@@ -12228,14 +12308,14 @@ check_binary_message_format(void)
pass2 = FALSE;
failure_mssg2 = "Can't open journal file for test (2).";
-
- }
+
+ }
if ( pass2 ) {
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ (uint8_t *)expected_header,
+ /* fd */ fd,
+ /* expected_msg */ (uint8_t *)expected_header,
/* expected msg len */ expected_header_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual headers differ.",
@@ -12244,8 +12324,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_11,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_11,
/* expected msg len */ expected_msg_11_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual msg 11 differ.",
@@ -12254,8 +12334,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_12,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_12,
/* expected msg len */ expected_msg_12_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual msg 12 differ.",
@@ -12264,8 +12344,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_13,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_13,
/* expected msg len */ expected_msg_13_len,
/* last_msg */ FALSE,
/* mismatch failure msg */ "expected and actual msg 13 differ.",
@@ -12274,8 +12354,8 @@ check_binary_message_format(void)
/* not last msg failure */ NULL);
verify_journal_msg(
- /* fd */ fd,
- /* expected_msg */ expected_msg_14,
+ /* fd */ fd,
+ /* expected_msg */ expected_msg_14,
/* expected msg len */ expected_msg_14_len,
/* last_msg */ TRUE,
/* mismatch failure msg */ "expected and actual msg 14 differ.",
@@ -12316,8 +12396,8 @@ check_binary_message_format(void)
} /* end if */
- if ( show_progress ) /* 20 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 20 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* report pass / failure information */
@@ -12339,7 +12419,7 @@ check_binary_message_format(void)
/***************************************************************************
* Function: verify_journal_msg
*
- * Purpose: Verify that the supplied expected journal message is
+ * Purpose: Verify that the supplied expected journal message is
* the next in the message in the indicated journal file.
*
* Do nothing it the expected message matches the file
@@ -12353,7 +12433,7 @@ check_binary_message_format(void)
* Programmer: J Mainzer
*
* Changes: None.
- *
+ *
**************************************************************************/
static void
@@ -12387,7 +12467,7 @@ verify_journal_msg(int fd,
}
}
- while ( ( pass2 ) && ( i < expected_msg_len ) )
+ while ( ( pass2 ) && ( i < expected_msg_len ) )
{
ret_val = read(fd, (void *)(&ch), (size_t)1);
@@ -12424,7 +12504,7 @@ verify_journal_msg(int fd,
if ( verbose ) {
- HDfprintf(stdout, "%s: read returned unexpected value (%d).\n",
+ HDfprintf(stdout, "%s: read returned unexpected value (%d).\n",
fcn_name, (int)ret_val);
}
@@ -12434,7 +12514,7 @@ verify_journal_msg(int fd,
}
i++;
-
+
}
if ( ( pass2 ) && ( last_msg ) ) {
@@ -12469,12 +12549,12 @@ verify_journal_msg(int fd,
* Tuesday, February 26, 2008
*
* Changes: JRM -- 4/16/09
- * Updated for the addition of new parameters to
+ * Updated for the addition of new parameters to
* H5C2_jb__init().
- *
+ *
**************************************************************************/
-static void
+static void
check_legal_calls(void)
{
const char * fcn_name = "check_legal_calls(): ";
@@ -12504,24 +12584,24 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 1 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 1 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Initialize H5C2_jbrb_t structure. This call should SUCCEED. */
if ( pass2 ) {
- /* Note that the sizeof_addr & sizeof_size parameters are
+ /* Note that the sizeof_addr & sizeof_size parameters are
* ignored when human_readable is TRUE.
*/
- result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
+ result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
/* journal magic */ 123,
/* HDF5 file name */ HDF5_FILE_NAME,
- /* journal file name */ filename,
- /* Buffer size */ 4000,
- /* Number of Buffers */ 3,
- /* Use Synchronois I/O */ FALSE,
+ /* journal file name */ filename,
+ /* Buffer size */ 4000,
+ /* Number of Buffers */ 3,
+ /* Use Synchronois I/O */ FALSE,
/* human readable journal */ TRUE,
/* sizeof_addr */ 8,
/* sizeof_size */ 8);
@@ -12535,20 +12615,20 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 2 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 2 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
#if 0
/* Start transaction 2. This should FAIL because transaction 1 has
- not occurred yet. Ensure that it fails, and flag an error if it
+ not occurred yet. Ensure that it fails, and flag an error if it
does not. */
- /* transaction numbers need not be sequential, only monitonically
+ /* transaction numbers need not be sequential, only monitonically
* increasing -- thus this is not an error any more.
* -- JRM
*/
if ( pass2 ) {
- if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)2)
== SUCCEED ) {
@@ -12557,41 +12637,41 @@ check_legal_calls(void)
} /* end if */
- } /* end if */
+ } /* end if */
#endif
- if ( show_progress ) /* 3 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 3 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* End transaction 1. This should FAIL because transaction 1 has
- not started yet. Ensure that it fails, and flag an error if it
+ not started yet. Ensure that it fails, and flag an error if it
does not. */
if ( pass2 ) {
- if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)1)
== SUCCEED ) {
-
+
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__end_transaction should have failed";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 4 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 4 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Attempt to write a journal entry before transaction has started..
- This should FAIL because transaction 1 has not started yet. Ensure
+ This should FAIL because transaction 1 has not started yet. Ensure
that it fails, and flag an error if it does not. */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)1,
- /* Base Address */ (haddr_t)123456789,
- /* Length */ 16,
+ /* Base Address */ (haddr_t)123456789,
+ /* Length */ 16,
/* Body */ (const uint8_t *)"This should fail")
== SUCCEED ) {
@@ -12602,14 +12682,14 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 5 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 5 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Start transaction 1. This should SUCCEED. */
if ( pass2 ) {
- if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)1)
!= SUCCEED ) {
@@ -12620,16 +12700,16 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 6 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 6 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
- /* Attempt to start transaction 1 again. This should FAIL because
+ /* Attempt to start transaction 1 again. This should FAIL because
transaction 1 is already open. Ensure that it fails, and flag an
error if it does not. */
if ( pass2 ) {
- if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)1)
== SUCCEED ) {
@@ -12640,15 +12720,15 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 7 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 7 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
- /* Attempt to end transaction 1. This should FAIL because no
+ /* Attempt to end transaction 1. This should FAIL because no
journal entry has been written under this transaction. */
if ( pass2 ) {
- if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)1)
== SUCCEED ) {
@@ -12659,19 +12739,19 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 8 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 8 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Attempt to write a journal entry into the wrong transaction number.
- This should FAIL because specified transaction number isn't in
+ This should FAIL because specified transaction number isn't in
progress. Ensure that it fails, and flag an error if it does not. */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)2,
- /* Base Address */ (haddr_t)123456789,
- /* Length */ 16,
+ /* Base Address */ (haddr_t)123456789,
+ /* Length */ 16,
/* Body */ (const uint8_t *)"This should fail")
== SUCCEED ) {
@@ -12682,17 +12762,17 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 9 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 9 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write a journal entry during transaction 1. This should SUCCEED. */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)1,
- /* Base Address */ (haddr_t)123456789,
- /* Length */ 51,
+ /* Base Address */ (haddr_t)123456789,
+ /* Length */ 51,
/* Body */ (const uint8_t *)"This is the first transaction during transaction 1.")
!= SUCCEED ) {
@@ -12703,8 +12783,8 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 10 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 10 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Attempt to flush buffers. This should FAIL because a transaction
@@ -12712,7 +12792,7 @@ check_legal_calls(void)
if it does not. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
== SUCCEED ) {
pass2 = FALSE;
@@ -12722,14 +12802,14 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 11 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 11 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* End transaction 1. This should SUCCEED. */
if ( pass2 ) {
- if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)1)
!= SUCCEED ) {
@@ -12740,8 +12820,8 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 12 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 12 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Attempt to start transaction 1 again. This should FAIL because
@@ -12749,7 +12829,7 @@ check_legal_calls(void)
an error if it does not. */
if ( pass2 ) {
- if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)1)
== SUCCEED ) {
@@ -12760,14 +12840,14 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 13 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 13 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Start transaction 2. This should SUCCEED.*/
if ( pass2 ) {
- if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)2)
!= SUCCEED ) {
@@ -12778,17 +12858,17 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 14 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 14 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write a journal entry during transaction 2. This should SUCCEED. */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)2,
- /* Base Address */ (haddr_t)7465,
- /* Length */ 51,
+ /* Base Address */ (haddr_t)7465,
+ /* Length */ 51,
/* Body */ (const uint8_t *)"This is the first transaction during transaction 2!")
!= SUCCEED ) {
@@ -12799,47 +12879,47 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 15 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 15 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write a journal entry during transaction 2. This should SUCCEED. */
if ( pass2 ) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)2,
- /* Base Address */ (haddr_t)123456789,
- /* Length */ 60,
+ /* Base Address */ (haddr_t)123456789,
+ /* Length */ 60,
/* Body */ (const uint8_t *)"... And here's your second transaction during transaction 2.")
!= SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__journal_entry failed";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 16 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 16 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* End transaction 2. This should SUCCEED. */
if ( pass2 ) {
- if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
+ if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ &jbrb_struct,
/* Transaction # */ (uint64_t)2)
!= SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__end_transaction failed";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 17 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 17 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Attempt to truncate the journal file. This should FAIL because the
@@ -12847,7 +12927,7 @@ check_legal_calls(void)
flag and error if it does not. */
if ( pass2 ) {
- if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct)
== SUCCEED ) {
pass2 = FALSE;
@@ -12857,16 +12937,16 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 18 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 18 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
- /* Attempt to take down the ring buffer. This should FAIL because the
+ /* Attempt to take down the ring buffer. This should FAIL because the
journal buffers have not been flushed yet. Ensure that it fails, and
flag and error if it does not. */
if ( pass2 ) {
- if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
+ if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
== SUCCEED) {
pass2 = FALSE;
@@ -12876,14 +12956,14 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 19 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 19 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Flush the journal buffers. This should SUCCEED. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -12893,16 +12973,16 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 20 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 20 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
- /* Attempt to take down the ring buffer. This should FAIL because the
+ /* Attempt to take down the ring buffer. This should FAIL because the
journal file has not been truncated. Ensure that it fails, and
flag and error if it does not. */
if ( pass2 ) {
- if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
+ if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
== SUCCEED) {
pass2 = FALSE;
@@ -12912,14 +12992,14 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 21 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 21 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Truncate the journal file. This should SUCCEED. */
if ( pass2 ) {
- if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -12929,25 +13009,25 @@ check_legal_calls(void)
} /* end if */
- if ( show_progress ) /* 22 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 22 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Take down the journal file. This should SUCCEED. */
if ( pass2 ) {
- if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
+ if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__takedown failed";
-
+
} /* end if */
} /* end if */
- if ( show_progress ) /* 23 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 23 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* report pass / failure information */
@@ -12971,7 +13051,7 @@ check_legal_calls(void)
* Function: check_transaction_tracking
*
* Purpose: Verify that the ring buffer successfully tracks when
- * transactions make it to disk.
+ * transactions make it to disk.
*
* Return: void
*
@@ -12979,12 +13059,12 @@ check_legal_calls(void)
* Tuesday, February 26, 2008
*
* Changes: JRM -- 4/16/09
- * Updated for the addition of new parameters to
+ * Updated for the addition of new parameters to
* H5C2_jb__init().
- *
+ *
**************************************************************************/
-static void
-check_transaction_tracking(void)
+static void
+check_transaction_tracking(hbool_t use_aio)
{
const char * fcn_name = "check_transaction_tracking(): ";
char filename[512];
@@ -12995,7 +13075,14 @@ check_transaction_tracking(void)
int32_t checkpoint = 1;
int expected_tval[12];
- TESTING("journal file transaction tracking");
+ if ( use_aio ) {
+
+ TESTING("aio journal file transaction tracking");
+
+ } else {
+
+ TESTING("sio journal file transaction tracking");
+ }
pass2 = TRUE;
@@ -13012,8 +13099,8 @@ check_transaction_tracking(void)
} /* end if */
- if ( show_progress ) /* 1 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 1 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Give structure its magic number */
@@ -13023,7 +13110,7 @@ check_transaction_tracking(void)
* First ring buffer configuration.
* 4 Buffers, each size 250.
* Writing transactions of size 100.
- * Test cases:
+ * Test cases:
* - writing multiple transactions in each buffer
* - writing end transaction message to exact end
* of a journal buffer, as well as the exact end
@@ -13033,17 +13120,17 @@ check_transaction_tracking(void)
/* Initialize H5C2_jbrb_t structure. */
if ( pass2 ) {
- /* Note that the sizeof_addr & sizeof_size parameters are
+ /* Note that the sizeof_addr & sizeof_size parameters are
* ignored when human_readable is TRUE.
*/
- result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
+ result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
/* journal magic */ 123,
/* HDF5 file name */ HDF5_FILE_NAME,
- /* journal file name */ filename,
- /* Buffer size */ 250,
- /* Number of Buffers */ 4,
- /* Use Synchronois I/O */ FALSE,
+ /* journal file name */ filename,
+ /* Buffer size */ 250,
+ /* Number of Buffers */ 4,
+ /* Use Synchronois I/O */ use_aio,
/* human readable journal */ TRUE,
/* sizeof_addr */ 8,
/* sizeof_size */ 8);
@@ -13059,7 +13146,7 @@ check_transaction_tracking(void)
/* H5C2_jb__init() no longer generates the header message -- instead
- * it is generated by the first real journal entry. This causes
+ * it is generated by the first real journal entry. This causes
* problems in this test, so generate the header message manually
* and then flush it.
*/
@@ -13073,14 +13160,14 @@ check_transaction_tracking(void)
}
- if ( show_progress ) /* 2 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 2 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Flush the journal buffers. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -13090,8 +13177,8 @@ check_transaction_tracking(void)
} /* end if */
- if ( show_progress ) /* 3 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 3 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write journal entries and verify that the transactions that get to
@@ -13101,6 +13188,7 @@ check_transaction_tracking(void)
is also tested. */
/* set up array of expected transaction values on disk */
+ expected_tval[0] = 0;
expected_tval[1] = 0;
expected_tval[2] = 0;
expected_tval[3] = 2;
@@ -13116,20 +13204,21 @@ check_transaction_tracking(void)
the expected_tval array */
for (i = 1; i < 11; i++) {
- write_verify_trans_num(/* H5C2_jbrb_t */ &jbrb_struct,
- /* transaction num */ (uint64_t)i,
- /* expected trans */(uint64_t)expected_tval[i]);
+ write_verify_trans_num(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* transaction num */ (uint64_t)i,
+ /* min expected trans */ (uint64_t)expected_tval[i - 1],
+ /* expected trans */ (uint64_t)expected_tval[i]);
} /* end for */
- if ( show_progress ) /* 4 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 4 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Flush the journal buffers. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -13142,7 +13231,7 @@ check_transaction_tracking(void)
/* Truncate the journal file. */
if ( pass2 ) {
- if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -13155,7 +13244,7 @@ check_transaction_tracking(void)
/* Take down the journal file. */
if ( pass2 ) {
- if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
+ if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED) {
pass2 = FALSE;
@@ -13165,15 +13254,15 @@ check_transaction_tracking(void)
} /* end if */
- if ( show_progress ) /* 5 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 5 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* ===================================================
* Second ring buffer configuration
* 4 Buffers, each size 100.
* Writing transactions of size 100.
- * Test cases:
+ * Test cases:
* - end transaction messages appear on buffer
* boundaries.
* =================================================== */
@@ -13181,17 +13270,17 @@ check_transaction_tracking(void)
/* Initialize H5C2_jbrb_t structure. */
if ( pass2 ) {
- /* Note that the sizeof_addr & sizeof_size parameters are
+ /* Note that the sizeof_addr & sizeof_size parameters are
* ignored when human_readable is TRUE.
*/
- result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
+ result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
/* journal magic */ 123,
/* HDF5 file name */ HDF5_FILE_NAME,
- /* journal file name */ filename,
- /* Buffer size */ 100,
- /* Number of Buffers */ 4,
- /* Use Synchronois I/O */ FALSE,
+ /* journal file name */ filename,
+ /* Buffer size */ 100,
+ /* Number of Buffers */ 4,
+ /* Use Synchronois I/O */ FALSE,
/* human readable journal */ TRUE,
/* sizeof_addr */ 8,
/* sizeof_size */ 8);
@@ -13218,7 +13307,7 @@ check_transaction_tracking(void)
/* Flush the journal buffers. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -13228,30 +13317,31 @@ check_transaction_tracking(void)
} /* end if */
- if ( show_progress ) /* 6 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 6 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write journal entries and verify that the transactions that get to
disk are accurately reported after each write. The following tests the
- case where end transaction messages hit exactly at the end of the
+ case where end transaction messages hit exactly at the end of the
ring buffer. */
for (i=1; i<20; i++) {
- write_verify_trans_num(/* H5C2_ujbrb_t */&jbrb_struct,
- /* transaction num */(uint64_t)i,
- /* expected trans on disk */(uint64_t)i);
+ write_verify_trans_num(/* H5C2_ujbrb_t */&jbrb_struct,
+ /* transaction num */(uint64_t)i,
+ /* min expected trans on disk */ (uint64_t)(i - 1),
+ /* expected trans on disk */ (uint64_t)i);
} /* end for */
- if ( show_progress ) /* 7 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 7 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Flush the journal buffers. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -13264,7 +13354,7 @@ check_transaction_tracking(void)
/* Truncate the journal file. */
if ( pass2 ) {
- if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -13277,7 +13367,7 @@ check_transaction_tracking(void)
/* Take down the journal file. */
if ( pass2 ) {
- if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
+ if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED) {
pass2 = FALSE;
@@ -13291,29 +13381,29 @@ check_transaction_tracking(void)
* Third ring buffer configuration
* 10 Buffers, each size 30.
* Writing transactions of size 100.
- * Test cases:
+ * Test cases:
* - end transaction messages start in one buffer
* and end in the following buffer.
- * - end transaction messages start in the last
+ * - end transaction messages start in the last
* buffer and loop around to the first buffer.
- * - multiple buffers are filled between end
+ * - multiple buffers are filled between end
* transaction messages.
* =================================================== */
/* Initialize H5C2_jbrb_t structure. */
if ( pass2 ) {
- /* Note that the sizeof_addr & sizeof_size parameters are
+ /* Note that the sizeof_addr & sizeof_size parameters are
* ignored when human_readable is TRUE.
*/
- result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
+ result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
/* journal_magic */ 123,
/* HDF5 file name */ HDF5_FILE_NAME,
- /* journal file name */ filename,
- /* Buffer size */ 30,
- /* Number of Buffers */ 10,
- /* Use Synchronois I/O */ FALSE,
+ /* journal file name */ filename,
+ /* Buffer size */ 30,
+ /* Number of Buffers */ 10,
+ /* Use Synchronois I/O */ FALSE,
/* human readable journal */ TRUE,
/* sizeof_addr */ 8,
/* sizeof_size */ 8);
@@ -13338,14 +13428,14 @@ check_transaction_tracking(void)
}
- if ( show_progress ) /* 8 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 8 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Flush the journal buffers. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -13355,8 +13445,8 @@ check_transaction_tracking(void)
} /* end if */
- if ( show_progress ) /* 9 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 9 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write journal entries and verify that the transactions that get to
@@ -13364,54 +13454,66 @@ check_transaction_tracking(void)
case where end transaction messages start in one buffer and end in
another buffer. Also tests the case where one transaction ends several
buffers ahead of the next transaction end. */
- write_verify_trans_num(&jbrb_struct,
- (uint64_t)1,
+ write_verify_trans_num(&jbrb_struct,
+ (uint64_t)1,
+ (uint64_t)0,
(uint64_t)0); /* 1 in bufs, 0 on disk */
- write_verify_trans_num(&jbrb_struct,
- (uint64_t)2,
+ write_verify_trans_num(&jbrb_struct,
+ (uint64_t)2,
+ (uint64_t)0,
(uint64_t)1); /* 2 in bufs, 1 on disk */
- write_verify_trans_num(&jbrb_struct,
- (uint64_t)3,
+ write_verify_trans_num(&jbrb_struct,
+ (uint64_t)3,
+ (uint64_t)1,
(uint64_t)3); /* nothing in bufs, 3 on disk */
- H5C2_jb__write_to_buffer(&jbrb_struct, 10, "XXXXXXXXX\n", 0, (uint64_t)0);
- write_verify_trans_num(&jbrb_struct,
- (uint64_t)4,
+ H5C2_jb__write_to_buffer(&jbrb_struct, 10, "XXXXXXXXX\n", 0, (uint64_t)0);
+ write_verify_trans_num(&jbrb_struct,
+ (uint64_t)4,
+ (uint64_t)3,
(uint64_t)3); /* 1 in bufs, 0 on disk */
- write_verify_trans_num(&jbrb_struct,
- (uint64_t)5,
+ write_verify_trans_num(&jbrb_struct,
+ (uint64_t)5,
+ (uint64_t)3,
(uint64_t)5); /* 2 in bufs, 1 on disk */
- write_verify_trans_num(&jbrb_struct,
- (uint64_t)6,
+ write_verify_trans_num(&jbrb_struct,
+ (uint64_t)6,
+ (uint64_t)5,
(uint64_t)5); /* nothing in bufs, 3 on disk */
- H5C2_jb__write_to_buffer(&jbrb_struct, 10, "XXXXXXXXX\n", 0, (uint64_t)0);
- write_verify_trans_num(&jbrb_struct,
- (uint64_t)7,
+ H5C2_jb__write_to_buffer(&jbrb_struct, 10, "XXXXXXXXX\n", 0, (uint64_t)0);
+ write_verify_trans_num(&jbrb_struct,
+ (uint64_t)7,
+ (uint64_t)5,
(uint64_t)7); /* 1 in bufs, 0 on disk */
- write_verify_trans_num(&jbrb_struct,
- (uint64_t)8,
+ write_verify_trans_num(&jbrb_struct,
+ (uint64_t)8,
+ (uint64_t)7,
(uint64_t)7); /* 2 in bufs, 1 on disk */
- write_verify_trans_num(&jbrb_struct,
- (uint64_t)9,
+ write_verify_trans_num(&jbrb_struct,
+ (uint64_t)9,
+ (uint64_t)7,
(uint64_t)8); /* nothing in bufs, 3 on disk */
- H5C2_jb__write_to_buffer(&jbrb_struct, 10, "XXXXXXXXX\n", 0, (uint64_t)0);
- write_verify_trans_num(&jbrb_struct,
- (uint64_t)10,
+ H5C2_jb__write_to_buffer(&jbrb_struct, 10, "XXXXXXXXX\n", 0, (uint64_t)0);
+ write_verify_trans_num(&jbrb_struct,
+ (uint64_t)10,
+ (uint64_t)8,
(uint64_t)9); /* 1 in bufs, 0 on disk */
- write_verify_trans_num(&jbrb_struct,
- (uint64_t)11,
+ write_verify_trans_num(&jbrb_struct,
+ (uint64_t)11,
+ (uint64_t)9,
(uint64_t)10); /* 2 in bufs, 1 on disk */
- write_verify_trans_num(&jbrb_struct,
- (uint64_t)12,
+ write_verify_trans_num(&jbrb_struct,
+ (uint64_t)12,
+ (uint64_t)10,
(uint64_t)12); /* nothing in buf, 3 on disk */
- if ( show_progress ) /* 10 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 10 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Flush the journal buffers. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -13424,7 +13526,7 @@ check_transaction_tracking(void)
/* Truncate the journal file. */
if ( pass2 ) {
- if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -13437,7 +13539,7 @@ check_transaction_tracking(void)
/* Take down the journal file. */
if ( pass2 ) {
- if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
+ if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED) {
pass2 = FALSE;
@@ -13451,8 +13553,8 @@ check_transaction_tracking(void)
* Fourth ring buffer configuration
* 35 Buffers, each size 1.
* Writing transactions of size 100.
- * Test cases:
- * - end transaction messages are longer than the
+ * Test cases:
+ * - end transaction messages are longer than the
* entire ring buffer structure. note this is an
* extreme corner case situation as buffer sizes
* should generally be much larger than an end
@@ -13462,17 +13564,17 @@ check_transaction_tracking(void)
/* Initialize H5C2_jbrb_t structure. */
if ( pass2 ) {
- /* Note that the sizeof_addr & sizeof_size parameters are
+ /* Note that the sizeof_addr & sizeof_size parameters are
* ignored when human_readable is TRUE.
*/
- result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
+ result = H5C2_jb__init(/* H5C2_jbrb_t */ &jbrb_struct,
/* journal_magic */ 123,
/* HDF5 file name */ HDF5_FILE_NAME,
- /* journal file name */ filename,
- /* Buffer size */ 1,
- /* Number of Buffers */ 35,
- /* Use Synchronois I/O */ FALSE,
+ /* journal file name */ filename,
+ /* Buffer size */ 1,
+ /* Number of Buffers */ 35,
+ /* Use Synchronois I/O */ FALSE,
/* human readable journal */ TRUE,
/* sizeof_addr */ 8,
/* sizeof_size */ 8);
@@ -13500,7 +13602,7 @@ check_transaction_tracking(void)
/* Flush the journal buffers. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -13510,8 +13612,8 @@ check_transaction_tracking(void)
} /* end if */
- if ( show_progress ) /* 11 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 11 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Write journal entries and verify that the transactions that get to
@@ -13520,20 +13622,21 @@ check_transaction_tracking(void)
ensures that the trans_tracking array is properly propogated */
for (i=1; i<5; i++) {
- write_verify_trans_num(/* H5C2_jbrb_t */ &jbrb_struct,
- /* transaction num */ (uint64_t)i,
- /* expected returned trans */ (uint64_t)i);
+ write_verify_trans_num(/* H5C2_jbrb_t */ &jbrb_struct,
+ /* transaction num */ (uint64_t)i,
+ /* min expected returned trans */ (uint64_t)(i - 1),
+ /* expected returned trans */ (uint64_t)i);
} /* end for */
- if ( show_progress ) /* 12 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 12 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* Flush the journal buffers. */
if ( pass2 ) {
- if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -13546,7 +13649,7 @@ check_transaction_tracking(void)
/* Truncate the journal file. */
if ( pass2 ) {
- if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct)
+ if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED ) {
pass2 = FALSE;
@@ -13559,7 +13662,7 @@ check_transaction_tracking(void)
/* Take down the journal file. */
if ( pass2 ) {
- if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
+ if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct)
!= SUCCEED) {
pass2 = FALSE;
@@ -13569,8 +13672,8 @@ check_transaction_tracking(void)
} /* end if */
- if ( show_progress ) /* 13 */
- HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
+ if ( show_progress ) /* 13 */
+ HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name,
checkpoint++, (int)pass2);
/* report pass / failure information */
@@ -13593,37 +13696,59 @@ check_transaction_tracking(void)
/***************************************************************************
* Function: write_verify_trans_num
*
- * Purpose: Helper function for check_transaction_tracking test. Writes a
+ * Purpose: Helper function for check_transaction_tracking test. Writes a
* journal entry of length 100 into the ring buffer, provided that
- * the transaction number of the journal entry is less than 1000,
- * and then verifies that the recorded last transaction on disk is
- * as specified in verify_val.
+ * the transaction number of the journal entry is less than 1000,
+ * and then verifies that the recorded last transaction on disk is
+ * as specified in verify_val.
*
* Return: void
*
* Programmer: Mike McGreevy <mcgreevy@hdfgroup.org>
* Thursday, February 28, 2008
*
+ * Changes: Modified the function to deal with the use of asynchronous
+ * syncs. Specifically added the min_verify_val parameter,
+ * and code to detect when the journal write code is using
+ * aio and aio_fsync() to determine when transactions are on
+ * disk.
+ *
+ * When the journal write code is using aio_fsync() the
+ * inital requirement is that the last trans on disk
+ * returned fall in the closed interval [min_verify_val,
+ * verify_val]. If the reported last trans on disk is
+ * not equal to verify_val, the function must wait until
+ * all pending asynchronous syncs have completed, and
+ * query for the last trans on disk again. This time
+ * it must equal verify_val.
+ *
+ * If the journal code is not using aio_fsync(), the
+ * processing of the function is unchanged.
+ *
+ * JRM -- 2/14/10
+ *
**************************************************************************/
static void
-write_verify_trans_num(H5C2_jbrb_t * struct_ptr,
- uint64_t trans_num,
+write_verify_trans_num(H5C2_jbrb_t * struct_ptr,
+ uint64_t trans_num,
+ uint64_t min_verify_val,
uint64_t verify_val)
{
+ hbool_t verbose = FALSE;
uint64_t trans_verify;
-
+
/* Write an entire transaction. (start, journal entry, end).
* As long as the supplied transaction number is less than 1000,
* the total length of the transaction will be 100. For cases where
* the transaction number increases in number of digits, the amount
* of data in the body is reduced to account for the extra trans digits,
* so transactions remain at size 100. Note that data is converted
- * into hex, so reducing input by one character reduces journal entry
+ * into hex, so reducing input by one character reduces journal entry
* by three (two hex characters and a space).
- */
+ */
if ( pass2 ) {
-
- if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ struct_ptr,
+
+ if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ struct_ptr,
/* trans number */ trans_num)
!= SUCCEED) {
@@ -13635,10 +13760,10 @@ write_verify_trans_num(H5C2_jbrb_t * struct_ptr,
if (trans_num < 10) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ struct_ptr,
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ struct_ptr,
/* Transaction # */ trans_num,
- /* Base Address */ (haddr_t)16,
- /* Length */ 9,
+ /* Base Address */ (haddr_t)16,
+ /* Length */ 9,
/* Body */ (const uint8_t *)"XXXXXXXXX")
!= SUCCEED ) {
@@ -13651,10 +13776,10 @@ write_verify_trans_num(H5C2_jbrb_t * struct_ptr,
else if (trans_num < 100) {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ struct_ptr,
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ struct_ptr,
/* Transaction # */ trans_num,
- /* Base Address */ (haddr_t)16,
- /* Length */ 8,
+ /* Base Address */ (haddr_t)16,
+ /* Length */ 8,
/* Body */ (const uint8_t *)"XXXXXXXX")
!= SUCCEED ) {
@@ -13667,10 +13792,10 @@ write_verify_trans_num(H5C2_jbrb_t * struct_ptr,
else {
- if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ struct_ptr,
+ if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ struct_ptr,
/* Transaction # */ trans_num,
- /* Base Address */ (haddr_t)16,
- /* Length */ 7,
+ /* Base Address */ (haddr_t)16,
+ /* Length */ 7,
/* Body */ (const uint8_t *)"XXXXXXX")
!= SUCCEED ) {
@@ -13681,9 +13806,9 @@ write_verify_trans_num(H5C2_jbrb_t * struct_ptr,
} /* end else */
- if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ struct_ptr,
+ if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ struct_ptr,
/* Transaction # */ trans_num)
- != SUCCEED ) {
+ != SUCCEED ) {
pass2 = FALSE;
failure_mssg2 = "H5C2_jb__end_transaction failed";
@@ -13699,19 +13824,82 @@ write_verify_trans_num(H5C2_jbrb_t * struct_ptr,
/* H5C2_jbrb_t */ struct_ptr,
/* trans number */ &trans_verify)
!= SUCCEED ) {
-
+
pass2 = FALSE;
- failure_mssg2 = "H5C2_jb__get_last_transaction_on_disk failed";
+ failure_mssg2 = "H5C2_jb__get_last_transaction_on_disk failed(1)";
} /* end if */
- if ( trans_verify != verify_val) {
+ if ( struct_ptr->use_aio_fsync ) {
- pass2 = FALSE;
- failure_mssg2 = "H5C2_jb__get_last_transaction_on_disk returned the wrong transaction number!";
+ if ( ( trans_verify < min_verify_val ) ||
+ ( verify_val < trans_verify ) ) {
- } /* end if */
+ pass2 = FALSE;
+ failure_mssg2 = "H5C2_jb__get_last_transaction_on_disk returned initial value that is out of range.";
+ }
+
+ /* we must wait until the async writes and syncs complete
+ * before the expected value will be returned by
+ * H5C2_jb__get_last_transaction_on_disk().
+ */
+
+ if ( ( pass2 ) && ( verify_val != trans_verify ) ) {
+
+ if ( H5C2_jb_aio__await_completion_of_all_pending_writes(
+ struct_ptr) != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "H5C2_jb_aio__await_completion_of_all_pending_writes() failed.";
+ }
+ }
+
+ if ( ( pass2 ) && ( verify_val != trans_verify ) ) {
+
+ if ( H5C2_jb_aio__await_completion_of_all_async_fsyncs(
+ struct_ptr) != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "H5C2_jb_aio__await_completion_of_all_async_fsyncs() failed.";
+ }
+ }
+
+ if ( ( pass2 ) && ( verify_val != trans_verify ) ) {
+
+ if ( H5C2_jb__get_last_transaction_on_disk(
+ /* H5C2_jbrb_t */ struct_ptr,
+ /* trans number */ &trans_verify)
+ != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "H5C2_jb__get_last_transaction_on_disk failed(2)";
+
+ } /* end if */
+ } /* end if
+
+ if ( ( pass2 ) && ( trans_verify != verify_val ) ) {
+ pass2 = FALSE;
+
+ if ( verbose ) {
+
+ HDfprintf(stdout, "min/actual/max = %lld/%lld/%lld.\n",
+ (long long)min_verify_val,
+ (long long)trans_verify,
+ (long long)verify_val);
+ }
+
+ failure_mssg2 = "H5C2_jb__get_last_transaction_on_disk returned the wrong transaction number!(1)";
+
+ }
+ } else {
+ if ( trans_verify != verify_val) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "H5C2_jb__get_last_transaction_on_disk returned the wrong transaction number!(2)";
+
+ } /* end if */
+ } /* end if */
} /* end if */
return;
@@ -13756,47 +13944,92 @@ main(void)
skip_long_tests2 = FALSE;
}
+
+ /* SIO Human readable smoke checks */
+#if 1
+ mdj_smoke_check_00(TRUE, FALSE);
+#endif
+#if 1
+ mdj_smoke_check_01(TRUE, FALSE);
+#endif
+#if 1
+ mdj_smoke_check_02(TRUE, FALSE);
+#endif
+#if 1
+ mdj_api_example_test(TRUE, FALSE, 32, (16 * 1024));
+#endif
+
- /* Human readable smoke checks */
+ /* SIO Binary readable smoke checks */
#if 1
- mdj_smoke_check_00(TRUE);
+ mdj_smoke_check_00(FALSE, FALSE);
#endif
#if 1
- mdj_smoke_check_01(TRUE);
+ mdj_smoke_check_01(FALSE, FALSE);
#endif
#if 1
- mdj_smoke_check_02(TRUE);
+ mdj_smoke_check_02(FALSE, FALSE);
#endif
#if 1
- mdj_api_example_test(TRUE);
+ mdj_api_example_test(FALSE, FALSE, 32, (16 * 1024));
+#endif
+
+
+ /* AIO Human readable smoke checks */
+#if 1
+ mdj_smoke_check_00(TRUE, TRUE);
+#endif
+#if 1
+ mdj_smoke_check_01(TRUE, TRUE);
+#endif
+#if 1
+ mdj_smoke_check_02(TRUE, TRUE);
+#endif
+#if 1
+ mdj_api_example_test(TRUE, TRUE, 32, (16 * 1024));
#endif
- /* Binary readable smoke checks */
+ /* AIO Binary readable smoke checks */
#if 1
- mdj_smoke_check_00(FALSE);
+ mdj_smoke_check_00(FALSE, TRUE);
#endif
#if 1
- mdj_smoke_check_01(FALSE);
+ mdj_smoke_check_01(FALSE, TRUE);
#endif
#if 1
- mdj_smoke_check_02(FALSE);
+ mdj_smoke_check_02(FALSE, TRUE);
#endif
#if 1
- mdj_api_example_test(FALSE);
+ mdj_api_example_test(FALSE, TRUE, 32, (16 * 1024));
#endif
+
/* targeted tests */
#if 1
- check_buffer_writes();
+ check_buffer_writes(FALSE);
+#endif
+#if 1
+ check_buffer_writes(TRUE);
+#endif
+#if 1
check_legal_calls();
+#endif
+#if 1
check_message_format();
- check_transaction_tracking();
+#endif
+#if 1
+ check_transaction_tracking(FALSE);
+#endif
+#if 1
+ check_transaction_tracking(TRUE);
+#endif
+#if 1
check_binary_message_format();
#endif
#if 1
check_superblock_extensions();
-#endif
+#endif
#if 1
check_mdjsc_callbacks();
#endif
diff --git a/tools/h5recover/h5recover.c b/tools/h5recover/h5recover.c
index 40afbb6..e4a19b0 100644
--- a/tools/h5recover/h5recover.c
+++ b/tools/h5recover/h5recover.c
@@ -13,6 +13,8 @@
* access to either file, you may request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#include <aio.h>
+
#define H5F_PACKAGE /* suppress error about including H5Fpkg */
#define H5O_PACKAGE /* suppress error about including H5Opkg */
#define H5C2_PACKAGE /* suppress error about including H5C2pkg */